ETH Price: $3,490.42 (-0.02%)

Token

ROBOROVSKI (ROBO)
 

Overview

Max Total Supply

4,512 ROBO

Holders

2,914

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 ROBO
0x47ab1d1c0b285930a986b0bc301b0339e4405a70
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

An NFT project initiated by Hollywood-class enterprise SYA Concept & Caravan studio. Based on the character created by Dev Patel and Tilda Cobham-Hervey.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ROBOROVSKI

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// Dependency file: @openzeppelin/contracts/utils/Context.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

// pragma solidity ^0.8.0;

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

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


// Dependency file: @openzeppelin/contracts/access/Ownable.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Context.sol";

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

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

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

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/security/ReentrancyGuard.sol

// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

// pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


// Dependency file: @openzeppelin/contracts/token/ERC20/IERC20.sol

// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

// pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}


// Dependency file: contracts/RecoverableErc20ByOwner.sol

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

abstract contract RecoverableErc20ByOwner is Ownable {
    function recoverErc20(address tokenAddress, uint256 amount, address to) external onlyOwner {
        uint256 recoverableAmount = _getRecoverableAmount(tokenAddress);
        require(amount <= recoverableAmount, "RecoverableByOwner: RECOVERABLE_AMOUNT_NOT_ENOUGH");
        _sendErc20(tokenAddress, amount, to);
    }

    function _getRecoverableAmount(address tokenAddress) private view returns (uint256) {
        return IERC20(tokenAddress).balanceOf(address(this));
    }

    function _sendErc20(address tokenAddress, uint256 amount, address to) private {
        // bytes4(keccak256(bytes('transfer(address,uint256)')));
        (bool success, bytes memory data) = tokenAddress.call(abi.encodeWithSelector(0xa9059cbb, to, amount));
        require(success && (data.length == 0 || abi.decode(data, (bool))), "RecoverableByOwner: ERC20_TRANSFER_FAILED");
    }
}


// Dependency file: @openzeppelin/contracts/utils/Address.sol

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

// pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/utils/Strings.sol

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

// pragma solidity ^0.8.0;

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

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

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

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

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


// Dependency file: @openzeppelin/contracts/utils/introspection/IERC165.sol

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

// pragma solidity ^0.8.0;

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


// Dependency file: @openzeppelin/contracts/token/ERC721/IERC721.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";

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


// Dependency file: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

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

// pragma solidity ^0.8.0;

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


// Dependency file: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

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

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

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


// Dependency file: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";

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


// Dependency file: contracts/ProxyRegistry.sol

// pragma solidity ^0.8.0;

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}


// Dependency file: contracts/interfaces/IRoboTraitsShort.sol

// pragma solidity ^0.8.0;

interface IRoboTraitsShort {
    function contractURI() external view returns (string memory);
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// Dependency file: contracts/RoborovskiErc721.sol

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Address.sol";
// import "@openzeppelin/contracts/utils/Strings.sol";
// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/introspection/IERC165.sol";
// import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
// import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
// import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
// import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
// import "contracts/ProxyRegistry.sol";
// import "contracts/interfaces/IRoboTraitsShort.sol";

abstract contract RoborovskiErc721 is
    Ownable,
    IERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Strings for uint256;
    using Address for address;

    // Metadata
    string private _name = "ROBOROVSKI";
    string private _symbol = "ROBO";
    string private _contractURI = "https://ipfs.io/ipfs/QmXHfdENe1vLPn2g6BP7KnvnhgXGMekst3YaP49hYjXbFY";
    string private _baseURI = "";
    string private _baseExtension = ".json";
    bool private _revealed = false;
    string private _notRevealedURI = "https://ipfs.io/ipfs/QmUCSUQPJuvLbm7ymJ3BFfAc9CYMqCbBX9hoMFQQvP3iTa";
    mapping(uint256 => string) private _tokenURIs;

    // Balances
    uint256 internal constant MAX_SUPPLY = 10000;
    uint256 private _total;
    address[MAX_SUPPLY + 1] private _owners;

    // Approvals
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    // Traits
    address public TRAITS;

    // OpenSea
    address private _proxyRegistry;

    constructor(address proxyRegistry_) {
        _proxyRegistry = proxyRegistry_;
    }

    function supportsInterface(bytes4 interfaceId) external pure override returns (bool) {
        return
            interfaceId == type(IERC721Enumerable).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC165).interfaceId;
    }

    function balanceOf(address owner) public view override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint256 count = 0;
        uint256 length = _owners.length;
        for (uint256 i = 0; i < length; ++i) {
            if (owner == _owners[i]) {
                ++count;
            }
        }
        delete length;
        return count;
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    function rawOwnerOf(uint256 tokenId) public view returns (address) {
        return _owners[tokenId];
    }

    function name() public view override returns (string memory) {
        return _name;
    }

    function symbol() public view override returns (string memory) {
        return _symbol;
    }

    function contractURI() external view returns (string memory) {
        if (TRAITS != address(0))
            return IRoboTraitsShort(TRAITS).contractURI();
        return _contractURI;
    }

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

        if (!_revealed)
            return _notRevealedURI;

        if (TRAITS != address(0))
            return IRoboTraitsShort(TRAITS).tokenURI(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        if (bytes(_tokenURI).length > 0)
            return _tokenURI;

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

    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256 tokenId) {
        require(index < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        uint256 count;
        for (uint256 i; i < _owners.length; ++i) {
            if (owner == _owners[i]) {
                if (count == index)
                    return i;
                else
                    ++count;
            }
        }
        require(false, "ERC721Enumerable: owner index out of bounds");
    }

    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        require(0 < balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        uint256 tokenCount = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenCount);
        for (uint256 i = 0; i < tokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(owner, i);
        }
        return tokenIds;
    }

    function totalSupply() public view override returns (uint256) {
        return _total;
    }

    function tokenByIndex(uint256 index) public pure override returns (uint256) {
        return index;
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = 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);
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");
        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        if (_proxyRegistry != address(0) && address(ProxyRegistry(_proxyRegistry).proxies(owner)) == operator)
            return true;
        return _operatorApprovals[owner][operator];
    }

    function transferFrom(address from, address to, uint256 tokenId) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return _owners[tokenId] != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return
            spender == owner ||
            getApproved(tokenId) == spender ||
            isApprovedForAll(owner, spender);
    }

    /*function _safeMint(address to, uint256 tokenId) internal {
        _safeMint(to, tokenId, "");
    }

    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal {
        _mint(to, tokenId);
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }*/

    function _mint(address to, uint256 tokenId) internal {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");
        _owners[tokenId] = to;
        _total++;
        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal {
        address owner = ownerOf(tokenId);
        _approve(address(0), tokenId);
        _owners[tokenId] = address(0);
        _total--;

        if (bytes(_tokenURIs[tokenId]).length != 0)
            delete _tokenURIs[tokenId];

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

    function _transfer(address from, address to, uint256 tokenId) internal {
        require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _approve(address(0), tokenId);
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _setApprovalForAll(address owner, address operator, bool approved) internal {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    // Metadata
    function reveal() external onlyOwner {
        _revealed = true;
    }

    function setNotRevealedURI(string memory uri_) external onlyOwner {
        _notRevealedURI = uri_;
    }

    function setContractURI(string memory uri_) external onlyOwner {
        _contractURI = uri_;
    }

    function setBaseURI(string memory uri_) external onlyOwner {
        _baseURI = uri_;
    }

    function setBaseExtension(string memory fileExtension) external onlyOwner {
        _baseExtension = fileExtension;
    }

    function setTokenURIs(uint256[] memory ids, string[] memory uris) external onlyOwner {
        require(ids.length == uris.length, "ERC721URIStorage: parameters mismatch");
        for (uint256 i = 0; i < ids.length; i++) {
            _setTokenURI(ids[i], uris[i]);
        }
    }

    function _setTokenURI(uint256 tokenId, string memory _tokenURI) private {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    // Traits
    function setTraits(address traits_) external onlyOwner {
        TRAITS = traits_;
    }

    // OpenSea
    function unsetProxyRegistry() external onlyOwner {
        _proxyRegistry = address(0);
    }
}


// Dependency file: contracts/interfaces/IRnctShort.sol

// pragma solidity ^0.8.0;

interface IRnctShort {
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);
    function burn(uint256 amount) external;
}


// Dependency file: contracts/RoborovskiName.sol

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Context.sol";
// import "contracts/RoborovskiErc721.sol";
// import "contracts/interfaces/IRnctShort.sol";

abstract contract RoborovskiName is Context, RoborovskiErc721 {
    uint256 public constant PRICE_CHANGE_NAME = 1830 ether;
    address public immutable RNCT;

    mapping(uint256 => string) private _tokenName;
    mapping(string => bool) private _nameReserved;

    event NameChange(uint256 indexed tokenId, string newName);

    constructor(address rnct_) {
        RNCT = rnct_;
    }

    function burn(uint256 tokenId) external {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved");
        _burn(tokenId);

        // If already named, dereserve and remove name
        if (bytes(_tokenName[tokenId]).length != 0) {
            _toggleReserveName(_tokenName[tokenId], false);
            delete _tokenName[tokenId];
            emit NameChange(tokenId, "");
        }
    }

    function tokenName(uint256 tokenId) external view returns (string memory) {
        return _tokenName[tokenId];
    }

    function isNameReserved(string memory nameString) public view returns (bool) {
        return _nameReserved[toLower(nameString)];
    }

    function changeName(uint256 tokenId, string memory newName) external {
        address owner = ownerOf(tokenId);
        require(_msgSender() == owner, "ROBOROVSKI: caller is not the token owner");
        require(validateName(newName) == true, "ROBOROVSKI: not a valid new name");
        require(sha256(bytes(newName)) != sha256(bytes(_tokenName[tokenId])), "ROBOROVSKI: new name is same as the current one");
        require(isNameReserved(newName) == false, "ROBOROVSKI: name already reserved");
        require(IRnctShort(RNCT).transferFrom(_msgSender(), address(this), PRICE_CHANGE_NAME), "ROBOROVSKI: ERC20_TRANSFER_FAILED");
        IRnctShort(RNCT).burn(PRICE_CHANGE_NAME);

        // If already named, dereserve old name
        if (bytes(_tokenName[tokenId]).length > 0) {
            _toggleReserveName(_tokenName[tokenId], false);
        }
        _toggleReserveName(newName, true);
        _tokenName[tokenId] = newName;
        emit NameChange(tokenId, newName);
    }

    // Reserves the name if isReserve is set to true, de-reserves if set to false
    function _toggleReserveName(string memory str, bool isReserve) private {
        _nameReserved[toLower(str)] = isReserve;
    }

    // Check if the name string is valid (Alphanumeric and spaces without leading or trailing space)
    function validateName(string memory str) public pure returns (bool) {
        bytes memory b = bytes(str);
        if (b.length < 1)
            return false;
        // Cannot be longer than 25 characters
        if (b.length > 25)
            return false;
        // Leading space
        if (b[0] == 0x20)
            return false;
        // Trailing space
        if (b[b.length - 1] == 0x20)
            return false;

        bytes1 lastChar = b[0];

        for (uint256 i; i < b.length; i++) {
            bytes1 char = b[i];
            // Cannot contain continous spaces
            if (char == 0x20 && lastChar == 0x20)
                return false;
            if (
                !(char >= 0x30 && char <= 0x39) && //9-0
                !(char >= 0x41 && char <= 0x5A) && //A-Z
                !(char >= 0x61 && char <= 0x7A) && //a-z
                !(char == 0x20) //space
            )
                return false;
            lastChar = char;
        }
        return true;
    }

    // Converts the string to lowercase
    function toLower(string memory str) public pure returns (string memory) {
        bytes memory bStr = bytes(str);
        bytes memory bLower = new bytes(bStr.length);
        for (uint256 i = 0; i < bStr.length; i++) {
            // Uppercase character
            if ((uint8(bStr[i]) >= 65) && (uint8(bStr[i]) <= 90))
                bLower[i] = bytes1(uint8(bStr[i]) + 32);
            else
                bLower[i] = bStr[i];
        }
        return string(bLower);
    }
}


// Dependency file: contracts/RoborovskiProvenance.sol

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/access/Ownable.sol";

abstract contract RoborovskiProvenance is Ownable {
    string public PROVENANCE = "";

    function setProvenance(string memory provenance_) external onlyOwner {
        require(bytes(PROVENANCE).length == 0, "ROBOROVSKI: provenance is already set");
        PROVENANCE = provenance_;
    }
}


// Dependency file: contracts/RoborovskiRandom.sol

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Context.sol";
// import "contracts/RoborovskiErc721.sol";

abstract contract RoborovskiRandom is Context, RoborovskiErc721 {
    uint256[MAX_SUPPLY] internal _indices;
    uint256 private _randomNonce;

    function _internalMint(address account) internal returns (uint256 tokenId) {
        tokenId = _randomIndex();
        _mint(account, tokenId);
    }

    function _randomIndex() private returns (uint256) {
        uint256 totalSize = MAX_SUPPLY - totalSupply();
        uint256 index = uint256(
            keccak256(abi.encodePacked(_randomNonce++, _msgSender(), block.difficulty, block.timestamp))
        ) % totalSize;

        uint256 value = 0;
        if (_indices[index] != 0)
            value = _indices[index];
        else
            value = index;

        // Move last value to selected position
        if (_indices[totalSize - 1] == 0)
            // Array position not initialized, so use position
            _indices[index] = totalSize - 1;
        else
            // Array position holds a value so use that
            _indices[index] = _indices[totalSize - 1];

        return value + 1;
    }
}


// Dependency file: @openzeppelin/contracts/utils/cryptography/ECDSA.sol

// OpenZeppelin Contracts v4.4.0 (utils/cryptography/ECDSA.sol)

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/utils/Strings.sol";

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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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


// Dependency file: contracts/RoborovskiSignature.sol

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";

abstract contract RoborovskiSignature is Ownable {
    address private _signer;
    mapping(uint256 => bool) private _signatureUsed;

    constructor() {
        _signer = _msgSender();
    }

    function setSigner(address newSigner) external onlyOwner {
        _signer = newSigner;
    }

    function _checkSignature(address wallet, uint256 count, uint256 signId, bytes memory signature) internal {
        require(!_signatureUsed[signId] && _signatureWallet(wallet, count, signId, signature) == _signer, "ROBOROVSKI: not authorized to mint");
        _signatureUsed[signId] = true;
    }

    function _signatureWallet(address wallet, uint256 count, uint256 signId, bytes memory signature) private pure returns (address) {
        return ECDSA.recover( keccak256(abi.encode(wallet, count, signId)), signature);
    }
}


// Dependency file: contracts/RoborovskiTeam.sol

// pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/access/Ownable.sol";

abstract contract RoborovskiTeam is Ownable {
    address[] private _team = [
        0xA28F5fD46DC3C9b4399492fF81827983F2555600,
        0xBd0AD46710D75Fb936F01aA5DBEA6Eeb8845C1d0
    ];

    event Withdrawed(address indexed recipient, uint256 amount);

    function withdraw(uint256 amount) external onlyOwner {
        if (amount > address(this).balance)
            amount = address(this).balance;
        uint256 share = (amount * 50) / 100;
        _widthdraw(_team[0], share);
        _widthdraw(_team[1], amount - share);
    }

    function _widthdraw(address recipient, uint256 amount) private {
        (bool success, ) = recipient.call{value: amount}("");
        require(success, "ROBOROVSKI: ETH_TRANSFER_FAILED");
        emit Withdrawed(recipient, amount);
    }
}


// Root file: contracts/ROBOROVSKI.sol

pragma solidity ^0.8.0;

// import "@openzeppelin/contracts/access/Ownable.sol";
// import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
// import "contracts/RecoverableErc20ByOwner.sol";
// import "contracts/RoborovskiErc721.sol";
// import "contracts/RoborovskiName.sol";
// import "contracts/RoborovskiProvenance.sol";
// import "contracts/RoborovskiRandom.sol";
// import "contracts/RoborovskiSignature.sol";
// import "contracts/RoborovskiTeam.sol";

contract ROBOROVSKI is
    Ownable,
    ReentrancyGuard,
    RecoverableErc20ByOwner,
    RoborovskiErc721,
    RoborovskiName,
    RoborovskiProvenance,
    RoborovskiRandom,
    RoborovskiSignature,
    RoborovskiTeam
{
    // Time
    uint256 private constant TIMESTAMP_PRESALE = 1645279170;
    uint256 private constant TIMESTAMP_RAFFLE = 1645322400;
    uint256 private constant TIMESTAMP_SALE = 1645344000;

    // Price
    uint256 private constant PRICE = 0.165 ether;

    // Mint
    uint256 private constant LIMIT = 1;
    uint256 private constant LIMIT_SALE = 2;
    mapping(uint256 => mapping(address => uint256)) public mintedOf;
    bool private _paused = false;

    // Bonus
    bool[MAX_SUPPLY + 1] public isMintedBeforeSale;

    constructor(address rnct_, address proxyRegistry_)
        RoborovskiErc721(proxyRegistry_)
        RoborovskiName(rnct_)
    {
        // For offline auction
        _indices[0] = MAX_SUPPLY - 1;
        _mint(0x5AF3F92c0725D54565014b5EA0d5f15A685d1a2a, 1);
        isMintedBeforeSale[1] = true;
        _indices[1] = MAX_SUPPLY - 2;
        _mint(0x5AF3F92c0725D54565014b5EA0d5f15A685d1a2a, 2);
        isMintedBeforeSale[2] = true;
    }

    function mintAirdrop(address[] memory accounts) external onlyOwner {
        for (uint256 i = 0; i < accounts.length; i++) {
            isMintedBeforeSale[_internalMint(accounts[i])] = true;
        }
    }

    function mintPresale(uint256 count, uint256 signId, bytes memory signature) external payable nonReentrant {
        require(block.timestamp >= TIMESTAMP_PRESALE && block.timestamp < TIMESTAMP_RAFFLE, "ROBOROVSKI: presale not open");
        _checkSignature(_msgSender(), count, signId, signature);
        _checkCount(0, _msgSender(), count, LIMIT, count * PRICE);
        for (uint256 i = 0; i < count; i++) {
            isMintedBeforeSale[_internalMint(_msgSender())] = true;
        }
    }

    function mintRaffle(uint256 count, uint256 signId, bytes memory signature) external payable nonReentrant {
        require(block.timestamp >= TIMESTAMP_RAFFLE && block.timestamp < TIMESTAMP_SALE, "ROBOROVSKI: raffle not open");
        _checkSignature(_msgSender(), count, signId, signature);
        _checkCount(1, _msgSender(), count, LIMIT, count * PRICE);
        for (uint256 i = 0; i < count; i++) {
            isMintedBeforeSale[_internalMint(_msgSender())] = true;
        }
    }

    function mint(uint256 count, uint256 signId, bytes memory signature) external payable nonReentrant {
        require(block.timestamp >= TIMESTAMP_SALE, "ROBOROVSKI: sale not open");
        _checkSignature(_msgSender(), count, signId, signature);
        _checkCount(2, _msgSender(), count, LIMIT_SALE, count * PRICE);
        for (uint256 i = 0; i < count; i++) {
            _internalMint(_msgSender());
        }
    }

    function _checkCount(uint256 stage, address wallet, uint256 count, uint256 limit, uint256 purchaseAmount) private {
        require(mintedOf[stage][wallet] + count <= limit, "ROBOROVSKI: address limit");
        require(msg.value >= purchaseAmount, "ROBOROVSKI: value below purchase amount");
        mintedOf[stage][wallet] += count;
    }

    function setPause(bool paused_) external onlyOwner {
        _paused = paused_;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"rnct_","type":"address"},{"internalType":"address","name":"proxyRegistry_","type":"address"}],"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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"newName","type":"string"}],"name":"NameChange","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawed","type":"event"},{"inputs":[],"name":"PRICE_CHANGE_NAME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RNCT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TRAITS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"newName","type":"string"}],"name":"changeName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"","type":"uint256"}],"name":"isMintedBeforeSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"nameString","type":"string"}],"name":"isNameReserved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"signId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"mintAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"signId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"},{"internalType":"uint256","name":"signId","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"mintRaffle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"mintedOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"rawOwnerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"recoverErc20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"fileExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"paused_","type":"bool"}],"name":"setPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenance_","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"string[]","name":"uris","type":"string[]"}],"name":"setTokenURIs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"traits_","type":"address"}],"name":"setTraits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"toLower","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unsetProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"str","type":"string"}],"name":"validateName","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60e0604052600a60a081905269524f424f524f56534b4960b01b60c09081526200002d91600291906200046b565b5060408051808201909152600480825263524f424f60e01b60209092019182526200005b916003916200046b565b5060405180608001604052806043815260200162004c7c6043913980516200008c916004916020909101906200046b565b50604080516020810191829052600090819052620000ad916005916200046b565b5060408051808201909152600580825264173539b7b760d91b6020909201918252620000dc916006916200046b565b506007805460ff191690556040805160808101909152604380825262004cbf6020830139805162000116916008916020909101906200046b565b506040805160208101918290526000908190526200013891612722916200046b565b506040805180820190915273a28f5fd46dc3c9b4399492ff81827983f2555600815273bd0ad46710d75fb936f01aa5dbea6eeb8845c1d060208201526200018590614e36906002620004fa565b50614e38805460ff191690553480156200019e57600080fd5b5060405162004d0238038062004d02833981016040819052620001c19162000586565b8181620001ce33620002ae565b6001805561271f80546001600160a01b0319166001600160a01b0392831617905516608052620001fb3390565b614e3480546001600160a01b0319166001600160a01b03929092169190911790556200022b6001612710620005d4565b6127235562000250735af3f92c0725d54565014b5ea0d5f15a685d1a2a6001620002fe565b614e39805461ff0019166101001790556200026f6002612710620005d4565b6127245562000294735af3f92c0725d54565014b5ea0d5f15a685d1a2a6002620002fe565b5050614e39805462ff00001916620100001790556200065f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b0382166200035a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064015b60405180910390fd5b62000365816200043e565b15620003b45760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000351565b81600b826127118110620003cc57620003cc620005ee565b0180546001600160a01b0319166001600160a01b0392909216919091179055600a8054906000620003fd8362000604565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080600b836127118110620004585762000458620005ee565b01546001600160a01b0316141592915050565b828054620004799062000622565b90600052602060002090601f0160209004810192826200049d5760008555620004e8565b82601f10620004b857805160ff1916838001178555620004e8565b82800160010185558215620004e8579182015b82811115620004e8578251825591602001919060010190620004cb565b50620004f692915062000552565b5090565b828054828255906000526020600020908101928215620004e8579160200282015b82811115620004e857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200051b565b5b80821115620004f6576000815560010162000553565b80516001600160a01b03811681146200058157600080fd5b919050565b600080604083850312156200059a57600080fd5b620005a58362000569565b9150620005b56020840162000569565b90509250929050565b634e487b7160e01b600052601160045260246000fd5b600082821015620005e957620005e9620005be565b500390565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200061b576200061b620005be565b5060010190565b600181811c908216806200063757607f821691505b602082108114156200065957634e487b7160e01b600052602260045260246000fd5b50919050565b6080516145f362000689600039600081816108c201528181611dbe0152611ed701526145f36000f3fe6080604052600436106102e45760003560e01c80638462151c11610190578063c5953170116100dc578063e8a3d48511610095578063ea78552e1161006f578063ea78552e146108b0578063f2c4ce1e146108e4578063f2fde38b14610904578063ffe630b51461092457600080fd5b8063e8a3d4851461085a578063e97382bd1461086f578063e985e9c51461089057600080fd5b8063c5953170146107a5578063c87b56dd146107c5578063d367c52d146107e5578063da3ef23f146107fa578063db3e4c841461081a578063e725f8771461083a57600080fd5b8063a12120c811610149578063b88d4fde11610123578063b88d4fde14610732578063bc6cb08014610752578063bedb86fb14610765578063c39cbef11461078557600080fd5b8063a12120c8146106dd578063a22cb465146106fd578063a475b5dd1461071d57600080fd5b80638462151c1461061d5780638da5cb5b1461064a578063938e3d7b146106685780639416b4231461068857806395d89b41146106a85780639ffdb65a146106bd57600080fd5b806342842e0e1161024f57806364335ace1161020857806370a08231116101e257806370a08231146105a8578063715018a6146105c85780637f81be69146105dd578063819bea4b146105fd57600080fd5b806364335ace1461052f5780636c19e783146105685780636f4f73661461058857600080fd5b806342842e0e1461047c57806342966c681461049c5780634f6ccce7146104bc57806355f804b3146104da5780636352211e146104fa5780636373a6b11461051a57600080fd5b806315b56d10116102a157806315b56d10146103c057806318160ddd146103e05780632074a66e146103ff57806323b872dd1461041c5780632e1a7d4d1461043c5780632f745c591461045c57600080fd5b806301ffc9a7146102e95780630336fc171461031e57806306fdde0314610333578063081812fc1461035557806308dc9f421461038d578063095ea7b3146103a0575b600080fd5b3480156102f557600080fd5b50610309610304366004613a91565b610944565b60405190151581526020015b60405180910390f35b61033161032c366004613b78565b6109b1565b005b34801561033f57600080fd5b50610348610ad9565b6040516103159190613c1f565b34801561036157600080fd5b50610375610370366004613c32565b610b6b565b6040516001600160a01b039091168152602001610315565b61033161039b366004613b78565b610bf4565b3480156103ac57600080fd5b506103316103bb366004613c60565b610cbb565b3480156103cc57600080fd5b506103096103db366004613c8c565b610dd1565b3480156103ec57600080fd5b50600a545b604051908152602001610315565b34801561040b57600080fd5b506103f16863345a083e94d8000081565b34801561042857600080fd5b50610331610437366004613cc0565b610e05565b34801561044857600080fd5b50610331610457366004613c32565b610e37565b34801561046857600080fd5b506103f1610477366004613c60565b610efa565b34801561048857600080fd5b50610331610497366004613cc0565b610fa0565b3480156104a857600080fd5b506103316104b7366004613c32565b610fbb565b3480156104c857600080fd5b506103f16104d7366004613c32565b90565b3480156104e657600080fd5b506103316104f5366004613c8c565b611155565b34801561050657600080fd5b50610375610515366004613c32565b611192565b34801561052657600080fd5b50610348611215565b34801561053b57600080fd5b506103f161054a366004613d01565b614e3760209081526000928352604080842090915290825290205481565b34801561057457600080fd5b50610331610583366004613d31565b6112a4565b34801561059457600080fd5b506103316105a3366004613d31565b6112f1565b3480156105b457600080fd5b506103f16105c3366004613d31565b61133e565b3480156105d457600080fd5b50610331611406565b3480156105e957600080fd5b506103756105f8366004613c32565b61143c565b34801561060957600080fd5b50610331610618366004613d4e565b611463565b34801561062957600080fd5b5061063d610638366004613d31565b611515565b6040516103159190613d90565b34801561065657600080fd5b506000546001600160a01b0316610375565b34801561067457600080fd5b50610331610683366004613c8c565b6115de565b34801561069457600080fd5b506103486106a3366004613c8c565b61161b565b3480156106b457600080fd5b50610348611775565b3480156106c957600080fd5b506103096106d8366004613c8c565b611784565b3480156106e957600080fd5b506103096106f8366004613c32565b611993565b34801561070957600080fd5b50610331610718366004613de2565b6119bf565b34801561072957600080fd5b506103316119ca565b34801561073e57600080fd5b5061033161074d366004613e10565b611a03565b610331610760366004613b78565b611a35565b34801561077157600080fd5b50610331610780366004613e7b565b611b30565b34801561079157600080fd5b506103316107a0366004613e98565b611b6e565b3480156107b157600080fd5b506103316107c0366004613f01565b611fe8565b3480156107d157600080fd5b506103486107e0366004613c32565b612088565b3480156107f157600080fd5b506103316122f6565b34801561080657600080fd5b50610331610815366004613c8c565b612333565b34801561082657600080fd5b50610331610835366004614024565b612370565b34801561084657600080fd5b50610348610855366004613c32565b612453565b34801561086657600080fd5b50610348612471565b34801561087b57600080fd5b5061271e54610375906001600160a01b031681565b34801561089c57600080fd5b506103096108ab3660046140d2565b612514565b3480156108bc57600080fd5b506103757f000000000000000000000000000000000000000000000000000000000000000081565b3480156108f057600080fd5b506103316108ff366004613c8c565b6125e6565b34801561091057600080fd5b5061033161091f366004613d31565b612623565b34801561093057600080fd5b5061033161093f366004613c8c565b6126bb565b60006001600160e01b0319821663780e9d6360e01b148061097557506001600160e01b03198216635b5e139f60e01b145b8061099057506001600160e01b031982166380ac58cd60e01b145b806109ab57506001600160e01b031982166301ffc9a760e01b145b92915050565b600260015414156109dd5760405162461bcd60e51b81526004016109d490614100565b60405180910390fd5b6002600155636211a0a042108015906109f95750636211f50042105b610a455760405162461bcd60e51b815260206004820152601b60248201527f524f424f524f56534b493a20726166666c65206e6f74206f70656e000000000060448201526064016109d4565b610a52335b848484612764565b610a736001335b856001610a6e67024a32a033f080008361414d565b612819565b60005b83811015610acf576001614e39610a8c33612937565b6127118110610a9d57610a9d61416c565b602091828204019190066101000a81548160ff0219169083151502179055508080610ac790614182565b915050610a76565b5050600180555050565b606060028054610ae89061419d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b149061419d565b8015610b615780601f10610b3657610100808354040283529160200191610b61565b820191906000526020600020905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b6000610b7682612952565b610bd75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d4565b50600090815261271c60205260409020546001600160a01b031690565b60026001541415610c175760405162461bcd60e51b81526004016109d490614100565b6002600155636211f500421015610c705760405162461bcd60e51b815260206004820152601960248201527f524f424f524f56534b493a2073616c65206e6f74206f70656e0000000000000060448201526064016109d4565b610c7933610a4a565b610c94600233856002610a6e67024a32a033f080008361414d565b60005b83811015610acf57610ca833612937565b5080610cb381614182565b915050610c97565b6000610cc682611192565b9050806001600160a01b0316836001600160a01b03161415610d345760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d4565b336001600160a01b0382161480610d505750610d508133612514565b610dc25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d4565b610dcc838361297c565b505050565b6000612721610ddf8361161b565b604051610dec91906141d8565b9081526040519081900360200190205460ff1692915050565b610e10335b826129eb565b610e2c5760405162461bcd60e51b81526004016109d4906141f4565b610dcc838383612ab5565b6000546001600160a01b03163314610e615760405162461bcd60e51b81526004016109d490614245565b47811115610e6c5750475b60006064610e7b83603261414d565b610e859190614290565b9050610eba614e36600081548110610e9f57610e9f61416c565b6000918252602090912001546001600160a01b031682612c05565b610ef6614e36600181548110610ed257610ed261416c565b6000918252602090912001546001600160a01b0316610ef183856142a4565b612c05565b5050565b6000610f058361133e565b8210610f235760405162461bcd60e51b81526004016109d4906142bb565b6000805b612711811015610f8757600b816127118110610f4557610f4561416c565b01546001600160a01b0386811691161415610f775783821415610f6b5791506109ab9050565b610f7482614182565b91505b610f8081614182565b9050610f27565b5060405162461bcd60e51b81526004016109d4906142bb565b610dcc83838360405180602001604052806000815250611a03565b610fc433610e0a565b6110295760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b60648201526084016109d4565b61103281612ce3565b600081815261272060205260409020805461104c9061419d565b1590506111525760008181526127206020526040902080546110f791906110729061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461109e9061419d565b80156110eb5780601f106110c0576101008083540402835291602001916110eb565b820191906000526020600020905b8154815290600101906020018083116110ce57829003601f168201915b50505050506000612db8565b60008181526127206020526040812061110f916139a8565b807f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b60405161114990602080825260009082015260400190565b60405180910390a25b50565b6000546001600160a01b0316331461117f5760405162461bcd60e51b81526004016109d490614245565b8051610ef69060059060208401906139e2565b600080600b8361271181106111a9576111a961416c565b01546001600160a01b03169050806109ab5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d4565b61272280546112239061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461124f9061419d565b801561129c5780601f106112715761010080835404028352916020019161129c565b820191906000526020600020905b81548152906001019060200180831161127f57829003601f168201915b505050505081565b6000546001600160a01b031633146112ce5760405162461bcd60e51b81526004016109d490614245565b614e3480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461131b5760405162461bcd60e51b81526004016109d490614245565b61271e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166113a95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d4565b6000612711815b818110156113fd57600b8161271181106113cc576113cc61416c565b01546001600160a01b03868116911614156113ed576113ea83614182565b92505b6113f681614182565b90506113b0565b50909392505050565b6000546001600160a01b031633146114305760405162461bcd60e51b81526004016109d490614245565b61143a6000612df6565b565b6000600b8261271181106114525761145261416c565b01546001600160a01b031692915050565b6000546001600160a01b0316331461148d5760405162461bcd60e51b81526004016109d490614245565b600061149884612e46565b9050808311156115045760405162461bcd60e51b815260206004820152603160248201527f5265636f76657261626c6542794f776e65723a205245434f56455241424c455f6044820152700829a9eaa9ca8be9c9ea8be8a9c9eaa8e9607b1b60648201526084016109d4565b61150f848484612eb1565b50505050565b60606115208261133e565b60001061153f5760405162461bcd60e51b81526004016109d4906142bb565b600061154a8361133e565b90506000816001600160401b0381111561156657611566613ab5565b60405190808252806020026020018201604052801561158f578160200160208202803683370190505b50905060005b828110156115d6576115a78582610efa565b8282815181106115b9576115b961416c565b6020908102919091010152806115ce81614182565b915050611595565b509392505050565b6000546001600160a01b031633146116085760405162461bcd60e51b81526004016109d490614245565b8051610ef69060049060208401906139e2565b60606000829050600081516001600160401b0381111561163d5761163d613ab5565b6040519080825280601f01601f191660200182016040528015611667576020820181803683370190505b50905060005b82518110156115d657604183828151811061168a5761168a61416c565b016020015160f81c108015906116ba5750605a8382815181106116af576116af61416c565b016020015160f81c11155b1561171c578281815181106116d1576116d161416c565b602001015160f81c60f81b60f81c60206116eb9190614306565b60f81b8282815181106117005761170061416c565b60200101906001600160f81b031916908160001a905350611763565b82818151811061172e5761172e61416c565b602001015160f81c60f81b82828151811061174b5761174b61416c565b60200101906001600160f81b031916908160001a9053505b8061176d81614182565b91505061166d565b606060038054610ae89061419d565b60008082905060018151101561179d5750600092915050565b6019815111156117b05750600092915050565b806000815181106117c3576117c361416c565b6020910101516001600160f81b031916600160fd1b14156117e75750600092915050565b80600182516117f691906142a4565b815181106118065761180661416c565b6020910101516001600160f81b031916600160fd1b141561182a5750600092915050565b60008160008151811061183f5761183f61416c565b01602001516001600160f81b031916905060005b82518110156119885760008382815181106118705761187061416c565b01602001516001600160f81b0319169050600160fd1b811480156118a15750600160fd1b6001600160f81b03198416145b156118b25750600095945050505050565b600360fc1b6001600160f81b03198216108015906118de5750603960f81b6001600160f81b0319821611155b1580156119145750604160f81b6001600160f81b03198216108015906119125750602d60f91b6001600160f81b0319821611155b155b80156119495750606160f81b6001600160f81b03198216108015906119475750603d60f91b6001600160f81b0319821611155b155b80156119635750600160fd1b6001600160f81b0319821614155b156119745750600095945050505050565b91508061198081614182565b915050611853565b506001949350505050565b614e398161271181106119a557600080fd5b60209182820401919006915054906101000a900460ff1681565b610ef6338383612fde565b6000546001600160a01b031633146119f45760405162461bcd60e51b81526004016109d490614245565b6007805460ff19166001179055565b611a0d33836129eb565b611a295760405162461bcd60e51b81526004016109d4906141f4565b61150f848484846130ae565b60026001541415611a585760405162461bcd60e51b81526004016109d490614100565b6002600155636210f7c24210801590611a745750636211a0a042105b611ac05760405162461bcd60e51b815260206004820152601c60248201527f524f424f524f56534b493a2070726573616c65206e6f74206f70656e0000000060448201526064016109d4565b611ac933610a4a565b611ad4600033610a59565b60005b83811015610acf576001614e39611aed33612937565b6127118110611afe57611afe61416c565b602091828204019190066101000a81548160ff0219169083151502179055508080611b2890614182565b915050611ad7565b6000546001600160a01b03163314611b5a5760405162461bcd60e51b81526004016109d490614245565b614e38805460ff1916911515919091179055565b6000611b7983611192565b9050336001600160a01b03821614611be55760405162461bcd60e51b815260206004820152602960248201527f524f424f524f56534b493a2063616c6c6572206973206e6f742074686520746f60448201526835b2b71037bbb732b960b91b60648201526084016109d4565b611bee82611784565b1515600114611c3f5760405162461bcd60e51b815260206004820181905260248201527f524f424f524f56534b493a206e6f7420612076616c6964206e6577206e616d6560448201526064016109d4565b60008381526127206020526040908190209051600291611c5e916143c4565b602060405180830381855afa158015611c7b573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c9e91906143d0565b600283604051611cae91906141d8565b602060405180830381855afa158015611ccb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611cee91906143d0565b1415611d545760405162461bcd60e51b815260206004820152602f60248201527f524f424f524f56534b493a206e6577206e616d652069732073616d652061732060448201526e7468652063757272656e74206f6e6560881b60648201526084016109d4565b611d5d82610dd1565b15611db45760405162461bcd60e51b815260206004820152602160248201527f524f424f524f56534b493a206e616d6520616c726561647920726573657276656044820152601960fa1b60648201526084016109d4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526863345a083e94d8000060448201526064016020604051808303816000875af1158015611e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6391906143e9565b611eb95760405162461bcd60e51b815260206004820152602160248201527f524f424f524f56534b493a2045524332305f5452414e534645525f4641494c456044820152601160fa1b60648201526084016109d4565b604051630852cd8d60e31b81526863345a083e94d8000060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906342966c6890602401600060405180830381600087803b158015611f2357600080fd5b505af1158015611f37573d6000803e3d6000fd5b505050600084815261272060205260408120805491925090611f589061419d565b90501115611f7f576000838152612720602052604090208054611f7f91906110729061419d565b611f8a826001612db8565b6000838152612720602090815260409091208351611faa928501906139e2565b50827f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b83604051611fdb9190613c1f565b60405180910390a2505050565b6000546001600160a01b031633146120125760405162461bcd60e51b81526004016109d490614245565b60005b8151811015610ef6576001614e396120458484815181106120385761203861416c565b6020026020010151612937565b61271181106120565761205661416c565b602091828204019190066101000a81548160ff021916908315150217905550808061208090614182565b915050612015565b606061209382612952565b6120f75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d4565b60075460ff16612193576008805461210e9061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461213a9061419d565b80156121875780601f1061215c57610100808354040283529160200191612187565b820191906000526020600020905b81548152906001019060200180831161216a57829003601f168201915b50505050509050919050565b61271e546001600160a01b0316156122175761271e5460405163c87b56dd60e01b8152600481018490526001600160a01b039091169063c87b56dd90602401600060405180830381865afa1580156121ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109ab9190810190614406565b600082815260096020526040812080546122309061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461225c9061419d565b80156122a95780601f1061227e576101008083540402835291602001916122a9565b820191906000526020600020905b81548152906001019060200180831161228c57829003601f168201915b505050505090506000815111156122c05792915050565b60056122cb846130e1565b60066040516020016122df93929190614473565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146123205760405162461bcd60e51b81526004016109d490614245565b61271f80546001600160a01b0319169055565b6000546001600160a01b0316331461235d5760405162461bcd60e51b81526004016109d490614245565b8051610ef69060069060208401906139e2565b6000546001600160a01b0316331461239a5760405162461bcd60e51b81526004016109d490614245565b80518251146123f95760405162461bcd60e51b815260206004820152602560248201527f45524337323155524953746f726167653a20706172616d6574657273206d69736044820152640dac2e8c6d60db1b60648201526084016109d4565b60005b8251811015610dcc5761244183828151811061241a5761241a61416c565b60200260200101518383815181106124345761243461416c565b60200260200101516131de565b8061244b81614182565b9150506123fc565b60008181526127206020526040902080546060919061210e9061419d565b61271e546060906001600160a01b0316156125075761271e60009054906101000a90046001600160a01b03166001600160a01b031663e8a3d4856040518163ffffffff1660e01b8152600401600060405180830381865afa1580156124da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125029190810190614406565b905090565b60048054610ae89061419d565b61271f546000906001600160a01b0316158015906125a9575061271f5460405163c455279160e01b81526001600160a01b03858116600483015284811692169063c455279190602401602060405180830381865afa15801561257a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259e919061449b565b6001600160a01b0316145b156125b6575060016109ab565b506001600160a01b03918216600090815261271d6020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146126105760405162461bcd60e51b81526004016109d490614245565b8051610ef69060089060208401906139e2565b6000546001600160a01b0316331461264d5760405162461bcd60e51b81526004016109d490614245565b6001600160a01b0381166126b25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d4565b61115281612df6565b6000546001600160a01b031633146126e55760405162461bcd60e51b81526004016109d490614245565b61272280546126f39061419d565b1590506127505760405162461bcd60e51b815260206004820152602560248201527f524f424f524f56534b493a2070726f76656e616e636520697320616c726561646044820152641e481cd95d60da1b60648201526084016109d4565b8051610ef6906127229060208401906139e2565b6000828152614e35602052604090205460ff161580156127a35750614e34546001600160a01b031661279885858585613269565b6001600160a01b0316145b6127fa5760405162461bcd60e51b815260206004820152602260248201527f524f424f524f56534b493a206e6f7420617574686f72697a656420746f206d696044820152611b9d60f21b60648201526084016109d4565b506000908152614e3560205260409020805460ff191660011790555050565b6000858152614e37602090815260408083206001600160a01b0388168452909152902054829061284a9085906144b8565b11156128985760405162461bcd60e51b815260206004820152601960248201527f524f424f524f56534b493a2061646472657373206c696d69740000000000000060448201526064016109d4565b803410156128f85760405162461bcd60e51b815260206004820152602760248201527f524f424f524f56534b493a2076616c75652062656c6f7720707572636861736560448201526608185b5bdd5b9d60ca1b60648201526084016109d4565b6000858152614e37602090815260408083206001600160a01b03881684529091528120805485929061292b9084906144b8565b90915550505050505050565b60006129416132b8565b905061294d8282613419565b919050565b600080600b8361271181106129695761296961416c565b01546001600160a01b0316141592915050565b600081815261271c6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129b282611192565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f682612952565b612a575760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d4565b6000612a6283611192565b9050806001600160a01b0316846001600160a01b03161480612a9d5750836001600160a01b0316612a9284610b6b565b6001600160a01b0316145b80612aad5750612aad8185612514565b949350505050565b826001600160a01b0316612ac882611192565b6001600160a01b031614612b305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d4565b6001600160a01b038216612b925760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d4565b612b9d60008261297c565b81600b826127118110612bb257612bb261416c565b0180546001600160a01b0319166001600160a01b03928316179055604051829184811691908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c52576040519150601f19603f3d011682016040523d82523d6000602084013e612c57565b606091505b5050905080612ca85760405162461bcd60e51b815260206004820152601f60248201527f524f424f524f56534b493a204554485f5452414e534645525f4641494c45440060448201526064016109d4565b826001600160a01b03167f6cca423c6ffc06e62a0acc433965e074b11c28479b0449250ce3ff65ac9e39fe83604051611fdb91815260200190565b6000612cee82611192565b9050612cfb60008361297c565b6000600b836127118110612d1157612d1161416c565b0180546001600160a01b0319166001600160a01b0392909216919091179055600a8054906000612d40836144d0565b909155505060008281526009602052604090208054612d5e9061419d565b159050612d7c576000828152600960205260408120612d7c916139a8565b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b80612721612dc58461161b565b604051612dd291906141d8565b908152604051908190036020019020805491151560ff199092169190911790555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612e8d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab91906143d0565b604080516001600160a01b038381166024830152604480830186905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612f0d91906141d8565b6000604051808303816000865af19150503d8060008114612f4a576040519150601f19603f3d011682016040523d82523d6000602084013e612f4f565b606091505b5091509150818015612f79575080511580612f79575080806020019051810190612f7991906143e9565b612fd75760405162461bcd60e51b815260206004820152602960248201527f5265636f76657261626c6542794f776e65723a2045524332305f5452414e5346604482015268115497d1905253115160ba1b60648201526084016109d4565b5050505050565b816001600160a01b0316836001600160a01b031614156130405760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d4565b6001600160a01b03838116600081815261271d6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6130b9848484612ab5565b6130c58484848461354a565b61150f5760405162461bcd60e51b81526004016109d4906144e7565b6060816131055750506040805180820190915260018152600360fc1b602082015290565b8160005b811561312f578061311981614182565b91506131289050600a83614290565b9150613109565b6000816001600160401b0381111561314957613149613ab5565b6040519080825280601f01601f191660200182016040528015613173576020820181803683370190505b5090505b8415612aad576131886001836142a4565b9150613195600a86614539565b6131a09060306144b8565b60f81b8183815181106131b5576131b561416c565b60200101906001600160f81b031916908160001a9053506131d7600a86614290565b9450613177565b6131e782612952565b61324a5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016109d4565b60008281526009602090815260409091208251610dcc928401906139e2565b604080516001600160a01b0386166020820152908101849052606081018390526000906132af906080016040516020818303038152906040528051906020012083613645565b95945050505050565b6000806132c4600a5490565b6132d0906127106142a4565b614e3380549192506000918391836132e783614182565b909155506040805160208101929092526bffffffffffffffffffffffff193360601b16908201524460548201524260748201526094016040516020818303038152906040528051906020012060001c6133409190614539565b905060006127238261271081106133595761335961416c565b01541561337e576127238261271081106133755761337561416c565b01549050613381565b50805b61272361338f6001856142a4565b61271081106133a0576133a061416c565b01546133cd576133b16001846142a4565b6127238361271081106133c6576133c661416c565b0155613406565b6127236133db6001856142a4565b61271081106133ec576133ec61416c565b01546127238361271081106134035761340361416c565b01555b6134118160016144b8565b935050505090565b6001600160a01b03821661346f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d4565b61347881612952565b156134c55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d4565b81600b8261271181106134da576134da61416c565b0180546001600160a01b0319166001600160a01b0392909216919091179055600a805490600061350983614182565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561363d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061358e90339089908890889060040161454d565b6020604051808303816000875af19250505080156135c9575060408051601f3d908101601f191682019092526135c69181019061458a565b60015b613623573d8080156135f7576040519150601f19603f3d011682016040523d82523d6000602084013e6135fc565b606091505b50805161361b5760405162461bcd60e51b81526004016109d4906144e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612aad565b506001612aad565b60008060006136548585613661565b915091506115d6816136d1565b6000808251604114156136985760208301516040840151606085015160001a61368c8782858561388c565b945094505050506136ca565b8251604014156136c257602083015160408401516136b7868383613979565b9350935050506136ca565b506000905060025b9250929050565b60008160048111156136e5576136e56145a7565b14156136ee5750565b6001816004811115613702576137026145a7565b14156137505760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109d4565b6002816004811115613764576137646145a7565b14156137b25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109d4565b60038160048111156137c6576137c66145a7565b141561381f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109d4565b6004816004811115613833576138336145a7565b14156111525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109d4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156138c35750600090506003613970565b8460ff16601b141580156138db57508460ff16601c14155b156138ec5750600090506004613970565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613940573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661396957600060019250925050613970565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161399a8782888561388c565b935093505050935093915050565b5080546139b49061419d565b6000825580601f106139c4575050565b601f0160209004906000526020600020908101906111529190613a66565b8280546139ee9061419d565b90600052602060002090601f016020900481019282613a105760008555613a56565b82601f10613a2957805160ff1916838001178555613a56565b82800160010185558215613a56579182015b82811115613a56578251825591602001919060010190613a3b565b50613a62929150613a66565b5090565b5b80821115613a625760008155600101613a67565b6001600160e01b03198116811461115257600080fd5b600060208284031215613aa357600080fd5b8135613aae81613a7b565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613af357613af3613ab5565b604052919050565b60006001600160401b03821115613b1457613b14613ab5565b50601f01601f191660200190565b600082601f830112613b3357600080fd5b8135613b46613b4182613afb565b613acb565b818152846020838601011115613b5b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b8d57600080fd5b833592506020840135915060408401356001600160401b03811115613bb157600080fd5b613bbd86828701613b22565b9150509250925092565b60005b83811015613be2578181015183820152602001613bca565b8381111561150f5750506000910152565b60008151808452613c0b816020860160208601613bc7565b601f01601f19169290920160200192915050565b602081526000613aae6020830184613bf3565b600060208284031215613c4457600080fd5b5035919050565b6001600160a01b038116811461115257600080fd5b60008060408385031215613c7357600080fd5b8235613c7e81613c4b565b946020939093013593505050565b600060208284031215613c9e57600080fd5b81356001600160401b03811115613cb457600080fd5b612aad84828501613b22565b600080600060608486031215613cd557600080fd5b8335613ce081613c4b565b92506020840135613cf081613c4b565b929592945050506040919091013590565b60008060408385031215613d1457600080fd5b823591506020830135613d2681613c4b565b809150509250929050565b600060208284031215613d4357600080fd5b8135613aae81613c4b565b600080600060608486031215613d6357600080fd5b8335613d6e81613c4b565b9250602084013591506040840135613d8581613c4b565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015613dc857835183529284019291840191600101613dac565b50909695505050505050565b801515811461115257600080fd5b60008060408385031215613df557600080fd5b8235613e0081613c4b565b91506020830135613d2681613dd4565b60008060008060808587031215613e2657600080fd5b8435613e3181613c4b565b93506020850135613e4181613c4b565b92506040850135915060608501356001600160401b03811115613e6357600080fd5b613e6f87828801613b22565b91505092959194509250565b600060208284031215613e8d57600080fd5b8135613aae81613dd4565b60008060408385031215613eab57600080fd5b8235915060208301356001600160401b03811115613ec857600080fd5b613ed485828601613b22565b9150509250929050565b60006001600160401b03821115613ef757613ef7613ab5565b5060051b60200190565b60006020808385031215613f1457600080fd5b82356001600160401b03811115613f2a57600080fd5b8301601f81018513613f3b57600080fd5b8035613f49613b4182613ede565b81815260059190911b82018301908381019087831115613f6857600080fd5b928401925b82841015613f8f578335613f8081613c4b565b82529284019290840190613f6d565b979650505050505050565b600082601f830112613fab57600080fd5b81356020613fbb613b4183613ede565b82815260059290921b84018101918181019086841115613fda57600080fd5b8286015b848110156140195780356001600160401b03811115613ffd5760008081fd5b61400b8986838b0101613b22565b845250918301918301613fde565b509695505050505050565b6000806040838503121561403757600080fd5b82356001600160401b038082111561404e57600080fd5b818501915085601f83011261406257600080fd5b81356020614072613b4183613ede565b82815260059290921b8401810191818101908984111561409157600080fd5b948201945b838610156140af57853582529482019490820190614096565b965050860135925050808211156140c557600080fd5b50613ed485828601613f9a565b600080604083850312156140e557600080fd5b82356140f081613c4b565b91506020830135613d2681613c4b565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561416757614167614137565b500290565b634e487b7160e01b600052603260045260246000fd5b600060001982141561419657614196614137565b5060010190565b600181811c908216806141b157607f821691505b602082108114156141d257634e487b7160e01b600052602260045260246000fd5b50919050565b600082516141ea818460208701613bc7565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60008261429f5761429f61427a565b500490565b6000828210156142b6576142b6614137565b500390565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b600060ff821660ff84168060ff0382111561432357614323614137565b019392505050565b8054600090600181811c908083168061434557607f831692505b602080841082141561436757634e487b7160e01b600052602260045260246000fd5b81801561437b576001811461438c576143b8565b60ff198616895284890196506143b8565b876000528160002060005b868110156143b05781548b820152908501908301614397565b505084890196505b50505050505092915050565b6000613aae828461432b565b6000602082840312156143e257600080fd5b5051919050565b6000602082840312156143fb57600080fd5b8151613aae81613dd4565b60006020828403121561441857600080fd5b81516001600160401b0381111561442e57600080fd5b8201601f8101841361443f57600080fd5b805161444d613b4182613afb565b81815285602083850101111561446257600080fd5b6132af826020830160208601613bc7565b600061447f828661432b565b845161448f818360208901613bc7565b613f8f8183018661432b565b6000602082840312156144ad57600080fd5b8151613aae81613c4b565b600082198211156144cb576144cb614137565b500190565b6000816144df576144df614137565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826145485761454861427a565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061458090830184613bf3565b9695505050505050565b60006020828403121561459c57600080fd5b8151613aae81613a7b565b634e487b7160e01b600052602160045260246000fdfea26469706673582212202590fb1367c317507e34099c746cf181a0185e8aefa1ec2c76c2d31654065e6864736f6c634300080a003368747470733a2f2f697066732e696f2f697066732f516d58486664454e6531764c506e3267364250374b6e766e686758474d656b737433596150343968596a5862465968747470733a2f2f697066732e696f2f697066732f516d5543535551504a75764c626d37796d4a3342466641633943594d714362425839686f4d4651517650336954610000000000000000000000002c5e6ffe9f7f161c15f78cd67d79c33a7c8d84b5000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

Deployed Bytecode

0x6080604052600436106102e45760003560e01c80638462151c11610190578063c5953170116100dc578063e8a3d48511610095578063ea78552e1161006f578063ea78552e146108b0578063f2c4ce1e146108e4578063f2fde38b14610904578063ffe630b51461092457600080fd5b8063e8a3d4851461085a578063e97382bd1461086f578063e985e9c51461089057600080fd5b8063c5953170146107a5578063c87b56dd146107c5578063d367c52d146107e5578063da3ef23f146107fa578063db3e4c841461081a578063e725f8771461083a57600080fd5b8063a12120c811610149578063b88d4fde11610123578063b88d4fde14610732578063bc6cb08014610752578063bedb86fb14610765578063c39cbef11461078557600080fd5b8063a12120c8146106dd578063a22cb465146106fd578063a475b5dd1461071d57600080fd5b80638462151c1461061d5780638da5cb5b1461064a578063938e3d7b146106685780639416b4231461068857806395d89b41146106a85780639ffdb65a146106bd57600080fd5b806342842e0e1161024f57806364335ace1161020857806370a08231116101e257806370a08231146105a8578063715018a6146105c85780637f81be69146105dd578063819bea4b146105fd57600080fd5b806364335ace1461052f5780636c19e783146105685780636f4f73661461058857600080fd5b806342842e0e1461047c57806342966c681461049c5780634f6ccce7146104bc57806355f804b3146104da5780636352211e146104fa5780636373a6b11461051a57600080fd5b806315b56d10116102a157806315b56d10146103c057806318160ddd146103e05780632074a66e146103ff57806323b872dd1461041c5780632e1a7d4d1461043c5780632f745c591461045c57600080fd5b806301ffc9a7146102e95780630336fc171461031e57806306fdde0314610333578063081812fc1461035557806308dc9f421461038d578063095ea7b3146103a0575b600080fd5b3480156102f557600080fd5b50610309610304366004613a91565b610944565b60405190151581526020015b60405180910390f35b61033161032c366004613b78565b6109b1565b005b34801561033f57600080fd5b50610348610ad9565b6040516103159190613c1f565b34801561036157600080fd5b50610375610370366004613c32565b610b6b565b6040516001600160a01b039091168152602001610315565b61033161039b366004613b78565b610bf4565b3480156103ac57600080fd5b506103316103bb366004613c60565b610cbb565b3480156103cc57600080fd5b506103096103db366004613c8c565b610dd1565b3480156103ec57600080fd5b50600a545b604051908152602001610315565b34801561040b57600080fd5b506103f16863345a083e94d8000081565b34801561042857600080fd5b50610331610437366004613cc0565b610e05565b34801561044857600080fd5b50610331610457366004613c32565b610e37565b34801561046857600080fd5b506103f1610477366004613c60565b610efa565b34801561048857600080fd5b50610331610497366004613cc0565b610fa0565b3480156104a857600080fd5b506103316104b7366004613c32565b610fbb565b3480156104c857600080fd5b506103f16104d7366004613c32565b90565b3480156104e657600080fd5b506103316104f5366004613c8c565b611155565b34801561050657600080fd5b50610375610515366004613c32565b611192565b34801561052657600080fd5b50610348611215565b34801561053b57600080fd5b506103f161054a366004613d01565b614e3760209081526000928352604080842090915290825290205481565b34801561057457600080fd5b50610331610583366004613d31565b6112a4565b34801561059457600080fd5b506103316105a3366004613d31565b6112f1565b3480156105b457600080fd5b506103f16105c3366004613d31565b61133e565b3480156105d457600080fd5b50610331611406565b3480156105e957600080fd5b506103756105f8366004613c32565b61143c565b34801561060957600080fd5b50610331610618366004613d4e565b611463565b34801561062957600080fd5b5061063d610638366004613d31565b611515565b6040516103159190613d90565b34801561065657600080fd5b506000546001600160a01b0316610375565b34801561067457600080fd5b50610331610683366004613c8c565b6115de565b34801561069457600080fd5b506103486106a3366004613c8c565b61161b565b3480156106b457600080fd5b50610348611775565b3480156106c957600080fd5b506103096106d8366004613c8c565b611784565b3480156106e957600080fd5b506103096106f8366004613c32565b611993565b34801561070957600080fd5b50610331610718366004613de2565b6119bf565b34801561072957600080fd5b506103316119ca565b34801561073e57600080fd5b5061033161074d366004613e10565b611a03565b610331610760366004613b78565b611a35565b34801561077157600080fd5b50610331610780366004613e7b565b611b30565b34801561079157600080fd5b506103316107a0366004613e98565b611b6e565b3480156107b157600080fd5b506103316107c0366004613f01565b611fe8565b3480156107d157600080fd5b506103486107e0366004613c32565b612088565b3480156107f157600080fd5b506103316122f6565b34801561080657600080fd5b50610331610815366004613c8c565b612333565b34801561082657600080fd5b50610331610835366004614024565b612370565b34801561084657600080fd5b50610348610855366004613c32565b612453565b34801561086657600080fd5b50610348612471565b34801561087b57600080fd5b5061271e54610375906001600160a01b031681565b34801561089c57600080fd5b506103096108ab3660046140d2565b612514565b3480156108bc57600080fd5b506103757f0000000000000000000000002c5e6ffe9f7f161c15f78cd67d79c33a7c8d84b581565b3480156108f057600080fd5b506103316108ff366004613c8c565b6125e6565b34801561091057600080fd5b5061033161091f366004613d31565b612623565b34801561093057600080fd5b5061033161093f366004613c8c565b6126bb565b60006001600160e01b0319821663780e9d6360e01b148061097557506001600160e01b03198216635b5e139f60e01b145b8061099057506001600160e01b031982166380ac58cd60e01b145b806109ab57506001600160e01b031982166301ffc9a760e01b145b92915050565b600260015414156109dd5760405162461bcd60e51b81526004016109d490614100565b60405180910390fd5b6002600155636211a0a042108015906109f95750636211f50042105b610a455760405162461bcd60e51b815260206004820152601b60248201527f524f424f524f56534b493a20726166666c65206e6f74206f70656e000000000060448201526064016109d4565b610a52335b848484612764565b610a736001335b856001610a6e67024a32a033f080008361414d565b612819565b60005b83811015610acf576001614e39610a8c33612937565b6127118110610a9d57610a9d61416c565b602091828204019190066101000a81548160ff0219169083151502179055508080610ac790614182565b915050610a76565b5050600180555050565b606060028054610ae89061419d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b149061419d565b8015610b615780601f10610b3657610100808354040283529160200191610b61565b820191906000526020600020905b815481529060010190602001808311610b4457829003601f168201915b5050505050905090565b6000610b7682612952565b610bd75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d4565b50600090815261271c60205260409020546001600160a01b031690565b60026001541415610c175760405162461bcd60e51b81526004016109d490614100565b6002600155636211f500421015610c705760405162461bcd60e51b815260206004820152601960248201527f524f424f524f56534b493a2073616c65206e6f74206f70656e0000000000000060448201526064016109d4565b610c7933610a4a565b610c94600233856002610a6e67024a32a033f080008361414d565b60005b83811015610acf57610ca833612937565b5080610cb381614182565b915050610c97565b6000610cc682611192565b9050806001600160a01b0316836001600160a01b03161415610d345760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d4565b336001600160a01b0382161480610d505750610d508133612514565b610dc25760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d4565b610dcc838361297c565b505050565b6000612721610ddf8361161b565b604051610dec91906141d8565b9081526040519081900360200190205460ff1692915050565b610e10335b826129eb565b610e2c5760405162461bcd60e51b81526004016109d4906141f4565b610dcc838383612ab5565b6000546001600160a01b03163314610e615760405162461bcd60e51b81526004016109d490614245565b47811115610e6c5750475b60006064610e7b83603261414d565b610e859190614290565b9050610eba614e36600081548110610e9f57610e9f61416c565b6000918252602090912001546001600160a01b031682612c05565b610ef6614e36600181548110610ed257610ed261416c565b6000918252602090912001546001600160a01b0316610ef183856142a4565b612c05565b5050565b6000610f058361133e565b8210610f235760405162461bcd60e51b81526004016109d4906142bb565b6000805b612711811015610f8757600b816127118110610f4557610f4561416c565b01546001600160a01b0386811691161415610f775783821415610f6b5791506109ab9050565b610f7482614182565b91505b610f8081614182565b9050610f27565b5060405162461bcd60e51b81526004016109d4906142bb565b610dcc83838360405180602001604052806000815250611a03565b610fc433610e0a565b6110295760405162461bcd60e51b815260206004820152603060248201527f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760448201526f1b995c881b9bdc88185c1c1c9bdd995960821b60648201526084016109d4565b61103281612ce3565b600081815261272060205260409020805461104c9061419d565b1590506111525760008181526127206020526040902080546110f791906110729061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461109e9061419d565b80156110eb5780601f106110c0576101008083540402835291602001916110eb565b820191906000526020600020905b8154815290600101906020018083116110ce57829003601f168201915b50505050506000612db8565b60008181526127206020526040812061110f916139a8565b807f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b60405161114990602080825260009082015260400190565b60405180910390a25b50565b6000546001600160a01b0316331461117f5760405162461bcd60e51b81526004016109d490614245565b8051610ef69060059060208401906139e2565b600080600b8361271181106111a9576111a961416c565b01546001600160a01b03169050806109ab5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d4565b61272280546112239061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461124f9061419d565b801561129c5780601f106112715761010080835404028352916020019161129c565b820191906000526020600020905b81548152906001019060200180831161127f57829003601f168201915b505050505081565b6000546001600160a01b031633146112ce5760405162461bcd60e51b81526004016109d490614245565b614e3480546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461131b5760405162461bcd60e51b81526004016109d490614245565b61271e80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160a01b0382166113a95760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d4565b6000612711815b818110156113fd57600b8161271181106113cc576113cc61416c565b01546001600160a01b03868116911614156113ed576113ea83614182565b92505b6113f681614182565b90506113b0565b50909392505050565b6000546001600160a01b031633146114305760405162461bcd60e51b81526004016109d490614245565b61143a6000612df6565b565b6000600b8261271181106114525761145261416c565b01546001600160a01b031692915050565b6000546001600160a01b0316331461148d5760405162461bcd60e51b81526004016109d490614245565b600061149884612e46565b9050808311156115045760405162461bcd60e51b815260206004820152603160248201527f5265636f76657261626c6542794f776e65723a205245434f56455241424c455f6044820152700829a9eaa9ca8be9c9ea8be8a9c9eaa8e9607b1b60648201526084016109d4565b61150f848484612eb1565b50505050565b60606115208261133e565b60001061153f5760405162461bcd60e51b81526004016109d4906142bb565b600061154a8361133e565b90506000816001600160401b0381111561156657611566613ab5565b60405190808252806020026020018201604052801561158f578160200160208202803683370190505b50905060005b828110156115d6576115a78582610efa565b8282815181106115b9576115b961416c565b6020908102919091010152806115ce81614182565b915050611595565b509392505050565b6000546001600160a01b031633146116085760405162461bcd60e51b81526004016109d490614245565b8051610ef69060049060208401906139e2565b60606000829050600081516001600160401b0381111561163d5761163d613ab5565b6040519080825280601f01601f191660200182016040528015611667576020820181803683370190505b50905060005b82518110156115d657604183828151811061168a5761168a61416c565b016020015160f81c108015906116ba5750605a8382815181106116af576116af61416c565b016020015160f81c11155b1561171c578281815181106116d1576116d161416c565b602001015160f81c60f81b60f81c60206116eb9190614306565b60f81b8282815181106117005761170061416c565b60200101906001600160f81b031916908160001a905350611763565b82818151811061172e5761172e61416c565b602001015160f81c60f81b82828151811061174b5761174b61416c565b60200101906001600160f81b031916908160001a9053505b8061176d81614182565b91505061166d565b606060038054610ae89061419d565b60008082905060018151101561179d5750600092915050565b6019815111156117b05750600092915050565b806000815181106117c3576117c361416c565b6020910101516001600160f81b031916600160fd1b14156117e75750600092915050565b80600182516117f691906142a4565b815181106118065761180661416c565b6020910101516001600160f81b031916600160fd1b141561182a5750600092915050565b60008160008151811061183f5761183f61416c565b01602001516001600160f81b031916905060005b82518110156119885760008382815181106118705761187061416c565b01602001516001600160f81b0319169050600160fd1b811480156118a15750600160fd1b6001600160f81b03198416145b156118b25750600095945050505050565b600360fc1b6001600160f81b03198216108015906118de5750603960f81b6001600160f81b0319821611155b1580156119145750604160f81b6001600160f81b03198216108015906119125750602d60f91b6001600160f81b0319821611155b155b80156119495750606160f81b6001600160f81b03198216108015906119475750603d60f91b6001600160f81b0319821611155b155b80156119635750600160fd1b6001600160f81b0319821614155b156119745750600095945050505050565b91508061198081614182565b915050611853565b506001949350505050565b614e398161271181106119a557600080fd5b60209182820401919006915054906101000a900460ff1681565b610ef6338383612fde565b6000546001600160a01b031633146119f45760405162461bcd60e51b81526004016109d490614245565b6007805460ff19166001179055565b611a0d33836129eb565b611a295760405162461bcd60e51b81526004016109d4906141f4565b61150f848484846130ae565b60026001541415611a585760405162461bcd60e51b81526004016109d490614100565b6002600155636210f7c24210801590611a745750636211a0a042105b611ac05760405162461bcd60e51b815260206004820152601c60248201527f524f424f524f56534b493a2070726573616c65206e6f74206f70656e0000000060448201526064016109d4565b611ac933610a4a565b611ad4600033610a59565b60005b83811015610acf576001614e39611aed33612937565b6127118110611afe57611afe61416c565b602091828204019190066101000a81548160ff0219169083151502179055508080611b2890614182565b915050611ad7565b6000546001600160a01b03163314611b5a5760405162461bcd60e51b81526004016109d490614245565b614e38805460ff1916911515919091179055565b6000611b7983611192565b9050336001600160a01b03821614611be55760405162461bcd60e51b815260206004820152602960248201527f524f424f524f56534b493a2063616c6c6572206973206e6f742074686520746f60448201526835b2b71037bbb732b960b91b60648201526084016109d4565b611bee82611784565b1515600114611c3f5760405162461bcd60e51b815260206004820181905260248201527f524f424f524f56534b493a206e6f7420612076616c6964206e6577206e616d6560448201526064016109d4565b60008381526127206020526040908190209051600291611c5e916143c4565b602060405180830381855afa158015611c7b573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611c9e91906143d0565b600283604051611cae91906141d8565b602060405180830381855afa158015611ccb573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190611cee91906143d0565b1415611d545760405162461bcd60e51b815260206004820152602f60248201527f524f424f524f56534b493a206e6577206e616d652069732073616d652061732060448201526e7468652063757272656e74206f6e6560881b60648201526084016109d4565b611d5d82610dd1565b15611db45760405162461bcd60e51b815260206004820152602160248201527f524f424f524f56534b493a206e616d6520616c726561647920726573657276656044820152601960fa1b60648201526084016109d4565b6001600160a01b037f0000000000000000000000002c5e6ffe9f7f161c15f78cd67d79c33a7c8d84b5166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201523060248201526863345a083e94d8000060448201526064016020604051808303816000875af1158015611e3f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6391906143e9565b611eb95760405162461bcd60e51b815260206004820152602160248201527f524f424f524f56534b493a2045524332305f5452414e534645525f4641494c456044820152601160fa1b60648201526084016109d4565b604051630852cd8d60e31b81526863345a083e94d8000060048201527f0000000000000000000000002c5e6ffe9f7f161c15f78cd67d79c33a7c8d84b56001600160a01b0316906342966c6890602401600060405180830381600087803b158015611f2357600080fd5b505af1158015611f37573d6000803e3d6000fd5b505050600084815261272060205260408120805491925090611f589061419d565b90501115611f7f576000838152612720602052604090208054611f7f91906110729061419d565b611f8a826001612db8565b6000838152612720602090815260409091208351611faa928501906139e2565b50827f7e632a301794d8d4a81ea7e20f37d1947158d36e66403af04ba85dd194b66f1b83604051611fdb9190613c1f565b60405180910390a2505050565b6000546001600160a01b031633146120125760405162461bcd60e51b81526004016109d490614245565b60005b8151811015610ef6576001614e396120458484815181106120385761203861416c565b6020026020010151612937565b61271181106120565761205661416c565b602091828204019190066101000a81548160ff021916908315150217905550808061208090614182565b915050612015565b606061209382612952565b6120f75760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b60648201526084016109d4565b60075460ff16612193576008805461210e9061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461213a9061419d565b80156121875780601f1061215c57610100808354040283529160200191612187565b820191906000526020600020905b81548152906001019060200180831161216a57829003601f168201915b50505050509050919050565b61271e546001600160a01b0316156122175761271e5460405163c87b56dd60e01b8152600481018490526001600160a01b039091169063c87b56dd90602401600060405180830381865afa1580156121ef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109ab9190810190614406565b600082815260096020526040812080546122309061419d565b80601f016020809104026020016040519081016040528092919081815260200182805461225c9061419d565b80156122a95780601f1061227e576101008083540402835291602001916122a9565b820191906000526020600020905b81548152906001019060200180831161228c57829003601f168201915b505050505090506000815111156122c05792915050565b60056122cb846130e1565b60066040516020016122df93929190614473565b604051602081830303815290604052915050919050565b6000546001600160a01b031633146123205760405162461bcd60e51b81526004016109d490614245565b61271f80546001600160a01b0319169055565b6000546001600160a01b0316331461235d5760405162461bcd60e51b81526004016109d490614245565b8051610ef69060069060208401906139e2565b6000546001600160a01b0316331461239a5760405162461bcd60e51b81526004016109d490614245565b80518251146123f95760405162461bcd60e51b815260206004820152602560248201527f45524337323155524953746f726167653a20706172616d6574657273206d69736044820152640dac2e8c6d60db1b60648201526084016109d4565b60005b8251811015610dcc5761244183828151811061241a5761241a61416c565b60200260200101518383815181106124345761243461416c565b60200260200101516131de565b8061244b81614182565b9150506123fc565b60008181526127206020526040902080546060919061210e9061419d565b61271e546060906001600160a01b0316156125075761271e60009054906101000a90046001600160a01b03166001600160a01b031663e8a3d4856040518163ffffffff1660e01b8152600401600060405180830381865afa1580156124da573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526125029190810190614406565b905090565b60048054610ae89061419d565b61271f546000906001600160a01b0316158015906125a9575061271f5460405163c455279160e01b81526001600160a01b03858116600483015284811692169063c455279190602401602060405180830381865afa15801561257a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061259e919061449b565b6001600160a01b0316145b156125b6575060016109ab565b506001600160a01b03918216600090815261271d6020908152604080832093909416825291909152205460ff1690565b6000546001600160a01b031633146126105760405162461bcd60e51b81526004016109d490614245565b8051610ef69060089060208401906139e2565b6000546001600160a01b0316331461264d5760405162461bcd60e51b81526004016109d490614245565b6001600160a01b0381166126b25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d4565b61115281612df6565b6000546001600160a01b031633146126e55760405162461bcd60e51b81526004016109d490614245565b61272280546126f39061419d565b1590506127505760405162461bcd60e51b815260206004820152602560248201527f524f424f524f56534b493a2070726f76656e616e636520697320616c726561646044820152641e481cd95d60da1b60648201526084016109d4565b8051610ef6906127229060208401906139e2565b6000828152614e35602052604090205460ff161580156127a35750614e34546001600160a01b031661279885858585613269565b6001600160a01b0316145b6127fa5760405162461bcd60e51b815260206004820152602260248201527f524f424f524f56534b493a206e6f7420617574686f72697a656420746f206d696044820152611b9d60f21b60648201526084016109d4565b506000908152614e3560205260409020805460ff191660011790555050565b6000858152614e37602090815260408083206001600160a01b0388168452909152902054829061284a9085906144b8565b11156128985760405162461bcd60e51b815260206004820152601960248201527f524f424f524f56534b493a2061646472657373206c696d69740000000000000060448201526064016109d4565b803410156128f85760405162461bcd60e51b815260206004820152602760248201527f524f424f524f56534b493a2076616c75652062656c6f7720707572636861736560448201526608185b5bdd5b9d60ca1b60648201526084016109d4565b6000858152614e37602090815260408083206001600160a01b03881684529091528120805485929061292b9084906144b8565b90915550505050505050565b60006129416132b8565b905061294d8282613419565b919050565b600080600b8361271181106129695761296961416c565b01546001600160a01b0316141592915050565b600081815261271c6020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129b282611192565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129f682612952565b612a575760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d4565b6000612a6283611192565b9050806001600160a01b0316846001600160a01b03161480612a9d5750836001600160a01b0316612a9284610b6b565b6001600160a01b0316145b80612aad5750612aad8185612514565b949350505050565b826001600160a01b0316612ac882611192565b6001600160a01b031614612b305760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d4565b6001600160a01b038216612b925760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d4565b612b9d60008261297c565b81600b826127118110612bb257612bb261416c565b0180546001600160a01b0319166001600160a01b03928316179055604051829184811691908616907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90600090a4505050565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612c52576040519150601f19603f3d011682016040523d82523d6000602084013e612c57565b606091505b5050905080612ca85760405162461bcd60e51b815260206004820152601f60248201527f524f424f524f56534b493a204554485f5452414e534645525f4641494c45440060448201526064016109d4565b826001600160a01b03167f6cca423c6ffc06e62a0acc433965e074b11c28479b0449250ce3ff65ac9e39fe83604051611fdb91815260200190565b6000612cee82611192565b9050612cfb60008361297c565b6000600b836127118110612d1157612d1161416c565b0180546001600160a01b0319166001600160a01b0392909216919091179055600a8054906000612d40836144d0565b909155505060008281526009602052604090208054612d5e9061419d565b159050612d7c576000828152600960205260408120612d7c916139a8565b60405182906000906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b80612721612dc58461161b565b604051612dd291906141d8565b908152604051908190036020019020805491151560ff199092169190911790555050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a0823190602401602060405180830381865afa158015612e8d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109ab91906143d0565b604080516001600160a01b038381166024830152604480830186905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b1790529151600092839290871691612f0d91906141d8565b6000604051808303816000865af19150503d8060008114612f4a576040519150601f19603f3d011682016040523d82523d6000602084013e612f4f565b606091505b5091509150818015612f79575080511580612f79575080806020019051810190612f7991906143e9565b612fd75760405162461bcd60e51b815260206004820152602960248201527f5265636f76657261626c6542794f776e65723a2045524332305f5452414e5346604482015268115497d1905253115160ba1b60648201526084016109d4565b5050505050565b816001600160a01b0316836001600160a01b031614156130405760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d4565b6001600160a01b03838116600081815261271d6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6130b9848484612ab5565b6130c58484848461354a565b61150f5760405162461bcd60e51b81526004016109d4906144e7565b6060816131055750506040805180820190915260018152600360fc1b602082015290565b8160005b811561312f578061311981614182565b91506131289050600a83614290565b9150613109565b6000816001600160401b0381111561314957613149613ab5565b6040519080825280601f01601f191660200182016040528015613173576020820181803683370190505b5090505b8415612aad576131886001836142a4565b9150613195600a86614539565b6131a09060306144b8565b60f81b8183815181106131b5576131b561416c565b60200101906001600160f81b031916908160001a9053506131d7600a86614290565b9450613177565b6131e782612952565b61324a5760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b60648201526084016109d4565b60008281526009602090815260409091208251610dcc928401906139e2565b604080516001600160a01b0386166020820152908101849052606081018390526000906132af906080016040516020818303038152906040528051906020012083613645565b95945050505050565b6000806132c4600a5490565b6132d0906127106142a4565b614e3380549192506000918391836132e783614182565b909155506040805160208101929092526bffffffffffffffffffffffff193360601b16908201524460548201524260748201526094016040516020818303038152906040528051906020012060001c6133409190614539565b905060006127238261271081106133595761335961416c565b01541561337e576127238261271081106133755761337561416c565b01549050613381565b50805b61272361338f6001856142a4565b61271081106133a0576133a061416c565b01546133cd576133b16001846142a4565b6127238361271081106133c6576133c661416c565b0155613406565b6127236133db6001856142a4565b61271081106133ec576133ec61416c565b01546127238361271081106134035761340361416c565b01555b6134118160016144b8565b935050505090565b6001600160a01b03821661346f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d4565b61347881612952565b156134c55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d4565b81600b8261271181106134da576134da61416c565b0180546001600160a01b0319166001600160a01b0392909216919091179055600a805490600061350983614182565b909155505060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001600160a01b0384163b1561363d57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061358e90339089908890889060040161454d565b6020604051808303816000875af19250505080156135c9575060408051601f3d908101601f191682019092526135c69181019061458a565b60015b613623573d8080156135f7576040519150601f19603f3d011682016040523d82523d6000602084013e6135fc565b606091505b50805161361b5760405162461bcd60e51b81526004016109d4906144e7565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612aad565b506001612aad565b60008060006136548585613661565b915091506115d6816136d1565b6000808251604114156136985760208301516040840151606085015160001a61368c8782858561388c565b945094505050506136ca565b8251604014156136c257602083015160408401516136b7868383613979565b9350935050506136ca565b506000905060025b9250929050565b60008160048111156136e5576136e56145a7565b14156136ee5750565b6001816004811115613702576137026145a7565b14156137505760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016109d4565b6002816004811115613764576137646145a7565b14156137b25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016109d4565b60038160048111156137c6576137c66145a7565b141561381f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016109d4565b6004816004811115613833576138336145a7565b14156111525760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016109d4565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156138c35750600090506003613970565b8460ff16601b141580156138db57508460ff16601c14155b156138ec5750600090506004613970565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613940573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b03811661396957600060019250925050613970565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b0161399a8782888561388c565b935093505050935093915050565b5080546139b49061419d565b6000825580601f106139c4575050565b601f0160209004906000526020600020908101906111529190613a66565b8280546139ee9061419d565b90600052602060002090601f016020900481019282613a105760008555613a56565b82601f10613a2957805160ff1916838001178555613a56565b82800160010185558215613a56579182015b82811115613a56578251825591602001919060010190613a3b565b50613a62929150613a66565b5090565b5b80821115613a625760008155600101613a67565b6001600160e01b03198116811461115257600080fd5b600060208284031215613aa357600080fd5b8135613aae81613a7b565b9392505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613af357613af3613ab5565b604052919050565b60006001600160401b03821115613b1457613b14613ab5565b50601f01601f191660200190565b600082601f830112613b3357600080fd5b8135613b46613b4182613afb565b613acb565b818152846020838601011115613b5b57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215613b8d57600080fd5b833592506020840135915060408401356001600160401b03811115613bb157600080fd5b613bbd86828701613b22565b9150509250925092565b60005b83811015613be2578181015183820152602001613bca565b8381111561150f5750506000910152565b60008151808452613c0b816020860160208601613bc7565b601f01601f19169290920160200192915050565b602081526000613aae6020830184613bf3565b600060208284031215613c4457600080fd5b5035919050565b6001600160a01b038116811461115257600080fd5b60008060408385031215613c7357600080fd5b8235613c7e81613c4b565b946020939093013593505050565b600060208284031215613c9e57600080fd5b81356001600160401b03811115613cb457600080fd5b612aad84828501613b22565b600080600060608486031215613cd557600080fd5b8335613ce081613c4b565b92506020840135613cf081613c4b565b929592945050506040919091013590565b60008060408385031215613d1457600080fd5b823591506020830135613d2681613c4b565b809150509250929050565b600060208284031215613d4357600080fd5b8135613aae81613c4b565b600080600060608486031215613d6357600080fd5b8335613d6e81613c4b565b9250602084013591506040840135613d8581613c4b565b809150509250925092565b6020808252825182820181905260009190848201906040850190845b81811015613dc857835183529284019291840191600101613dac565b50909695505050505050565b801515811461115257600080fd5b60008060408385031215613df557600080fd5b8235613e0081613c4b565b91506020830135613d2681613dd4565b60008060008060808587031215613e2657600080fd5b8435613e3181613c4b565b93506020850135613e4181613c4b565b92506040850135915060608501356001600160401b03811115613e6357600080fd5b613e6f87828801613b22565b91505092959194509250565b600060208284031215613e8d57600080fd5b8135613aae81613dd4565b60008060408385031215613eab57600080fd5b8235915060208301356001600160401b03811115613ec857600080fd5b613ed485828601613b22565b9150509250929050565b60006001600160401b03821115613ef757613ef7613ab5565b5060051b60200190565b60006020808385031215613f1457600080fd5b82356001600160401b03811115613f2a57600080fd5b8301601f81018513613f3b57600080fd5b8035613f49613b4182613ede565b81815260059190911b82018301908381019087831115613f6857600080fd5b928401925b82841015613f8f578335613f8081613c4b565b82529284019290840190613f6d565b979650505050505050565b600082601f830112613fab57600080fd5b81356020613fbb613b4183613ede565b82815260059290921b84018101918181019086841115613fda57600080fd5b8286015b848110156140195780356001600160401b03811115613ffd5760008081fd5b61400b8986838b0101613b22565b845250918301918301613fde565b509695505050505050565b6000806040838503121561403757600080fd5b82356001600160401b038082111561404e57600080fd5b818501915085601f83011261406257600080fd5b81356020614072613b4183613ede565b82815260059290921b8401810191818101908984111561409157600080fd5b948201945b838610156140af57853582529482019490820190614096565b965050860135925050808211156140c557600080fd5b50613ed485828601613f9a565b600080604083850312156140e557600080fd5b82356140f081613c4b565b91506020830135613d2681613c4b565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561416757614167614137565b500290565b634e487b7160e01b600052603260045260246000fd5b600060001982141561419657614196614137565b5060010190565b600181811c908216806141b157607f821691505b602082108114156141d257634e487b7160e01b600052602260045260246000fd5b50919050565b600082516141ea818460208701613bc7565b9190910192915050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601260045260246000fd5b60008261429f5761429f61427a565b500490565b6000828210156142b6576142b6614137565b500390565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201526a74206f6620626f756e647360a81b606082015260800190565b600060ff821660ff84168060ff0382111561432357614323614137565b019392505050565b8054600090600181811c908083168061434557607f831692505b602080841082141561436757634e487b7160e01b600052602260045260246000fd5b81801561437b576001811461438c576143b8565b60ff198616895284890196506143b8565b876000528160002060005b868110156143b05781548b820152908501908301614397565b505084890196505b50505050505092915050565b6000613aae828461432b565b6000602082840312156143e257600080fd5b5051919050565b6000602082840312156143fb57600080fd5b8151613aae81613dd4565b60006020828403121561441857600080fd5b81516001600160401b0381111561442e57600080fd5b8201601f8101841361443f57600080fd5b805161444d613b4182613afb565b81815285602083850101111561446257600080fd5b6132af826020830160208601613bc7565b600061447f828661432b565b845161448f818360208901613bc7565b613f8f8183018661432b565b6000602082840312156144ad57600080fd5b8151613aae81613c4b565b600082198211156144cb576144cb614137565b500190565b6000816144df576144df614137565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6000826145485761454861427a565b500690565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061458090830184613bf3565b9695505050505050565b60006020828403121561459c57600080fd5b8151613aae81613a7b565b634e487b7160e01b600052602160045260246000fdfea26469706673582212202590fb1367c317507e34099c746cf181a0185e8aefa1ec2c76c2d31654065e6864736f6c634300080a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000002c5e6ffe9f7f161c15f78cd67d79c33a7c8d84b5000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1

-----Decoded View---------------
Arg [0] : rnct_ (address): 0x2c5E6FFE9f7f161C15f78Cd67D79c33A7c8D84B5
Arg [1] : proxyRegistry_ (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c5e6ffe9f7f161c15f78cd67d79c33a7c8d84b5
Arg [1] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1


Deployed Bytecode Sourcemap

60233:3346:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32037:353;;;;;;;;;;-1:-1:-1;32037:353:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;32037:353:0;;;;;;;;62197:496;;;;;;:::i;:::-;;:::i;:::-;;33185:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35728:211::-;;;;;;;;;;-1:-1:-1;35728:211:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;3223:32:1;;;3205:51;;3193:2;3178:18;35728:211:0;3059:203:1;62701:428:0;;;;;;:::i;:::-;;:::i;35365:355::-;;;;;;;;;;-1:-1:-1;35365:355:0;;;;;:::i;:::-;;:::i;43268:137::-;;;;;;;;;;-1:-1:-1;43268:137:0;;;;;:::i;:::-;;:::i;35148:94::-;;;;;;;;;;-1:-1:-1;35228:6:0;;35148:94;;;4195:25:1;;;4183:2;4168:18;35148:94:0;4049:177:1;42341:54:0;;;;;;;;;;;;42385:10;42341:54;;36404:242;;;;;;;;;;-1:-1:-1;36404:242:0;;;;;:::i;:::-;;:::i;59173:282::-;;;;;;;;;;-1:-1:-1;59173:282:0;;;;;:::i;:::-;;:::i;34162:539::-;;;;;;;;;;-1:-1:-1;34162:539:0;;;;;:::i;:::-;;:::i;36654:143::-;;;;;;;;;;-1:-1:-1;36654:143:0;;;;;:::i;:::-;;:::i;42678:455::-;;;;;;;;;;-1:-1:-1;42678:455:0;;;;;:::i;:::-;;:::i;35250:107::-;;;;;;;;;;-1:-1:-1;35250:107:0;;;;;:::i;:::-;35344:5;35250:107;40794:93;;;;;;;;;;-1:-1:-1;40794:93:0;;;;;:::i;:::-;;:::i;32829:231::-;;;;;;;;;;-1:-1:-1;32829:231:0;;;;;:::i;:::-;;:::i;46526:29::-;;;;;;;;;;;;;:::i;60834:63::-;;;;;;;;;;-1:-1:-1;60834:63:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;58121:95;;;;;;;;;;-1:-1:-1;58121:95:0;;;;;:::i;:::-;;:::i;41551:90::-;;;;;;;;;;-1:-1:-1;41551:90:0;;;;;:::i;:::-;;:::i;32398:423::-;;;;;;;;;;-1:-1:-1;32398:423:0;;;;;:::i;:::-;;:::i;2721:103::-;;;;;;;;;;;;;:::i;33068:109::-;;;;;;;;;;-1:-1:-1;33068:109:0;;;;;:::i;:::-;;:::i;9494:320::-;;;;;;;;;;-1:-1:-1;9494:320:0;;;;;:::i;:::-;;:::i;34709:431::-;;;;;;;;;;-1:-1:-1;34709:431:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;2070:87::-;;;;;;;;;;-1:-1:-1;2116:7:0;2143:6;-1:-1:-1;;;;;2143:6:0;2070:87;;40685:101;;;;;;;;;;-1:-1:-1;40685:101:0;;;;;:::i;:::-;;:::i;45824:489::-;;;;;;;;;;-1:-1:-1;45824:489:0;;;;;:::i;:::-;;:::i;33285:96::-;;;;;;;;;;;;;:::i;44744:1031::-;;;;;;;;;;-1:-1:-1;44744:1031:0;;;;;:::i;:::-;;:::i;60955:46::-;;;;;;;;;;-1:-1:-1;60955:46:0;;;;;:::i;:::-;;:::i;35947:147::-;;;;;;;;;;-1:-1:-1;35947:147:0;;;;;:::i;:::-;;:::i;40490:72::-;;;;;;;;;;;;;:::i;36805:277::-;;;;;;;;;;-1:-1:-1;36805:277:0;;;;;:::i;:::-;;:::i;61688:501::-;;;;;;:::i;:::-;;:::i;63489:87::-;;;;;;;;;;-1:-1:-1;63489:87:0;;;;;:::i;:::-;;:::i;43413:1001::-;;;;;;;;;;-1:-1:-1;43413:1001:0;;;;;:::i;:::-;;:::i;61469:211::-;;;;;;;;;;-1:-1:-1;61469:211:0;;;;;:::i;:::-;;:::i;33591:563::-;;;;;;;;;;-1:-1:-1;33591:563:0;;;;;:::i;:::-;;:::i;41665:95::-;;;;;;;;;;;;;:::i;40895:123::-;;;;;;;;;;-1:-1:-1;40895:123:0;;;;;:::i;:::-;;:::i;41026:286::-;;;;;;;;;;-1:-1:-1;41026:286:0;;;;;:::i;:::-;;:::i;43141:119::-;;;;;;;;;;-1:-1:-1;43141:119:0;;;;;:::i;:::-;;:::i;33389:194::-;;;;;;;;;;;;;:::i;31858:21::-;;;;;;;;;;-1:-1:-1;31858:21:0;;;;-1:-1:-1;;;;;31858:21:0;;;36102:294;;;;;;;;;;-1:-1:-1;36102:294:0;;;;;:::i;:::-;;:::i;42402:29::-;;;;;;;;;;;;;;;40570:107;;;;;;;;;;-1:-1:-1;40570:107:0;;;;;:::i;:::-;;:::i;2979:201::-;;;;;;;;;;-1:-1:-1;2979:201:0;;;;;:::i;:::-;;:::i;46564:202::-;;;;;;;;;;-1:-1:-1;46564:202:0;;;;;:::i;:::-;;:::i;32037:353::-;32116:4;-1:-1:-1;;;;;;32153:50:0;;-1:-1:-1;;;32153:50:0;;:115;;-1:-1:-1;;;;;;;32220:48:0;;-1:-1:-1;;;32220:48:0;32153:115;:172;;;-1:-1:-1;;;;;;;32285:40:0;;-1:-1:-1;;;32285:40:0;32153:172;:229;;;-1:-1:-1;;;;;;;32342:40:0;;-1:-1:-1;;;32342:40:0;32153:229;32133:249;32037:353;-1:-1:-1;;32037:353:0:o;62197:496::-;5364:1;5962:7;;:19;;5954:63;;;;-1:-1:-1;;;5954:63:0;;;;;;;:::i;:::-;;;;;;;;;5364:1;6095:7;:18;60589:10:::1;62321:15;:35;::::0;::::1;::::0;:71:::1;;;60648:10;62360:15;:32;62321:71;62313:111;;;::::0;-1:-1:-1;;;62313:111:0;;12342:2:1;62313:111:0::1;::::0;::::1;12324:21:1::0;12381:2;12361:18;;;12354:30;12420:29;12400:18;;;12393:57;12467:18;;62313:111:0::1;12140:351:1::0;62313:111:0::1;62435:55;804:10:::0;62451:12:::1;62465:5;62472:6;62480:9;62435:15;:55::i;:::-;62501:57;62513:1;804:10:::0;62516:12:::1;62530:5:::0;60780:1:::1;62544:13;60714:11;62530:5:::0;62544:13:::1;:::i;:::-;62501:11;:57::i;:::-;62574:9;62569:117;62593:5;62589:1;:9;62569:117;;;62670:4;62620:18;62639:27;804:10:::0;62639:13:::1;:27::i;:::-;62620:47;;;;;;;:::i;:::-;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;62600:3;;;;;:::i;:::-;;;;62569:117;;;-1:-1:-1::0;;5320:1:0;6274:22;;-1:-1:-1;;62197:496:0:o;33185:92::-;33231:13;33264:5;33257:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33185:92;:::o;35728:211::-;35796:7;35824:16;35832:7;35824;:16::i;:::-;35816:73;;;;-1:-1:-1;;;35816:73:0;;13660:2:1;35816:73:0;;;13642:21:1;13699:2;13679:18;;;13672:30;13738:34;13718:18;;;13711:62;-1:-1:-1;;;13789:18:1;;;13782:42;13841:19;;35816:73:0;13458:408:1;35816:73:0;-1:-1:-1;35907:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;35907:24:0;;35728:211::o;62701:428::-;5364:1;5962:7;;:19;;5954:63;;;;-1:-1:-1;;;5954:63:0;;;;;;;:::i;:::-;5364:1;6095:7;:18;60648:10:::1;62819:15;:33;;62811:71;;;::::0;-1:-1:-1;;;62811:71:0;;14073:2:1;62811:71:0::1;::::0;::::1;14055:21:1::0;14112:2;14092:18;;;14085:30;14151:27;14131:18;;;14124:55;14196:18;;62811:71:0::1;13871:349:1::0;62811:71:0::1;62893:55;804:10:::0;62909:12:::1;724:98:::0;62893:55:::1;62959:62;62971:1;804:10:::0;62988:5;60826:1:::1;63007:13;60714:11;62988:5:::0;63007:13:::1;:::i;62959:62::-;63037:9;63032:90;63056:5;63052:1;:9;63032:90;;;63083:27;804:10:::0;62639:13:::1;:27::i;63083:::-;-1:-1:-1::0;63063:3:0;::::1;::::0;::::1;:::i;:::-;;;;63032:90;;35365:355:::0;35438:13;35454:16;35462:7;35454;:16::i;:::-;35438:32;;35495:5;-1:-1:-1;;;;;35489:11:0;:2;-1:-1:-1;;;;;35489:11:0;;;35481:57;;;;-1:-1:-1;;;35481:57:0;;14427:2:1;35481:57:0;;;14409:21:1;14466:2;14446:18;;;14439:30;14505:34;14485:18;;;14478:62;-1:-1:-1;;;14556:18:1;;;14549:31;14597:19;;35481:57:0;14225:397:1;35481:57:0;804:10;-1:-1:-1;;;;;35557:21:0;;;;:62;;-1:-1:-1;35582:37:0;35599:5;804:10;36102:294;:::i;35582:37::-;35549:131;;;;-1:-1:-1;;;35549:131:0;;14829:2:1;35549:131:0;;;14811:21:1;14868:2;14848:18;;;14841:30;14907:34;14887:18;;;14880:62;14978:26;14958:18;;;14951:54;15022:19;;35549:131:0;14627:420:1;35549:131:0;35691:21;35700:2;35704:7;35691:8;:21::i;:::-;35427:293;35365:355;;:::o;43268:137::-;43339:4;43363:13;43377:19;43385:10;43377:7;:19::i;:::-;43363:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;43268:137;-1:-1:-1;;43268:137:0:o;36404:242::-;36504:41;804:10;36523:12;36537:7;36504:18;:41::i;:::-;36496:103;;;;-1:-1:-1;;;36496:103:0;;;;;;;:::i;:::-;36610:28;36620:4;36626:2;36630:7;36610:9;:28::i;59173:282::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;59250:21:::1;59241:6;:30;59237:79;;;-1:-1:-1::0;59295:21:0::1;59237:79;59327:13;59359:3;59344:11;:6:::0;59353:2:::1;59344:11;:::i;:::-;59343:19;;;;:::i;:::-;59327:35;;59373:27;59384:5;59390:1;59384:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;59384:8:0::1;59394:5:::0;59373:10:::1;:27::i;:::-;59411:36;59422:5;59428:1;59422:8;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;59422:8:0::1;59432:14;59441:5:::0;59432:6;:14:::1;:::i;:::-;59411:10;:36::i;:::-;59226:229;59173:282:::0;:::o;34162:539::-;34251:15;34295:16;34305:5;34295:9;:16::i;:::-;34287:5;:24;34279:80;;;;-1:-1:-1;;;34279:80:0;;;;;;;:::i;:::-;34370:13;34399:9;34394:228;34414:14;34410:1;:18;34394:228;;;34463:7;34471:1;34463:10;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;34454:19:0;;;34463:10;;34454:19;34450:161;;;34507:5;34498;:14;34494:101;;;34542:1;-1:-1:-1;34535:8:0;;-1:-1:-1;34535:8:0;34494:101;34588:7;;;:::i;:::-;;;34494:101;34430:3;;;:::i;:::-;;;34394:228;;;-1:-1:-1;34632:61:0;;-1:-1:-1;;;34632:61:0;;;;;;;:::i;36654:143::-;36750:39;36767:4;36773:2;36777:7;36750:39;;;;;;;;;;;;:16;:39::i;42678:455::-;42737:41;804:10;42756:12;724:98;42737:41;42729:102;;;;-1:-1:-1;;;42729:102:0;;17113:2:1;42729:102:0;;;17095:21:1;17152:2;17132:18;;;17125:30;17191:34;17171:18;;;17164:62;-1:-1:-1;;;17242:18:1;;;17235:46;17298:19;;42729:102:0;16911:412:1;42729:102:0;42842:14;42848:7;42842:5;:14::i;:::-;42935:19;;;;:10;:19;;;;;42929:33;;;;;:::i;:::-;:38;;-1:-1:-1;42925:201:0;;43003:19;;;;:10;:19;;;;;42984:46;;;;43003:19;42984:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43024:5;42984:18;:46::i;:::-;43052:19;;;;:10;:19;;;;;43045:26;;;:::i;:::-;43102:7;43091:23;;;;;17530:2:1;17512:21;;;17569:1;17549:18;;;17542:29;17603:2;17588:18;;17328:284;43091:23:0;;;;;;;;42925:201;42678:455;:::o;40794:93::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;40864:15;;::::1;::::0;:8:::1;::::0;:15:::1;::::0;::::1;::::0;::::1;:::i;32829:231::-:0;32893:7;32913:13;32929:7;32937;32929:16;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;32929:16:0;;-1:-1:-1;32964:19:0;32956:73;;;;-1:-1:-1;;;32956:73:0;;17819:2:1;32956:73:0;;;17801:21:1;17858:2;17838:18;;;17831:30;17897:34;17877:18;;;17870:62;-1:-1:-1;;;17948:18:1;;;17941:39;17997:19;;32956:73:0;17617:405:1;46526:29:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58121:95::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;58189:7:::1;:19:::0;;-1:-1:-1;;;;;;58189:19:0::1;-1:-1:-1::0;;;;;58189:19:0;;;::::1;::::0;;;::::1;::::0;;58121:95::o;41551:90::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;41617:6:::1;:16:::0;;-1:-1:-1;;;;;;41617:16:0::1;-1:-1:-1::0;;;;;41617:16:0;;;::::1;::::0;;;::::1;::::0;;41551:90::o;32398:423::-;32462:7;-1:-1:-1;;;;;32490:19:0;;32482:74;;;;-1:-1:-1;;;32482:74:0;;18229:2:1;32482:74:0;;;18211:21:1;18268:2;18248:18;;;18241:30;18307:34;18287:18;;;18280:62;-1:-1:-1;;;18358:18:1;;;18351:40;18408:19;;32482:74:0;18027:406:1;32482:74:0;32567:13;32612:14;32567:13;32637:130;32661:6;32657:1;:10;32637:130;;;32702:7;32710:1;32702:10;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;32693:19:0;;;32702:10;;32693:19;32689:67;;;32733:7;;;:::i;:::-;;;32689:67;32669:3;;;:::i;:::-;;;32637:130;;;-1:-1:-1;32808:5:0;;32398:423;-1:-1:-1;;;32398:423:0:o;2721:103::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;2786:30:::1;2813:1;2786:18;:30::i;:::-;2721:103::o:0;33068:109::-;33126:7;33153;33161;33153:16;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;33153:16:0;;33068:109;-1:-1:-1;;33068:109:0:o;9494:320::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;9596:25:::1;9624:35;9646:12;9624:21;:35::i;:::-;9596:63;;9688:17;9678:6;:27;;9670:89;;;::::0;-1:-1:-1;;;9670:89:0;;18640:2:1;9670:89:0::1;::::0;::::1;18622:21:1::0;18679:2;18659:18;;;18652:30;18718:34;18698:18;;;18691:62;-1:-1:-1;;;18769:18:1;;;18762:47;18826:19;;9670:89:0::1;18438:413:1::0;9670:89:0::1;9770:36;9781:12;9795:6;9803:2;9770:10;:36::i;:::-;9585:229;9494:320:::0;;;:::o;34709:431::-;34768:16;34809;34819:5;34809:9;:16::i;:::-;34805:1;:20;34797:76;;;;-1:-1:-1;;;34797:76:0;;;;;;;:::i;:::-;34884:18;34905:16;34915:5;34905:9;:16::i;:::-;34884:37;;34932:25;34974:10;-1:-1:-1;;;;;34960:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34960:25:0;;34932:53;;35001:9;34996:111;35020:10;35016:1;:14;34996:111;;;35066:29;35086:5;35093:1;35066:19;:29::i;:::-;35052:8;35061:1;35052:11;;;;;;;;:::i;:::-;;;;;;;;;;:43;35032:3;;;;:::i;:::-;;;;34996:111;;;-1:-1:-1;35124:8:0;34709:431;-1:-1:-1;;;34709:431:0:o;40685:101::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;40759:19;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;45824:489::-:0;45881:13;45907:17;45933:3;45907:30;;45948:19;45980:4;:11;-1:-1:-1;;;;;45970:22:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45970:22:0;;45948:44;;46008:9;46003:271;46027:4;:11;46023:1;:15;46003:271;;;46119:2;46107:4;46112:1;46107:7;;;;;;;;:::i;:::-;;;;;;;46101:20;;;;46100:48;;;46145:2;46133:4;46138:1;46133:7;;;;;;;;:::i;:::-;;;;;;;46127:20;;46100:48;46096:166;;;46192:4;46197:1;46192:7;;;;;;;;:::i;:::-;;;;;;;;;46186:14;;46203:2;46186:19;;;;:::i;:::-;46179:27;;46167:6;46174:1;46167:9;;;;;;;;:::i;:::-;;;;:39;-1:-1:-1;;;;;46167:39:0;;;;;;;;;46096:166;;;46255:4;46260:1;46255:7;;;;;;;;:::i;:::-;;;;;;;;;46243:6;46250:1;46243:9;;;;;;;;:::i;:::-;;;;:19;-1:-1:-1;;;;;46243:19:0;;;;;;;;;46096:166;46040:3;;;;:::i;:::-;;;;46003:271;;33285:96;33333:13;33366:7;33359:14;;;;;:::i;44744:1031::-;44806:4;44823:14;44846:3;44823:27;;44876:1;44865;:8;:12;44861:43;;;-1:-1:-1;44899:5:0;;44744:1031;-1:-1:-1;;44744:1031:0:o;44861:43::-;44978:2;44967:1;:8;:13;44963:44;;;-1:-1:-1;45002:5:0;;44744:1031;-1:-1:-1;;44744:1031:0:o;44963:44::-;45048:1;45050;45048:4;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;45048:4:0;-1:-1:-1;;;45048:12:0;45044:43;;;-1:-1:-1;45082:5:0;;44744:1031;-1:-1:-1;;44744:1031:0:o;45044:43::-;45129:1;45142;45131;:8;:12;;;;:::i;:::-;45129:15;;;;;;;;:::i;:::-;;;;;;-1:-1:-1;;;;;;45129:15:0;-1:-1:-1;;;45129:23:0;45125:54;;;-1:-1:-1;45174:5:0;;44744:1031;-1:-1:-1;;44744:1031:0:o;45125:54::-;45192:15;45210:1;45212;45210:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;45210:4:0;;-1:-1:-1;45232:9:0;45227:519;45247:1;:8;45243:1;:12;45227:519;;;45277:11;45291:1;45293;45291:4;;;;;;;;:::i;:::-;;;;;-1:-1:-1;;;;;;45291:4:0;;-1:-1:-1;;;;45362:12:0;;:32;;;;-1:-1:-1;;;;;;;;;;45378:16:0;;;45362:32;45358:67;;;-1:-1:-1;45420:5:0;;44744:1031;-1:-1:-1;;;;;44744:1031:0:o;45358:67::-;-1:-1:-1;;;;;;;;;45464:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;45480:12:0;;;;45464:28;45462:31;:89;;;;-1:-1:-1;;;;;;;;;;45522:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;45538:12:0;;;;45522:28;45520:31;45462:89;:147;;;;-1:-1:-1;;;;;;;;;;45580:12:0;;;;;;:28;;-1:-1:-1;;;;;;;;;;45596:12:0;;;;45580:28;45578:31;45462:147;:189;;;;-1:-1:-1;;;;;;;;;;45638:12:0;;;45636:15;45462:189;45440:264;;;-1:-1:-1;45699:5:0;;44744:1031;-1:-1:-1;;;;;44744:1031:0:o;45440:264::-;45730:4;-1:-1:-1;45257:3:0;;;;:::i;:::-;;;;45227:519;;;-1:-1:-1;45763:4:0;;44744:1031;-1:-1:-1;;;;44744:1031:0:o;60955:46::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35947:147::-;36034:52;804:10;36067:8;36077;36034:18;:52::i;40490:72::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;40538:9:::1;:16:::0;;-1:-1:-1;;40538:16:0::1;40550:4;40538:16;::::0;;40490:72::o;36805:277::-;36929:41;804:10;36962:7;36929:18;:41::i;:::-;36921:103;;;;-1:-1:-1;;;36921:103:0;;;;;;;:::i;:::-;37035:39;37049:4;37055:2;37059:7;37068:5;37035:13;:39::i;61688:501::-;5364:1;5962:7;;:19;;5954:63;;;;-1:-1:-1;;;5954:63:0;;;;;;;:::i;:::-;5364:1;6095:7;:18;60528:10:::1;61813:15;:36;::::0;::::1;::::0;:74:::1;;;60589:10;61853:15;:34;61813:74;61805:115;;;::::0;-1:-1:-1;;;61805:115:0;;19267:2:1;61805:115:0::1;::::0;::::1;19249:21:1::0;19306:2;19286:18;;;19279:30;19345;19325:18;;;19318:58;19393:18;;61805:115:0::1;19065:352:1::0;61805:115:0::1;61931:55;804:10:::0;61947:12:::1;724:98:::0;61931:55:::1;61997:57;62009:1;804:10:::0;62012:12:::1;724:98:::0;61997:57:::1;62070:9;62065:117;62089:5;62085:1;:9;62065:117;;;62166:4;62116:18;62135:27;804:10:::0;62639:13:::1;:27::i;62135:::-;62116:47;;;;;;;:::i;:::-;;;;;;;;;;:54;;;;;;;;;;;;;;;;;;62096:3;;;;;:::i;:::-;;;;62065:117;;63489:87:::0;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;63551:7:::1;:17:::0;;-1:-1:-1;;63551:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;63489:87::o;43413:1001::-;43493:13;43509:16;43517:7;43509;:16::i;:::-;43493:32;-1:-1:-1;804:10:0;-1:-1:-1;;;;;43544:21:0;;;43536:75;;;;-1:-1:-1;;;43536:75:0;;19624:2:1;43536:75:0;;;19606:21:1;19663:2;19643:18;;;19636:30;19702:34;19682:18;;;19675:62;-1:-1:-1;;;19753:18:1;;;19746:39;19802:19;;43536:75:0;19422:405:1;43536:75:0;43630:21;43643:7;43630:12;:21::i;:::-;:29;;43655:4;43630:29;43622:74;;;;-1:-1:-1;;;43622:74:0;;20034:2:1;43622:74:0;;;20016:21:1;;;20053:18;;;20046:30;20112:34;20092:18;;;20085:62;20164:18;;43622:74:0;19832:356:1;43622:74:0;43754:19;;;;:10;:19;;;;;;;43741:34;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43715:22;43728:7;43715:22;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:60;;43707:120;;;;-1:-1:-1;;;43707:120:0;;22060:2:1;43707:120:0;;;22042:21:1;22099:2;22079:18;;;22072:30;22138:34;22118:18;;;22111:62;-1:-1:-1;;;22189:18:1;;;22182:45;22244:19;;43707:120:0;21858:411:1;43707:120:0;43846:23;43861:7;43846:14;:23::i;:::-;:32;43838:78;;;;-1:-1:-1;;;43838:78:0;;22476:2:1;43838:78:0;;;22458:21:1;22515:2;22495:18;;;22488:30;22554:34;22534:18;;;22527:62;-1:-1:-1;;;22605:18:1;;;22598:31;22646:19;;43838:78:0;22274:397:1;43838:78:0;-1:-1:-1;;;;;43946:4:0;43935:29;;804:10;43935:77;;-1:-1:-1;;;;;;43935:77:0;;;;;;;-1:-1:-1;;;;;22934:15:1;;;43935:77:0;;;22916:34:1;43987:4:0;22966:18:1;;;22959:43;42385:10:0;23018:18:1;;;23011:34;22851:18;;43935:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;43927:123;;;;-1:-1:-1;;;43927:123:0;;23508:2:1;43927:123:0;;;23490:21:1;23547:2;23527:18;;;23520:30;23586:34;23566:18;;;23559:62;-1:-1:-1;;;23637:18:1;;;23630:31;23678:19;;43927:123:0;23306:397:1;43927:123:0;44061:40;;-1:-1:-1;;;44061:40:0;;42385:10;44061:40;;;4195:25:1;44072:4:0;-1:-1:-1;;;;;44061:21:0;;;;4168:18:1;;44061:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;44203:1:0;44173:19;;;:10;:19;;;;;44167:33;;44203:1;;-1:-1:-1;44173:19:0;44167:33;;;:::i;:::-;;;:37;44163:116;;;44240:19;;;;:10;:19;;;;;44221:46;;;;44240:19;44221:46;;;:::i;:::-;44289:33;44308:7;44317:4;44289:18;:33::i;:::-;44333:19;;;;:10;:19;;;;;;;;:29;;;;;;;;:::i;:::-;;44389:7;44378:28;44398:7;44378:28;;;;;;:::i;:::-;;;;;;;;43482:932;43413:1001;;:::o;61469:211::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;61552:9:::1;61547:126;61571:8;:15;61567:1;:19;61547:126;;;61657:4;61608:18;61627:26;61641:8;61650:1;61641:11;;;;;;;;:::i;:::-;;;;;;;61627:13;:26::i;:::-;61608:46;;;;;;;:::i;:::-;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;61588:3;;;;;:::i;:::-;;;;61547:126;;33591:563:::0;33658:13;33692:16;33700:7;33692;:16::i;:::-;33684:76;;;;-1:-1:-1;;;33684:76:0;;23910:2:1;33684:76:0;;;23892:21:1;23949:2;23929:18;;;23922:30;23988:34;23968:18;;;23961:62;-1:-1:-1;;;24039:18:1;;;24032:45;24094:19;;33684:76:0;23708:411:1;33684:76:0;33778:9;;;;33773:51;;33809:15;33802:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33591:563;;;:::o;33773:51::-;33841:6;;-1:-1:-1;;;;;33841:6:0;:20;33837:88;;33900:6;;33883:42;;-1:-1:-1;;;33883:42:0;;;;;4195:25:1;;;-1:-1:-1;;;;;33900:6:0;;;;33883:33;;4168:18:1;;33883:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33883:42:0;;;;;;;;;;;;:::i;33837:88::-;33938:23;33964:19;;;:10;:19;;;;;33938:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34024:1;34004:9;33998:23;:27;33994:62;;;34047:9;33591:563;-1:-1:-1;;33591:563:0:o;33994:62::-;34100:8;34110:18;:7;:16;:18::i;:::-;34130:14;34083:62;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;34069:77;;;33591:563;;;:::o;41665:95::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;41725:14:::1;:27:::0;;-1:-1:-1;;;;;;41725:27:0::1;::::0;;41665:95::o;40895:123::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;40980:30;;::::1;::::0;:14:::1;::::0;:30:::1;::::0;::::1;::::0;::::1;:::i;41026:286::-:0;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;41144:4:::1;:11;41130:3;:10;:25;41122:75;;;::::0;-1:-1:-1;;;41122:75:0;;25433:2:1;41122:75:0::1;::::0;::::1;25415:21:1::0;25472:2;25452:18;;;25445:30;25511:34;25491:18;;;25484:62;-1:-1:-1;;;25562:18:1;;;25555:35;25607:19;;41122:75:0::1;25231:401:1::0;41122:75:0::1;41213:9;41208:97;41232:3;:10;41228:1;:14;41208:97;;;41264:29;41277:3;41281:1;41277:6;;;;;;;;:::i;:::-;;;;;;;41285:4;41290:1;41285:7;;;;;;;;:::i;:::-;;;;;;;41264:12;:29::i;:::-;41244:3:::0;::::1;::::0;::::1;:::i;:::-;;;;41208:97;;43141:119:::0;43233:19;;;;:10;:19;;;;;43226:26;;43200:13;;43233:19;43226:26;;;:::i;33389:194::-;33465:6;;33435:13;;-1:-1:-1;;;;;33465:6:0;:20;33461:84;;33524:6;;;;;;;;;-1:-1:-1;;;;;33524:6:0;-1:-1:-1;;;;;33507:36:0;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33507:38:0;;;;;;;;;;;;:::i;:::-;33500:45;;33389:194;:::o;33461:84::-;33563:12;33556:19;;;;;:::i;36102:294::-;36212:14;;36191:4;;-1:-1:-1;;;;;36212:14:0;:28;;;;:97;;-1:-1:-1;36266:14:0;;36252:44;;-1:-1:-1;;;36252:44:0;;-1:-1:-1;;;;;3223:32:1;;;36252:44:0;;;3205:51:1;36244:65:0;;;;36266:14;;36252:37;;3178:18:1;;36252:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36244:65:0;;36212:97;36208:127;;;-1:-1:-1;36331:4:0;36324:11;;36208:127;-1:-1:-1;;;;;;36353:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36102:294::o;40570:107::-;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;40647:22;;::::1;::::0;:15:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;2979:201::-:0;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;3068:22:0;::::1;3060:73;;;::::0;-1:-1:-1;;;3060:73:0;;26124:2:1;3060:73:0::1;::::0;::::1;26106:21:1::0;26163:2;26143:18;;;26136:30;26202:34;26182:18;;;26175:62;-1:-1:-1;;;26253:18:1;;;26246:36;26299:19;;3060:73:0::1;25922:402:1::0;3060:73:0::1;3144:28;3163:8;3144:18;:28::i;46564:202::-:0;2116:7;2143:6;-1:-1:-1;;;;;2143:6:0;804:10;2290:23;2282:68;;;;-1:-1:-1;;;2282:68:0;;;;;;;:::i;:::-;46658:10:::1;46652:24;;;;;:::i;:::-;:29:::0;;-1:-1:-1;46644:79:0::1;;;::::0;-1:-1:-1;;;46644:79:0;;26531:2:1;46644:79:0::1;::::0;::::1;26513:21:1::0;26570:2;26550:18;;;26543:30;26609:34;26589:18;;;26582:62;-1:-1:-1;;;26660:18:1;;;26653:35;26705:19;;46644:79:0::1;26329:401:1::0;46644:79:0::1;46734:24:::0;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;58224:299::-:0;58349:22;;;;:14;:22;;;;;;;;58348:23;:88;;;;-1:-1:-1;58429:7:0;;-1:-1:-1;;;;;58429:7:0;58375:50;58392:6;58400:5;58407:6;58415:9;58375:16;:50::i;:::-;-1:-1:-1;;;;;58375:61:0;;58348:88;58340:135;;;;-1:-1:-1;;;58340:135:0;;26937:2:1;58340:135:0;;;26919:21:1;26976:2;26956:18;;;26949:30;27015:34;26995:18;;;26988:62;-1:-1:-1;;;27066:18:1;;;27059:32;27108:19;;58340:135:0;26735:398:1;58340:135:0;-1:-1:-1;58486:22:0;;;;:14;:22;;;;;:29;;-1:-1:-1;;58486:29:0;58511:4;58486:29;;;-1:-1:-1;;58224:299:0:o;63137:344::-;63270:15;;;;:8;:15;;;;;;;;-1:-1:-1;;;;;63270:23:0;;;;;;;;;;63305:5;;63270:31;;63296:5;;63270:31;:::i;:::-;:40;;63262:78;;;;-1:-1:-1;;;63262:78:0;;27473:2:1;63262:78:0;;;27455:21:1;27512:2;27492:18;;;27485:30;27551:27;27531:18;;;27524:55;27596:18;;63262:78:0;27271:349:1;63262:78:0;63372:14;63359:9;:27;;63351:79;;;;-1:-1:-1;;;63351:79:0;;27827:2:1;63351:79:0;;;27809:21:1;27866:2;27846:18;;;27839:30;27905:34;27885:18;;;27878:62;-1:-1:-1;;;27956:18:1;;;27949:37;28003:19;;63351:79:0;27625:403:1;63351:79:0;63441:15;;;;:8;:15;;;;;;;;-1:-1:-1;;;;;63441:23:0;;;;;;;;;:32;;63468:5;;63441:15;:32;;63468:5;;63441:32;:::i;:::-;;;;-1:-1:-1;;;;;;;63137:344:0:o;47114:152::-;47172:15;47210:14;:12;:14::i;:::-;47200:24;;47235:23;47241:7;47250;47235:5;:23::i;:::-;47114:152;;;:::o;37362:119::-;37419:4;;37443:7;37451;37443:16;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;37443:16:0;:30;;;37362:119;-1:-1:-1;;37362:119:0:o;39261:159::-;39328:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;39328:29:0;-1:-1:-1;;;;;39328:29:0;;;;;;;;:24;;39382:16;39328:24;39382:7;:16::i;:::-;-1:-1:-1;;;;;39373:39:0;;;;;;;;;;;39261:159;;:::o;37489:370::-;37574:4;37599:16;37607:7;37599;:16::i;:::-;37591:73;;;;-1:-1:-1;;;37591:73:0;;28235:2:1;37591:73:0;;;28217:21:1;28274:2;28254:18;;;28247:30;28313:34;28293:18;;;28286:62;-1:-1:-1;;;28364:18:1;;;28357:42;28416:19;;37591:73:0;28033:408:1;37591:73:0;37675:13;37691:16;37699:7;37691;:16::i;:::-;37675:32;;37749:5;-1:-1:-1;;;;;37738:16:0;:7;-1:-1:-1;;;;;37738:16:0;;:64;;;;37795:7;-1:-1:-1;;;;;37771:31:0;:20;37783:7;37771:11;:20::i;:::-;-1:-1:-1;;;;;37771:31:0;;37738:64;:113;;;;37819:32;37836:5;37843:7;37819:16;:32::i;:::-;37718:133;37489:370;-1:-1:-1;;;;37489:370:0:o;38890:363::-;39000:4;-1:-1:-1;;;;;38980:24:0;:16;38988:7;38980;:16::i;:::-;-1:-1:-1;;;;;38980:24:0;;38972:78;;;;-1:-1:-1;;;38972:78:0;;28648:2:1;38972:78:0;;;28630:21:1;28687:2;28667:18;;;28660:30;28726:34;28706:18;;;28699:62;-1:-1:-1;;;28777:18:1;;;28770:39;28826:19;;38972:78:0;28446:405:1;38972:78:0;-1:-1:-1;;;;;39069:16:0;;39061:65;;;;-1:-1:-1;;;39061:65:0;;29058:2:1;39061:65:0;;;29040:21:1;29097:2;29077:18;;;29070:30;29136:34;29116:18;;;29109:62;-1:-1:-1;;;29187:18:1;;;29180:34;29231:19;;39061:65:0;28856:400:1;39061:65:0;39139:29;39156:1;39160:7;39139:8;:29::i;:::-;39198:2;39179:7;39187;39179:16;;;;;;;:::i;:::-;;:21;;-1:-1:-1;;;;;;39179:21:0;-1:-1:-1;;;;;39179:21:0;;;;;;39218:27;;39237:7;;39218:27;;;;;;;;;;-1:-1:-1;;39218:27:0;38890:363;;;:::o;59463:241::-;59538:12;59556:9;-1:-1:-1;;;;;59556:14:0;59578:6;59556:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59537:52;;;59608:7;59600:51;;;;-1:-1:-1;;;59600:51:0;;29673:2:1;59600:51:0;;;29655:21:1;29712:2;29692:18;;;29685:30;29751:33;29731:18;;;29724:61;29802:18;;59600:51:0;29471:355:1;59600:51:0;59678:9;-1:-1:-1;;;;;59667:29:0;;59689:6;59667:29;;;;4195:25:1;;4183:2;4168:18;;4049:177;38541:341:0;38593:13;38609:16;38617:7;38609;:16::i;:::-;38593:32;;38636:29;38653:1;38657:7;38636:8;:29::i;:::-;38703:1;38676:7;38684;38676:16;;;;;;;:::i;:::-;;:29;;-1:-1:-1;;;;;;38676:29:0;-1:-1:-1;;;;;38676:29:0;;;;;;;;;;38716:6;:8;;;-1:-1:-1;38716:8:0;;;:::i;:::-;;;;-1:-1:-1;;38747:19:0;;;;:10;:19;;;;;38741:33;;;;;:::i;:::-;:38;;-1:-1:-1;38737:83:0;;38801:19;;;;:10;:19;;;;;38794:26;;;:::i;:::-;38838:36;;38866:7;;38862:1;;-1:-1:-1;;;;;38838:36:0;;;;;38862:1;;38838:36;38582:300;38541:341;:::o;44505:129::-;44617:9;44587:13;44601:12;44609:3;44601:7;:12::i;:::-;44587:27;;;;;;:::i;:::-;;;;;;;;;;;;;;:39;;;;;-1:-1:-1;;44587:39:0;;;;;;;;;-1:-1:-1;;44505:129:0:o;3340:191::-;3414:16;3433:6;;-1:-1:-1;;;;;3450:17:0;;;-1:-1:-1;;;;;;3450:17:0;;;;;;3483:40;;3433:6;;;;;;;3483:40;;3414:16;3483:40;3403:128;3340:191;:::o;9822:155::-;9924:45;;-1:-1:-1;;;9924:45:0;;9963:4;9924:45;;;3205:51:1;9897:7:0;;-1:-1:-1;;;;;9924:30:0;;;;;3178:18:1;;9924:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;9985:387::-;10195:46;;;-1:-1:-1;;;;;30353:32:1;;;10195:46:0;;;30335:51:1;30402:18;;;;30395:34;;;10195:46:0;;;;;;;;;;30308:18:1;;;;10195:46:0;;;;;;;-1:-1:-1;;;;;10195:46:0;-1:-1:-1;;;10195:46:0;;;10177:65;;-1:-1:-1;;;;10177:17:0;;;;:65;;10195:46;10177:65;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10141:101;;;;10261:7;:57;;;;-1:-1:-1;10273:11:0;;:16;;:44;;;10304:4;10293:24;;;;;;;;;;;;:::i;:::-;10253:111;;;;-1:-1:-1;;;10253:111:0;;30642:2:1;10253:111:0;;;30624:21:1;30681:2;30661:18;;;30654:30;30720:34;30700:18;;;30693:62;-1:-1:-1;;;30771:18:1;;;30764:39;30820:19;;10253:111:0;30440:405:1;10253:111:0;10063:309;;9985:387;;;:::o;39428:273::-;39541:8;-1:-1:-1;;;;;39532:17:0;:5;-1:-1:-1;;;;;39532:17:0;;;39524:55;;;;-1:-1:-1;;;39524:55:0;;31052:2:1;39524:55:0;;;31034:21:1;31091:2;31071:18;;;31064:30;31130:27;31110:18;;;31103:55;31175:18;;39524:55:0;30850:349:1;39524:55:0;-1:-1:-1;;;;;39590:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;39590:46:0;;;;;;;;;;39652:41;;540::1;;;39652::0;;513:18:1;39652:41:0;;;;;;;39428:273;;;:::o;37090:264::-;37196:28;37206:4;37212:2;37216:7;37196:9;:28::i;:::-;37243:48;37266:4;37272:2;37276:7;37285:5;37243:22;:48::i;:::-;37235:111;;;;-1:-1:-1;;;37235:111:0;;;;;;;:::i;18923:723::-;18979:13;19200:10;19196:53;;-1:-1:-1;;19227:10:0;;;;;;;;;;;;-1:-1:-1;;;19227:10:0;;;;;18923:723::o;19196:53::-;19274:5;19259:12;19315:78;19322:9;;19315:78;;19348:8;;;;:::i;:::-;;-1:-1:-1;19371:10:0;;-1:-1:-1;19379:2:0;19371:10;;:::i;:::-;;;19315:78;;;19403:19;19435:6;-1:-1:-1;;;;;19425:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;19425:17:0;;19403:39;;19453:154;19460:10;;19453:154;;19487:11;19497:1;19487:11;;:::i;:::-;;-1:-1:-1;19556:10:0;19564:2;19556:5;:10;:::i;:::-;19543:24;;:2;:24;:::i;:::-;19530:39;;19513:6;19520;19513:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;19513:56:0;;;;;;;;-1:-1:-1;19584:11:0;19593:2;19584:11;;:::i;:::-;;;19453:154;;41320:208;41411:16;41419:7;41411;:16::i;:::-;41403:75;;;;-1:-1:-1;;;41403:75:0;;31942:2:1;41403:75:0;;;31924:21:1;31981:2;31961:18;;;31954:30;32020:34;32000:18;;;31993:62;-1:-1:-1;;;32071:18:1;;;32064:44;32125:19;;41403:75:0;31740:410:1;41403:75:0;41489:19;;;;:10;:19;;;;;;;;:31;;;;;;;;:::i;58531:225::-;58702:33;;;-1:-1:-1;;;;;32375:32:1;;58702:33:0;;;32357:51:1;32424:18;;;32417:34;;;32467:18;;;32460:34;;;58650:7:0;;58677:71;;32330:18:1;;58702:33:0;;;;;;;;;;;;58692:44;;;;;;58738:9;58677:13;:71::i;:::-;58670:78;58531:225;-1:-1:-1;;;;;58531:225:0:o;47274:784::-;47315:7;47335:17;47368:13;35228:6;;;35148:94;47368:13;47355:26;;31598:5;47355:26;:::i;:::-;47457:12;:14;;47335:46;;-1:-1:-1;47392:13:0;;47335:46;;47392:13;47457:14;;;:::i;:::-;;;;-1:-1:-1;47440:81:0;;;;;;32718:19:1;;;;-1:-1:-1;;804:10:0;32775:2:1;32771:15;32767:53;32753:12;;;32746:75;47487:16:0;32837:12:1;;;32830:28;47505:15:0;32874:12:1;;;32867:28;32911:13;;47440:81:0;;;;;;;;;;;;47430:92;;;;;;47408:125;;:137;;;;:::i;:::-;47392:153;;47558:13;47590:8;47599:5;47590:15;;;;;;;:::i;:::-;;;:20;47586:104;;47633:8;47642:5;47633:15;;;;;;;:::i;:::-;;;47625:23;;47586:104;;;-1:-1:-1;47685:5:0;47586:104;47756:8;47765:13;47777:1;47765:9;:13;:::i;:::-;47756:23;;;;;;;:::i;:::-;;;47752:269;;47881:13;47893:1;47881:9;:13;:::i;:::-;47863:8;47872:5;47863:15;;;;;;;:::i;:::-;;:31;47752:269;;;47998:8;48007:13;48019:1;48007:9;:13;:::i;:::-;47998:23;;;;;;;:::i;:::-;;;47980:8;47989:5;47980:15;;;;;;;:::i;:::-;;:41;47752:269;48041:9;:5;48049:1;48041:9;:::i;:::-;48034:16;;;;;47274:784;:::o;38231:302::-;-1:-1:-1;;;;;38303:16:0;;38295:61;;;;-1:-1:-1;;;38295:61:0;;33137:2:1;38295:61:0;;;33119:21:1;;;33156:18;;;33149:30;33215:34;33195:18;;;33188:62;33267:18;;38295:61:0;32935:356:1;38295:61:0;38376:16;38384:7;38376;:16::i;:::-;38375:17;38367:58;;;;-1:-1:-1;;;38367:58:0;;33498:2:1;38367:58:0;;;33480:21:1;33537:2;33517:18;;;33510:30;33576;33556:18;;;33549:58;33624:18;;38367:58:0;33296:352:1;38367:58:0;38455:2;38436:7;38444;38436:16;;;;;;;:::i;:::-;;:21;;-1:-1:-1;;;;;;38436:21:0;-1:-1:-1;;;;;38436:21:0;;;;;;;;;;38468:6;:8;;;-1:-1:-1;38468:8:0;;;:::i;:::-;;;;-1:-1:-1;;38492:33:0;;38517:7;;-1:-1:-1;;;;;38492:33:0;;;38509:1;;38492:33;;38509:1;;38492:33;38231:302;;:::o;39709:756::-;39821:4;-1:-1:-1;;;;;39842:13:0;;11536:20;11584:8;39838:620;;39878:72;;-1:-1:-1;;;39878:72:0;;-1:-1:-1;;;;;39878:36:0;;;;;:72;;804:10;;39929:4;;39935:7;;39944:5;;39878:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39878:72:0;;;;;;;;-1:-1:-1;;39878:72:0;;;;;;;;;;;;:::i;:::-;;;39874:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40120:13:0;;40116:272;;40163:60;;-1:-1:-1;;;40163:60:0;;;;;;;:::i;40116:272::-;40338:6;40332:13;40323:6;40319:2;40315:15;40308:38;39874:529;-1:-1:-1;;;;;;40001:51:0;-1:-1:-1;;;40001:51:0;;-1:-1:-1;39994:58:0;;39838:620;-1:-1:-1;40442:4:0;40435:11;;52537:231;52615:7;52636:17;52655:18;52677:27;52688:4;52694:9;52677:10;:27::i;:::-;52635:69;;;;52715:18;52727:5;52715:11;:18::i;50427:1308::-;50508:7;50517:12;50742:9;:16;50762:2;50742:22;50738:990;;;51038:4;51023:20;;51017:27;51088:4;51073:20;;51067:27;51146:4;51131:20;;51125:27;50781:9;51117:36;51189:25;51200:4;51117:36;51017:27;51067;51189:10;:25::i;:::-;51182:32;;;;;;;;;50738:990;51236:9;:16;51256:2;51236:22;51232:496;;;51511:4;51496:20;;51490:27;51562:4;51547:20;;51541:27;51604:23;51615:4;51490:27;51541;51604:10;:23::i;:::-;51597:30;;;;;;;;51232:496;-1:-1:-1;51676:1:0;;-1:-1:-1;51680:35:0;51232:496;50427:1308;;;;;:::o;48698:643::-;48776:20;48767:5;:29;;;;;;;;:::i;:::-;;48763:571;;;48698:643;:::o;48763:571::-;48874:29;48865:5;:38;;;;;;;;:::i;:::-;;48861:473;;;48920:34;;-1:-1:-1;;;48920:34:0;;34735:2:1;48920:34:0;;;34717:21:1;34774:2;34754:18;;;34747:30;34813:26;34793:18;;;34786:54;34857:18;;48920:34:0;34533:348:1;48861:473:0;48985:35;48976:5;:44;;;;;;;;:::i;:::-;;48972:362;;;49037:41;;-1:-1:-1;;;49037:41:0;;35088:2:1;49037:41:0;;;35070:21:1;35127:2;35107:18;;;35100:30;35166:33;35146:18;;;35139:61;35217:18;;49037:41:0;34886:355:1;48972:362:0;49109:30;49100:5;:39;;;;;;;;:::i;:::-;;49096:238;;;49156:44;;-1:-1:-1;;;49156:44:0;;35448:2:1;49156:44:0;;;35430:21:1;35487:2;35467:18;;;35460:30;35526:34;35506:18;;;35499:62;-1:-1:-1;;;35577:18:1;;;35570:32;35619:19;;49156:44:0;35246:398:1;49096:238:0;49231:30;49222:5;:39;;;;;;;;:::i;:::-;;49218:116;;;49278:44;;-1:-1:-1;;;49278:44:0;;35851:2:1;49278:44:0;;;35833:21:1;35890:2;35870:18;;;35863:30;35929:34;35909:18;;;35902:62;-1:-1:-1;;;35980:18:1;;;35973:32;36022:19;;49278:44:0;35649:398:1;54036:1632:0;54167:7;;55101:66;55088:79;;55084:163;;;-1:-1:-1;55200:1:0;;-1:-1:-1;55204:30:0;55184:51;;55084:163;55261:1;:7;;55266:2;55261:7;;:18;;;;;55272:1;:7;;55277:2;55272:7;;55261:18;55257:102;;;-1:-1:-1;55312:1:0;;-1:-1:-1;55316:30:0;55296:51;;55257:102;55473:24;;;55456:14;55473:24;;;;;;;;;36279:25:1;;;36352:4;36340:17;;36320:18;;;36313:45;;;;36374:18;;;36367:34;;;36417:18;;;36410:34;;;55473:24:0;;36251:19:1;;55473:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55473:24:0;;-1:-1:-1;;55473:24:0;;;-1:-1:-1;;;;;;;55512:20:0;;55508:103;;55565:1;55569:29;55549:50;;;;;;;55508:103;55631:6;-1:-1:-1;55639:20:0;;-1:-1:-1;54036:1632:0;;;;;;;;:::o;53031:391::-;53145:7;;-1:-1:-1;;;;;53246:75:0;;53348:3;53344:12;;;53358:2;53340:21;53389:25;53400:4;53340:21;53409:1;53246:75;53389:10;:25::i;:::-;53382:32;;;;;;53031:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:1:o;592:127::-;653:10;648:3;644:20;641:1;634:31;684:4;681:1;674:15;708:4;705:1;698:15;724:275;795:2;789:9;860:2;841:13;;-1:-1:-1;;837:27:1;825:40;;-1:-1:-1;;;;;880:34:1;;916:22;;;877:62;874:88;;;942:18;;:::i;:::-;978:2;971:22;724:275;;-1:-1:-1;724:275:1:o;1004:186::-;1052:4;-1:-1:-1;;;;;1077:6:1;1074:30;1071:56;;;1107:18;;:::i;:::-;-1:-1:-1;1173:2:1;1152:15;-1:-1:-1;;1148:29:1;1179:4;1144:40;;1004:186::o;1195:462::-;1237:5;1290:3;1283:4;1275:6;1271:17;1267:27;1257:55;;1308:1;1305;1298:12;1257:55;1344:6;1331:20;1375:48;1391:31;1419:2;1391:31;:::i;:::-;1375:48;:::i;:::-;1448:2;1439:7;1432:19;1494:3;1487:4;1482:2;1474:6;1470:15;1466:26;1463:35;1460:55;;;1511:1;1508;1501:12;1460:55;1576:2;1569:4;1561:6;1557:17;1550:4;1541:7;1537:18;1524:55;1624:1;1599:16;;;1617:4;1595:27;1588:38;;;;1603:7;1195:462;-1:-1:-1;;;1195:462:1:o;1662:456::-;1748:6;1756;1764;1817:2;1805:9;1796:7;1792:23;1788:32;1785:52;;;1833:1;1830;1823:12;1785:52;1869:9;1856:23;1846:33;;1926:2;1915:9;1911:18;1898:32;1888:42;;1981:2;1970:9;1966:18;1953:32;-1:-1:-1;;;;;2000:6:1;1997:30;1994:50;;;2040:1;2037;2030:12;1994:50;2063:49;2104:7;2095:6;2084:9;2080:22;2063:49;:::i;:::-;2053:59;;;1662:456;;;;;:::o;2123:258::-;2195:1;2205:113;2219:6;2216:1;2213:13;2205:113;;;2295:11;;;2289:18;2276:11;;;2269:39;2241:2;2234:10;2205:113;;;2336:6;2333:1;2330:13;2327:48;;;-1:-1:-1;;2371:1:1;2353:16;;2346:27;2123:258::o;2386:::-;2428:3;2466:5;2460:12;2493:6;2488:3;2481:19;2509:63;2565:6;2558:4;2553:3;2549:14;2542:4;2535:5;2531:16;2509:63;:::i;:::-;2626:2;2605:15;-1:-1:-1;;2601:29:1;2592:39;;;;2633:4;2588:50;;2386:258;-1:-1:-1;;2386:258:1:o;2649:220::-;2798:2;2787:9;2780:21;2761:4;2818:45;2859:2;2848:9;2844:18;2836:6;2818:45;:::i;2874:180::-;2933:6;2986:2;2974:9;2965:7;2961:23;2957:32;2954:52;;;3002:1;2999;2992:12;2954:52;-1:-1:-1;3025:23:1;;2874:180;-1:-1:-1;2874:180:1:o;3267:131::-;-1:-1:-1;;;;;3342:31:1;;3332:42;;3322:70;;3388:1;3385;3378:12;3403:315;3471:6;3479;3532:2;3520:9;3511:7;3507:23;3503:32;3500:52;;;3548:1;3545;3538:12;3500:52;3587:9;3574:23;3606:31;3631:5;3606:31;:::i;:::-;3656:5;3708:2;3693:18;;;;3680:32;;-1:-1:-1;;;3403:315:1:o;3723:321::-;3792:6;3845:2;3833:9;3824:7;3820:23;3816:32;3813:52;;;3861:1;3858;3851:12;3813:52;3901:9;3888:23;-1:-1:-1;;;;;3926:6:1;3923:30;3920:50;;;3966:1;3963;3956:12;3920:50;3989:49;4030:7;4021:6;4010:9;4006:22;3989:49;:::i;4231:456::-;4308:6;4316;4324;4377:2;4365:9;4356:7;4352:23;4348:32;4345:52;;;4393:1;4390;4383:12;4345:52;4432:9;4419:23;4451:31;4476:5;4451:31;:::i;:::-;4501:5;-1:-1:-1;4558:2:1;4543:18;;4530:32;4571:33;4530:32;4571:33;:::i;:::-;4231:456;;4623:7;;-1:-1:-1;;;4677:2:1;4662:18;;;;4649:32;;4231:456::o;4692:315::-;4760:6;4768;4821:2;4809:9;4800:7;4796:23;4792:32;4789:52;;;4837:1;4834;4827:12;4789:52;4873:9;4860:23;4850:33;;4933:2;4922:9;4918:18;4905:32;4946:31;4971:5;4946:31;:::i;:::-;4996:5;4986:15;;;4692:315;;;;;:::o;5012:247::-;5071:6;5124:2;5112:9;5103:7;5099:23;5095:32;5092:52;;;5140:1;5137;5130:12;5092:52;5179:9;5166:23;5198:31;5223:5;5198:31;:::i;5264:456::-;5341:6;5349;5357;5410:2;5398:9;5389:7;5385:23;5381:32;5378:52;;;5426:1;5423;5416:12;5378:52;5465:9;5452:23;5484:31;5509:5;5484:31;:::i;:::-;5534:5;-1:-1:-1;5586:2:1;5571:18;;5558:32;;-1:-1:-1;5642:2:1;5627:18;;5614:32;5655:33;5614:32;5655:33;:::i;:::-;5707:7;5697:17;;;5264:456;;;;;:::o;5725:632::-;5896:2;5948:21;;;6018:13;;5921:18;;;6040:22;;;5867:4;;5896:2;6119:15;;;;6093:2;6078:18;;;5867:4;6162:169;6176:6;6173:1;6170:13;6162:169;;;6237:13;;6225:26;;6306:15;;;;6271:12;;;;6198:1;6191:9;6162:169;;;-1:-1:-1;6348:3:1;;5725:632;-1:-1:-1;;;;;;5725:632:1:o;6362:118::-;6448:5;6441:13;6434:21;6427:5;6424:32;6414:60;;6470:1;6467;6460:12;6485:382;6550:6;6558;6611:2;6599:9;6590:7;6586:23;6582:32;6579:52;;;6627:1;6624;6617:12;6579:52;6666:9;6653:23;6685:31;6710:5;6685:31;:::i;:::-;6735:5;-1:-1:-1;6792:2:1;6777:18;;6764:32;6805:30;6764:32;6805:30;:::i;6872:665::-;6967:6;6975;6983;6991;7044:3;7032:9;7023:7;7019:23;7015:33;7012:53;;;7061:1;7058;7051:12;7012:53;7100:9;7087:23;7119:31;7144:5;7119:31;:::i;:::-;7169:5;-1:-1:-1;7226:2:1;7211:18;;7198:32;7239:33;7198:32;7239:33;:::i;:::-;7291:7;-1:-1:-1;7345:2:1;7330:18;;7317:32;;-1:-1:-1;7400:2:1;7385:18;;7372:32;-1:-1:-1;;;;;7416:30:1;;7413:50;;;7459:1;7456;7449:12;7413:50;7482:49;7523:7;7514:6;7503:9;7499:22;7482:49;:::i;:::-;7472:59;;;6872:665;;;;;;;:::o;7542:241::-;7598:6;7651:2;7639:9;7630:7;7626:23;7622:32;7619:52;;;7667:1;7664;7657:12;7619:52;7706:9;7693:23;7725:28;7747:5;7725:28;:::i;7788:389::-;7866:6;7874;7927:2;7915:9;7906:7;7902:23;7898:32;7895:52;;;7943:1;7940;7933:12;7895:52;7979:9;7966:23;7956:33;;8040:2;8029:9;8025:18;8012:32;-1:-1:-1;;;;;8059:6:1;8056:30;8053:50;;;8099:1;8096;8089:12;8053:50;8122:49;8163:7;8154:6;8143:9;8139:22;8122:49;:::i;:::-;8112:59;;;7788:389;;;;;:::o;8182:183::-;8242:4;-1:-1:-1;;;;;8267:6:1;8264:30;8261:56;;;8297:18;;:::i;:::-;-1:-1:-1;8342:1:1;8338:14;8354:4;8334:25;;8182:183::o;8370:966::-;8454:6;8485:2;8528;8516:9;8507:7;8503:23;8499:32;8496:52;;;8544:1;8541;8534:12;8496:52;8584:9;8571:23;-1:-1:-1;;;;;8609:6:1;8606:30;8603:50;;;8649:1;8646;8639:12;8603:50;8672:22;;8725:4;8717:13;;8713:27;-1:-1:-1;8703:55:1;;8754:1;8751;8744:12;8703:55;8790:2;8777:16;8813:60;8829:43;8869:2;8829:43;:::i;8813:60::-;8907:15;;;8989:1;8985:10;;;;8977:19;;8973:28;;;8938:12;;;;9013:19;;;9010:39;;;9045:1;9042;9035:12;9010:39;9069:11;;;;9089:217;9105:6;9100:3;9097:15;9089:217;;;9185:3;9172:17;9202:31;9227:5;9202:31;:::i;:::-;9246:18;;9122:12;;;;9284;;;;9089:217;;;9325:5;8370:966;-1:-1:-1;;;;;;;8370:966:1:o;9341:887::-;9394:5;9447:3;9440:4;9432:6;9428:17;9424:27;9414:55;;9465:1;9462;9455:12;9414:55;9501:6;9488:20;9527:4;9551:60;9567:43;9607:2;9567:43;:::i;9551:60::-;9645:15;;;9731:1;9727:10;;;;9715:23;;9711:32;;;9676:12;;;;9755:15;;;9752:35;;;9783:1;9780;9773:12;9752:35;9819:2;9811:6;9807:15;9831:368;9847:6;9842:3;9839:15;9831:368;;;9933:3;9920:17;-1:-1:-1;;;;;9956:11:1;9953:35;9950:125;;;10029:1;10058:2;10054;10047:14;9950:125;10100:56;10152:3;10147:2;10133:11;10125:6;10121:24;10117:33;10100:56;:::i;:::-;10088:69;;-1:-1:-1;10177:12:1;;;;9864;;9831:368;;;-1:-1:-1;10217:5:1;9341:887;-1:-1:-1;;;;;;9341:887:1:o;10233:1149::-;10361:6;10369;10422:2;10410:9;10401:7;10397:23;10393:32;10390:52;;;10438:1;10435;10428:12;10390:52;10478:9;10465:23;-1:-1:-1;;;;;10548:2:1;10540:6;10537:14;10534:34;;;10564:1;10561;10554:12;10534:34;10602:6;10591:9;10587:22;10577:32;;10647:7;10640:4;10636:2;10632:13;10628:27;10618:55;;10669:1;10666;10659:12;10618:55;10705:2;10692:16;10727:4;10751:60;10767:43;10807:2;10767:43;:::i;10751:60::-;10845:15;;;10927:1;10923:10;;;;10915:19;;10911:28;;;10876:12;;;;10951:19;;;10948:39;;;10983:1;10980;10973:12;10948:39;11007:11;;;;11027:142;11043:6;11038:3;11035:15;11027:142;;;11109:17;;11097:30;;11060:12;;;;11147;;;;11027:142;;;11188:5;-1:-1:-1;;11231:18:1;;11218:32;;-1:-1:-1;;11262:16:1;;;11259:36;;;11291:1;11288;11281:12;11259:36;;11314:62;11368:7;11357:8;11346:9;11342:24;11314:62;:::i;11387:388::-;11455:6;11463;11516:2;11504:9;11495:7;11491:23;11487:32;11484:52;;;11532:1;11529;11522:12;11484:52;11571:9;11558:23;11590:31;11615:5;11590:31;:::i;:::-;11640:5;-1:-1:-1;11697:2:1;11682:18;;11669:32;11710:33;11669:32;11710:33;:::i;11780:355::-;11982:2;11964:21;;;12021:2;12001:18;;;11994:30;12060:33;12055:2;12040:18;;12033:61;12126:2;12111:18;;11780:355::o;12496:127::-;12557:10;12552:3;12548:20;12545:1;12538:31;12588:4;12585:1;12578:15;12612:4;12609:1;12602:15;12628:168;12668:7;12734:1;12730;12726:6;12722:14;12719:1;12716:21;12711:1;12704:9;12697:17;12693:45;12690:71;;;12741:18;;:::i;:::-;-1:-1:-1;12781:9:1;;12628:168::o;12801:127::-;12862:10;12857:3;12853:20;12850:1;12843:31;12893:4;12890:1;12883:15;12917:4;12914:1;12907:15;12933:135;12972:3;-1:-1:-1;;12993:17:1;;12990:43;;;13013:18;;:::i;:::-;-1:-1:-1;13060:1:1;13049:13;;12933:135::o;13073:380::-;13152:1;13148:12;;;;13195;;;13216:61;;13270:4;13262:6;13258:17;13248:27;;13216:61;13323:2;13315:6;13312:14;13292:18;13289:38;13286:161;;;13369:10;13364:3;13360:20;13357:1;13350:31;13404:4;13401:1;13394:15;13432:4;13429:1;13422:15;13286:161;;13073:380;;;:::o;15052:276::-;15183:3;15221:6;15215:13;15237:53;15283:6;15278:3;15271:4;15263:6;15259:17;15237:53;:::i;:::-;15306:16;;;;;15052:276;-1:-1:-1;;15052:276:1:o;15333:413::-;15535:2;15517:21;;;15574:2;15554:18;;;15547:30;15613:34;15608:2;15593:18;;15586:62;-1:-1:-1;;;15679:2:1;15664:18;;15657:47;15736:3;15721:19;;15333:413::o;15751:356::-;15953:2;15935:21;;;15972:18;;;15965:30;16031:34;16026:2;16011:18;;16004:62;16098:2;16083:18;;15751:356::o;16112:127::-;16173:10;16168:3;16164:20;16161:1;16154:31;16204:4;16201:1;16194:15;16228:4;16225:1;16218:15;16244:120;16284:1;16310;16300:35;;16315:18;;:::i;:::-;-1:-1:-1;16349:9:1;;16244:120::o;16369:125::-;16409:4;16437:1;16434;16431:8;16428:34;;;16442:18;;:::i;:::-;-1:-1:-1;16479:9:1;;16369:125::o;16499:407::-;16701:2;16683:21;;;16740:2;16720:18;;;16713:30;16779:34;16774:2;16759:18;;16752:62;-1:-1:-1;;;16845:2:1;16830:18;;16823:41;16896:3;16881:19;;16499:407::o;18856:204::-;18894:3;18930:4;18927:1;18923:12;18962:4;18959:1;18955:12;18997:3;18991:4;18987:14;18982:3;18979:23;18976:49;;;19005:18;;:::i;:::-;19041:13;;18856:204;-1:-1:-1;;;18856:204:1:o;20193:985::-;20281:12;;20246:3;;20336:1;20356:18;;;;20409;;;;20436:61;;20490:4;20482:6;20478:17;20468:27;;20436:61;20516:2;20564;20556:6;20553:14;20533:18;20530:38;20527:161;;;20610:10;20605:3;20601:20;20598:1;20591:31;20645:4;20642:1;20635:15;20673:4;20670:1;20663:15;20527:161;20704:18;20731:104;;;;20849:1;20844:328;;;;20697:475;;20731:104;-1:-1:-1;;20764:24:1;;20752:37;;20809:16;;;;-1:-1:-1;20731:104:1;;20844:328;20875:5;20872:1;20865:16;20922:2;20919:1;20909:16;20947:1;20961:165;20975:6;20972:1;20969:13;20961:165;;;21053:14;;21040:11;;;21033:35;21096:16;;;;20990:10;;20961:165;;;20965:3;;21155:6;21150:3;21146:16;21139:23;;20697:475;;;;;;;20193:985;;;;:::o;21183:202::-;21313:3;21338:41;21375:3;21367:6;21338:41;:::i;21390:184::-;21460:6;21513:2;21501:9;21492:7;21488:23;21484:32;21481:52;;;21529:1;21526;21519:12;21481:52;-1:-1:-1;21552:16:1;;21390:184;-1:-1:-1;21390:184:1:o;23056:245::-;23123:6;23176:2;23164:9;23155:7;23151:23;23147:32;23144:52;;;23192:1;23189;23182:12;23144:52;23224:9;23218:16;23243:28;23265:5;23243:28;:::i;24124:635::-;24204:6;24257:2;24245:9;24236:7;24232:23;24228:32;24225:52;;;24273:1;24270;24263:12;24225:52;24306:9;24300:16;-1:-1:-1;;;;;24331:6:1;24328:30;24325:50;;;24371:1;24368;24361:12;24325:50;24394:22;;24447:4;24439:13;;24435:27;-1:-1:-1;24425:55:1;;24476:1;24473;24466:12;24425:55;24505:2;24499:9;24530:48;24546:31;24574:2;24546:31;:::i;24530:48::-;24601:2;24594:5;24587:17;24641:7;24636:2;24631;24627;24623:11;24619:20;24616:33;24613:53;;;24662:1;24659;24652:12;24613:53;24675:54;24726:2;24721;24714:5;24710:14;24705:2;24701;24697:11;24675:54;:::i;24764:462::-;24985:3;25013:41;25050:3;25042:6;25013:41;:::i;:::-;25083:6;25077:13;25099:52;25144:6;25140:2;25133:4;25125:6;25121:17;25099:52;:::i;:::-;25167:53;25212:6;25208:2;25204:15;25196:6;25167:53;:::i;25637:280::-;25736:6;25789:2;25777:9;25768:7;25764:23;25760:32;25757:52;;;25805:1;25802;25795:12;25757:52;25837:9;25831:16;25856:31;25881:5;25856:31;:::i;27138:128::-;27178:3;27209:1;27205:6;27202:1;27199:13;27196:39;;;27215:18;;:::i;:::-;-1:-1:-1;27251:9:1;;27138:128::o;29831:136::-;29870:3;29898:5;29888:39;;29907:18;;:::i;:::-;-1:-1:-1;;;29943:18:1;;29831:136::o;31204:414::-;31406:2;31388:21;;;31445:2;31425:18;;;31418:30;31484:34;31479:2;31464:18;;31457:62;-1:-1:-1;;;31550:2:1;31535:18;;31528:48;31608:3;31593:19;;31204:414::o;31623:112::-;31655:1;31681;31671:35;;31686:18;;:::i;:::-;-1:-1:-1;31720:9:1;;31623:112::o;33653:489::-;-1:-1:-1;;;;;33922:15:1;;;33904:34;;33974:15;;33969:2;33954:18;;33947:43;34021:2;34006:18;;33999:34;;;34069:3;34064:2;34049:18;;34042:31;;;33847:4;;34090:46;;34116:19;;34108:6;34090:46;:::i;:::-;34082:54;33653:489;-1:-1:-1;;;;;;33653:489:1:o;34147:249::-;34216:6;34269:2;34257:9;34248:7;34244:23;34240:32;34237:52;;;34285:1;34282;34275:12;34237:52;34317:9;34311:16;34336:30;34360:5;34336:30;:::i;34401:127::-;34462:10;34457:3;34453:20;34450:1;34443:31;34493:4;34490:1;34483:15;34517:4;34514:1;34507:15

Swarm Source

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