ETH Price: $3,401.49 (+1.86%)

Token

DoomCatRescue (DOOM)
 

Overview

Max Total Supply

5,170 DOOM

Holders

1,252

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
endy.eth
Balance
1 DOOM
0x8830a1ebC4C93cDCdd817a4008D0e7D6E0493093
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
DoomCat

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-04-05
*/

/*

$$$$$$$\   $$$$$$\   $$$$$$\  $$\      $$\                  
$$  __$$\ $$  __$$\ $$  __$$\ $$$\    $$$ |                 
$$ |  $$ |$$ /  $$ |$$ /  $$ |$$$$\  $$$$ |                 
$$ |  $$ |$$ |  $$ |$$ |  $$ |$$\$$\$$ $$ |                 
$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ \$$$  $$ |                 
$$ |  $$ |$$ |  $$ |$$ |  $$ |$$ |\$  /$$ |                 
$$$$$$$  | $$$$$$  | $$$$$$  |$$ | \_/ $$ |                 
\_______/  \______/  \______/ \__|     \__|                 
                                                            
                                                            
                                                            
 $$$$$$\   $$$$$$\ $$$$$$$$\                                
$$  __$$\ $$  __$$\\__$$  __|                               
$$ /  \__|$$ /  $$ |  $$ |                                  
$$ |      $$$$$$$$ |  $$ |                                  
$$ |      $$  __$$ |  $$ |                                  
$$ |  $$\ $$ |  $$ |  $$ |                                  
\$$$$$$  |$$ |  $$ |  $$ |                                  
 \______/ \__|  \__|  \__|                                  
                                                            
                                                            
                                                            
$$$$$$$\  $$$$$$$$\  $$$$$$\   $$$$$$\  $$\   $$\ $$$$$$$$\ 
$$  __$$\ $$  _____|$$  __$$\ $$  __$$\ $$ |  $$ |$$  _____|
$$ |  $$ |$$ |      $$ /  \__|$$ /  \__|$$ |  $$ |$$ |      
$$$$$$$  |$$$$$\    \$$$$$$\  $$ |      $$ |  $$ |$$$$$\    
$$  __$$< $$  __|    \____$$\ $$ |      $$ |  $$ |$$  __|   
$$ |  $$ |$$ |      $$\   $$ |$$ |  $$\ $$ |  $$ |$$ |      
$$ |  $$ |$$$$$$$$\ \$$$$$$  |\$$$$$$  |\$$$$$$  |$$$$$$$$\ 
\__|  \__|\________| \______/  \______/  \______/ \________|
                                                 
*/

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

// SPDX-License-Identifier: MIT

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;

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

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

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

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


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



pragma solidity ^0.8.0;

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

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

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

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


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



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


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



pragma solidity ^0.8.0;

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

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

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

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

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

}


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



pragma solidity ^0.8.0;

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


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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// File contracts/ERC721OnOpenSea.sol



pragma solidity ^0.8.0;

interface ProxyRegistry {
    function proxies(address) external view returns (address);
}

/**
 * @dev helper contract to allow gasless OpenSea listings
 */
contract ERC721OnOpenSea is ERC721Enumerable {
    address public proxyRegistryAddress;

    constructor(
        string memory name,
        string memory symbol,
        address registryProxyAddress_
    ) ERC721(name, symbol) {
        proxyRegistryAddress = registryProxyAddress_;
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);

        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }
}


// File contracts/interfaces/IUniswapV2Router02Minimal.sol



pragma solidity ^0.8.0;

interface IUniswapV2Router02Minimal {
    function WETH() external pure returns (address);
    function swapExactETHForTokensSupportingFeeOnTransferTokens(
        uint256 amountOutMin,
        address[] calldata path,
        address to,
        uint256 deadline
    ) external payable;
}


// File contracts/interfaces/IDoomCat.sol



pragma solidity ^0.8.0;

interface IDoomCat {
    function mint(address, uint256) external;
    function swapAndBurn(uint256) external;
}


// File contracts/DoomCatRescue.sol



pragma solidity ^0.8.0;

/**
 * @dev we rescue the cats
 */
contract DoomCatRescue {
    // reference to, basically, self
    IDoomCat private _doomCat;

    // total number of cats that exist
    uint256 public immutable totalCats;

    // how many cats initially existed to be rescued
    uint256 private immutable _remainingCatsInitial;

    // how many cats are left to be rescued
    uint256 public remainingCats;

    // when rescues can begin
    uint256 public immutable rescueStartTime;

    // initial price of rescues
    uint256 public immutable rescuePriceInitial;

    // current price of rescues
    uint256 public rescuePrice;

    // amount of rescue price increases
    uint256 public immutable rescuePriceIncrement;

    // amount of cats to rescue before price increase is triggered
    uint256 public immutable rescueTrancheSize;

    // how many blocks must exist between rescues for a given address
    uint256 public immutable rescueRateLimit;

    // track last block that an address performed a rescue
    mapping(address => uint256) public rescueLastBlock;

    // how many funds have been collected for rescues (resets every tranche)
    uint256 private collectedRescueFunds;

    event Rescue(address indexed rescuer, uint256 tokenId, uint256 price);

    constructor(
        IDoomCat doomCat_,
        uint256[2] memory catDetails_,
        uint256[5] memory rescueDetails_
    ) {
        _doomCat = doomCat_;

        totalCats = catDetails_[0];
        _remainingCatsInitial = catDetails_[1];
        remainingCats = catDetails_[1];

        rescuePriceInitial = rescueDetails_[0];
        rescuePrice = rescueDetails_[0];
        rescuePriceIncrement = rescueDetails_[1];
        rescueTrancheSize = rescueDetails_[2];
        rescueStartTime = rescueDetails_[3];
        rescueRateLimit = rescueDetails_[4];
    }

    /**
     * @dev public function to rescue a cat
     */
    function rescue() public payable {
        // require that rescues have globally started
        require(block.timestamp >= rescueStartTime, "too early");
        
        // require that address has passed their rate limit
        require(
            block.number >= rescueLastBlock[msg.sender] + rescueRateLimit,
            "too soon"
        );

        // require that there are cats left to be rescued
        require(remainingCats > 0, "no cats left");

        // require that the correct amount is paid (at minimum)
        require(msg.value >= rescuePrice, "value too low");

        // update address' last block rate limit tracker
        rescueLastBlock[msg.sender] = block.number;

        // grab the current rescue price (for use after updating `rescuePrice`)
        uint256 currentRescuePrice = rescuePrice;

        // update the amount of funds that have been used for rescues
        collectedRescueFunds += currentRescuePrice;

        // decrement remaining cats
        remainingCats--;

        // if we are at a tranch boundary, OR, there are no remaining cats, then
        // we want to update the price and swap & burn all collected ETH from previous
        // tranche
        if (
            (_remainingCatsInitial - remainingCats) % rescueTrancheSize == 0 ||
            remainingCats == 0
        ) {
            // if there are no more cats, set rescuePrice at 0 for cleanup sake
            if (remainingCats == 0) {
                rescuePrice = 0;
            } else {
                // otherwise, increment rescuePrice by the increment amount
                rescuePrice += rescuePriceIncrement;
            }

            // swap and burn collected funds
            _doomCat.swapAndBurn(collectedRescueFunds);

            // reset collected funds back to 0
            collectedRescueFunds = 0;
        }

        // get the tokenId for the cat to mint, mint it
        uint256 tokenId = totalCats - remainingCats;
        _doomCat.mint(msg.sender, tokenId);

        // if the user overpaid, refund their Ether
        if (msg.value > currentRescuePrice) {
            payable(msg.sender).transfer(msg.value - currentRescuePrice);
        }

        emit Rescue(msg.sender, tokenId, rescuePrice);
    }
}


// File contracts/DoomCatAuction.sol



pragma solidity ^0.8.0;

/**
 * @dev we auction the genesis cats
 */
contract DoomCatAuction {
    // reference to, basically, self
    IDoomCat private _doomCat;

    // number of total genesis cats
    uint256 public immutable genesisCats;

    // start time of the first auction
    uint64 public immutable auctionsStart;

    // how long auctions last
    uint64 public immutable auctionsDuration;

    // time between end of one auction, and beginning of next auction
    uint64 public immutable auctionsDistance;

    // number of total auctions to perform
    uint64 public immutable auctionsCount;

    // number of cats being auctioned off per auction
    uint64 public immutable auctionsCatsPerAuction;

    // minimum bid increase amount
    uint64 public immutable auctionsBidIncrement;

    // track number of bids that have been placed for a cat
    mapping(uint256 => uint256) public bidCount;

    // track the highest bid amount for a cat
    mapping(uint256 => uint256) public highBidAmount;

    // track the owner of the highest bid for a cat
    mapping(uint256 => address) public highBidOwner;

    // track all of the bids (per address) for cats
    mapping(uint256 => mapping(address => uint256)) public bidsByTokenByAddress;

    event Bid(
        address indexed account,
        uint256 catId,
        uint256 amount,
        uint256 bidCount
    );
    event WithdrawLowBid(
        address indexed account,
        uint256 catId,
        uint256 amount
    );
    event ClaimWinningBid(
        address indexed account,
        uint256 catId,
        uint256 amount
    );

    constructor(IDoomCat doomCat_, uint64[6] memory auctionsDetails_) {
        _doomCat = doomCat_;

        genesisCats = auctionsDetails_[3] * auctionsDetails_[4];

        auctionsStart = auctionsDetails_[0];
        auctionsDuration = auctionsDetails_[1];
        auctionsDistance = auctionsDetails_[2];
        auctionsCount = auctionsDetails_[3];
        auctionsCatsPerAuction = auctionsDetails_[4];
        auctionsBidIncrement = auctionsDetails_[5];

        require(auctionsDetails_[0] >= block.timestamp, "too late");
    }

    /**
     * @dev helper function which returns two integers:
     * 1) startId: the ID of a cat which signifies the "lowest" ID of the most recent (or current) auction set
     * 2) endId: the ID of a cat which signifies the "highest" ID of the most recent (or current) auction set
     * if (startId > endId), that means that no auction is currently happening, but exposes
     *   information about the most recently completed auction
     * if (startId <= endId), that means that an auction is currently happening, for that range of IDs
     */
    function auctionsState() public view returns (uint256, uint256) {
        uint64 checkedAuctions = 0;
        uint256 startId = 0;
        uint256 endId = 0;

        // loop through each auction
        while (checkedAuctions <= auctionsCount) {
            // calculate the start time of the current auction iteration
            uint64 auctionStart =
                auctionsStart +
                    (checkedAuctions * (auctionsDuration + auctionsDistance));

            // if the auction starts in the future, we're done with this while loop
            if (auctionStart > block.timestamp) {
                break;
            }
            // otherwise, the auction is currently in progress, or over

            // regardless of in progress or over, we need to calculate the startID
            // which is done by multiplying our auction iteration by number of cats
            // per auction plus 1 because cat ids start at 1
            startId = checkedAuctions * auctionsCatsPerAuction + 1;

            // add duration to start time, compare to current timestamp, to see if
            // we're currently in auction
            if (auctionStart + auctionsDuration > block.timestamp) {
                // if we're in an auction, break the loop and don't update endId
                break;
            } else {
                // if the auction ended in the past, update endId
                endId =
                    checkedAuctions *
                    auctionsCatsPerAuction +
                    auctionsCatsPerAuction;
            }

            // iterate
            checkedAuctions++;
        }

        return (startId, endId);
    }

    /**
     * @dev how many genesis cats are remaining
     */
    function remainingGenesisCats() public view returns (uint256) {
        (, uint256 endId) = auctionsState();
        return genesisCats - endId;
    }

    /**
     * @dev place a bid for a cat, referenced by its index in the current auction
     */
    function bid(uint64 index) public payable {
        (uint256 startId, uint256 endId) = auctionsState();

        // bids can only be placed while in an auction
        require(startId > endId, "not in auction");

        // cats are referenced by their index in the auction
        require(index < auctionsCatsPerAuction, "bad index");
        uint256 catId = startId + index;

        // users may increase their bid by sending the difference of the total amount
        // they want to bid, and their current bid
        uint256 newBid = bidsByTokenByAddress[catId][msg.sender] + msg.value;

        // make sure their new bid covers the bid increment amount
        require(
            newBid >= highBidAmount[catId] + auctionsBidIncrement,
            "not enough"
        );

        // increment the bid count
        bidCount[catId] += 1;

        // set the high bid amount
        highBidAmount[catId] = newBid;

        // set the high bid owner
        highBidOwner[catId] = msg.sender;

        // set the user's bid on this cat (for withdraws, later)
        bidsByTokenByAddress[catId][msg.sender] = newBid;

        emit Bid(msg.sender, catId, newBid, bidCount[catId]);
    }

    /**
     * @dev bids which have been outbid can be "withdrawn" and their Ether returned
     * highest current bid cannot be withdrawn
     */
    function withdrawLowBid(uint256 catId) public {
        // if user is the current highest bid for the cat, no can withdraw
        require(msg.sender != highBidOwner[catId], "can't withdraw high bid");

        // get reference to their bid amount
        uint256 bidAmount = bidsByTokenByAddress[catId][msg.sender];

        // make sure the user actually has funds to withdraw
        require(bidAmount > 0, "nothing to withdraw");

        // reset their amount for this cat to 0
        bidsByTokenByAddress[catId][msg.sender] = 0;

        // send the user their funds
        payable(msg.sender).transfer(bidAmount);

        emit WithdrawLowBid(msg.sender, catId, bidAmount);
    }

    /**
     * @dev when auction is over, highest bid can claim their cat!
     */
    function claimWinningBid(uint256 catId) public {
        // confirm that the cat being claimed belongs to a completed auction
        (, uint256 endId) = auctionsState();
        require(catId <= endId, "cat not claimable");

        // if no bids have been placed on a cat, they can be claimed first-come-first-serve
        if (highBidOwner[catId] != address(0)) {
            // otherwise, require that user is the owner of highest bid
            require(msg.sender == highBidOwner[catId], "not winning bid");
        }

        // mint that cat
        _doomCat.mint(msg.sender, catId);

        // only swap & burn if a bid actually exists
        if (highBidAmount[catId] > 0) {
            _doomCat.swapAndBurn(highBidAmount[catId]);
        }

        emit ClaimWinningBid(msg.sender, catId, highBidAmount[catId]);
    }
}


// File contracts/DoomCat.sol



pragma solidity ^0.8.0;






/**
 * @dev we like the cats
 */
contract DoomCat is IDoomCat, DoomCatRescue, DoomCatAuction, ERC721OnOpenSea {
    string private __baseURI;
    
    // there's an owner, but they can only update the BaseURI
    address public owner;

    // track the cat names here
    mapping(uint256 => string) public catNames;

    // how much does a name change cost
    uint256 public nameChangePrice;

    // reference to the token (HATE) that all funds will be swapped into
    address public immutable HATE;

    // reference to the address where all swapped HATE will be burned to
    address public immutable burn;

    // uniswap router address
    IUniswapV2Router02Minimal public immutable uniswapV2Router;
    
    // events for public functions
    event NameCat(address indexed account, uint256 catId, string name);
    event UpdateBaseURI(string baseURI);
    event RevokeOwner();

    constructor(
        address[4] memory addresses,
        string memory baseURI_,
        uint32 normalCats_,
        uint256[5] memory rescueDetails_,
        uint64[6] memory auctionsDetails_,
        uint256 nameChangePrice_
    )
        ERC721OnOpenSea("DoomCatRescue", "DOOM", addresses[3])
        DoomCatRescue(
            IDoomCat(address(this)),
            [
                uint256(
                    auctionsDetails_[3] * auctionsDetails_[4] + normalCats_
                ),
                normalCats_
            ],
            rescueDetails_
        )
        DoomCatAuction(IDoomCat(address(this)), auctionsDetails_)
    {
        HATE = addresses[0];
        uniswapV2Router = IUniswapV2Router02Minimal(addresses[1]);
        burn = addresses[2];
        __baseURI = baseURI_;
        owner = msg.sender;
        nameChangePrice = nameChangePrice_;
    }

    /**
     * @dev override OZ ERC721 _baseURI() function
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return __baseURI;
    }

    /**
     * @dev we want to be able to update this later, to fully decentralize it
     */
    function updateBaseURI(string calldata baseURI) public {
        require(msg.sender == owner, "not owner");
        __baseURI = baseURI;
        emit UpdateBaseURI(baseURI);
    }

    /**
     * @dev after getting baseURI into it's final form, revoke ownership
     */
    function revokeOwner() public {
        require(msg.sender == owner, "not owner");
        owner = address(0);
        emit RevokeOwner();
    }

    /**
     * @dev mint a new token to recipient with specified id, but only from current contract
     */
    function mint(address to_, uint256 tokenId_) public override {
        require(msg.sender == address(this), "can't mint");
        _mint(to_, tokenId_);
    }

    /**
     * @dev given an amount of Ether, swap all for HATE and send to burn address
     */
    function swapAndBurn(uint256 _amount) public override {
        require(msg.sender == address(this), "can't swap and burn");

        address[] memory path = new address[](2);
        path[0] = uniswapV2Router.WETH();
        path[1] = HATE;

        uniswapV2Router.swapExactETHForTokensSupportingFeeOnTransferTokens{
            value: _amount
        }(0, path, burn, block.timestamp);
    }

    /**
     * @dev owner of a cat can name a cat, once
     */
    function nameCat(uint256 catId, string calldata catName) external {
        require(ownerOf(catId) == msg.sender, "not your cat");

        // can only name a cat if it's not already named
        bytes memory currentName = bytes(catNames[catId]);
        require(currentName.length == 0, "already named");

        catNames[catId] = catName;
        IERC20(HATE).transferFrom(msg.sender, burn, nameChangePrice);

        emit NameCat(msg.sender, catId, catName);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address[4]","name":"addresses","type":"address[4]"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"uint32","name":"normalCats_","type":"uint32"},{"internalType":"uint256[5]","name":"rescueDetails_","type":"uint256[5]"},{"internalType":"uint64[6]","name":"auctionsDetails_","type":"uint64[6]"},{"internalType":"uint256","name":"nameChangePrice_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"catId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bidCount","type":"uint256"}],"name":"Bid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"catId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ClaimWinningBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"catId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameCat","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rescuer","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"price","type":"uint256"}],"name":"Rescue","type":"event"},{"anonymous":false,"inputs":[],"name":"RevokeOwner","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":false,"internalType":"string","name":"baseURI","type":"string"}],"name":"UpdateBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"catId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawLowBid","type":"event"},{"inputs":[],"name":"HATE","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":[],"name":"auctionsBidIncrement","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionsCatsPerAuction","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionsCount","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionsDistance","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionsDuration","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionsStart","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"auctionsState","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"index","type":"uint64"}],"name":"bid","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"bidCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"bidsByTokenByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burn","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"catNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"catId","type":"uint256"}],"name":"claimWinningBid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"genesisCats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"highBidAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"highBidOwner","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":"address","name":"to_","type":"address"},{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"catId","type":"uint256"},{"internalType":"string","name":"catName","type":"string"}],"name":"nameCat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nameChangePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxyRegistryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingCats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"remainingGenesisCats","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescue","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rescueLastBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescuePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescuePriceIncrement","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescuePriceInitial","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescueRateLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescueStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rescueTrancheSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwner","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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"swapAndBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalCats","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":[],"name":"uniswapV2Router","outputs":[{"internalType":"contract IUniswapV2Router02Minimal","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"updateBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"catId","type":"uint256"}],"name":"withdrawLowBid","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6102a06040523480156200001257600080fd5b50604051620042b6380380620042b683398101604081905262000035916200050c565b6040518060400160405280600d81526020016c446f6f6d43617452657363756560981b81525060405180604001604052806004815260200163444f4f4d60e01b815250876003600481106200009a57634e487b7160e01b600052603260045260246000fd5b6020020151828230873060405180604001604052808d63ffffffff168c600460068110620000d857634e487b7160e01b600052603260045260246000fd5b602002015160608e0151620000ee91906200068f565b620000fa919062000661565b6001600160401b0316815263ffffffff8e16602091820152600080546001600160a01b03199081166001600160a01b039586161790915582516080908152928201805160a052516001558d5160e0528d51600255908d01516101005260408d0151610120526060808e015160c0528d8301516101405260058054909216938616939093179055820151908201516200019391906200068f565b6001600160401b039081166101605281516001600160c01b031960c091821b8116610180526020840151821b81166101a0526040840151821b81166101c0526060840151821b81166101e0526080840151821b81166102005260a084015190911b1661022052815142911610156200023c5760405162461bcd60e51b8152602060048201526008602482015267746f6f206c61746560c01b604482015260640160405180910390fd5b505081516200025390600a906020850190620002f6565b5080516200026990600b906020840190620002f6565b5050601480546001600160a01b0319166001600160a01b03939093169290921790915550508651606090811b6001600160601b0319908116610240526020808a0151831b82166102805260408a015190921b16610260528651620002d49250601591880190620002f6565b50601680546001600160a01b03191633179055601855506200072a9350505050565b8280546200030490620006c1565b90600052602060002090601f01602090048101928262000328576000855562000373565b82601f106200034357805160ff191683800117855562000373565b8280016001018555821562000373579182015b828111156200037357825182559160200191906001019062000356565b506200038192915062000385565b5090565b5b8082111562000381576000815560010162000386565b600082601f830112620003ad578081fd5b620003b960a06200060b565b80838560a086011115620003cb578384fd5b835b6005811015620003ee578151845260209384019390910190600101620003cd565b509095945050505050565b600082601f8301126200040a578081fd5b6200041660c06200060b565b80838560c08601111562000428578384fd5b835b6006811015620003ee5781516001600160401b03811681146200044b578586fd5b845260209384019391909101906001016200042a565b600082601f83011262000472578081fd5b81516001600160401b038111156200048e576200048e62000714565b6020620004a4601f8301601f191682016200060b565b8281528582848701011115620004b8578384fd5b835b83811015620004d7578581018301518282018401528201620004ba565b83811115620004e857848385840101525b5095945050505050565b805163ffffffff811681146200050757600080fd5b919050565b600080600080600080610240878903121562000526578182fd5b87601f88011262000535578182fd5b60046200054c62000546826200063e565b6200060b565b808960808b018c8111156200055f578687fd5b865b85811015620005975782516001600160a01b038116811462000581578889fd5b8552602094850194929092019160010162000561565b505191995090925050506001600160401b03811115620005b5578283fd5b620005c389828a0162000461565b955050620005d460a08801620004f2565b9350620005e58860c089016200039c565b9250620005f7886101608901620003f9565b915061022087015190509295509295509295565b604051601f8201601f191681016001600160401b038111828210171562000636576200063662000714565b604052919050565b60006001600160401b038211156200065a576200065a62000714565b5060051b90565b60006001600160401b03828116848216808303821115620006865762000686620006fe565b01949350505050565b60006001600160401b0382811684821681151582840482111615620006b857620006b8620006fe565b02949350505050565b600181811c90821680620006d657607f821691505b60208210811415620006f857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052604160045260246000fd5b60805160a05160c05160e051610100516101205161014051610160516101805160c01c6101a05160c01c6101c05160c01c6101e05160c01c6102005160c01c6102205160c01c6102405160601c6102605160601c6102805160601c613a15620008a1600039600081816104a801528181610f1501526110650152600081816106910152818161109b01526123fb01526000818161045f01528181610fe7015261242b01526000818161063d015261204d01526000818161092201528181611f6c015281816125d80152612657015260008181610956015261250001526000818161059c01526125400152600081816107f801528181612561015261261a0152600081816105270152612595015260008181610b800152610e7901526000818161084c0152611181015260008181610af401526112dd0152600081816107900152611358015260006109d70152600081816107c401526110fd015260006113010152600081816103c301526113fa0152613a156000f3fe6080604052600436106103555760003560e01c8063696ded4a116101bb578063b88d4fde116100f7578063cd7c032611610095578063e2d3b78e1161006f578063e2d3b78e14610ae2578063e985e9c514610b16578063f285dec014610b36578063f76d050d14610b6e57610355565b8063cd7c032614610a62578063d1f61c1214610a82578063d849f74d14610ab857610355565b8063c18c469c116100d1578063c18c469c146109f9578063c261d45614610a0f578063c87b56dd14610a22578063c8f5b7f814610a4257610355565b8063b88d4fde14610978578063b9a958b414610998578063c1168c60146109c557610355565b80638c49f2e61161016457806395d89b411161013e57806395d89b41146108db578063a22cb465146108f0578063a8e2057b14610910578063b830620a1461094457610355565b80638c49f2e61461086e5780638da5cb5b1461089b578063931688cb146108bb57610355565b80636eb756ea116101955780636eb756ea146107e657806370a082311461081a5780637ca9ae681461083a57610355565b8063696ded4a1461075e57806369aa8dfe1461077e5780636c817912146107b257610355565b806323b872dd1161029557806344df8e70116102335780634f6ccce71161020d5780634f6ccce7146106e9578063561ce984146107095780636012565b146107295780636352211e1461073e57610355565b806344df8e701461067f57806345ca7738146106b35780634d1a9846146106c957610355565b80633d5e63571161026f5780633d5e6357146105de57806340c10f191461060b5780634193e5fa1461062b57806342842e0e1461065f57610355565b806323b872dd1461056a5780632a5ad5021461058a5780632f745c59146105be57610355565b80630ff3687b11610302578063196ee9c7116102dc578063196ee9c7146104df5780631d65a6ca146104f55780631f423965146105155780631fbe19791461056257610355565b80630ff3687b146104815780631694505e1461049657806318160ddd146104ca57610355565b8063081812fc11610333578063081812fc146103f3578063095ea7b31461042b5780630d48c5d61461044d57610355565b806301ffc9a71461035a57806306fdde031461038f5780630783b338146103b1575b600080fd5b34801561036657600080fd5b5061037a61037536600461355c565b610ba2565b60405190151581526020015b60405180910390f35b34801561039b57600080fd5b506103a4610be8565b60405161038691906137c0565b3480156103bd57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b604051908152602001610386565b3480156103ff57600080fd5b5061041361040e3660046135d4565b610c7a565b6040516001600160a01b039091168152602001610386565b34801561043757600080fd5b5061044b610446366004613515565b610d14565b005b34801561045957600080fd5b506104137f000000000000000000000000000000000000000000000000000000000000000081565b34801561048d57600080fd5b506103e5610e64565b3480156104a257600080fd5b506104137f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d657600080fd5b506012546103e5565b3480156104eb57600080fd5b506103e560015481565b34801561050157600080fd5b5061044b6105103660046135d4565b610ea3565b34801561052157600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610386565b61044b6110fb565b34801561057657600080fd5b5061044b6105853660046133cf565b611510565b34801561059657600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000000081565b3480156105ca57600080fd5b506103e56105d9366004613515565b611597565b3480156105ea57600080fd5b506103e56105f93660046135d4565b60076020526000908152604090205481565b34801561061757600080fd5b5061044b610626366004613515565b611642565b34801561063757600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000000081565b34801561066b57600080fd5b5061044b61067a3660046133cf565b61169f565b34801561068b57600080fd5b506104137f000000000000000000000000000000000000000000000000000000000000000081565b3480156106bf57600080fd5b506103e560185481565b3480156106d557600080fd5b5061044b6106e43660046135d4565b6116ba565b3480156106f557600080fd5b506103e56107043660046135d4565b6118ce565b34801561071557600080fd5b5061044b6107243660046135d4565b611980565b34801561073557600080fd5b5061044b611acd565b34801561074a57600080fd5b506104136107593660046135d4565b611b4e565b34801561076a57600080fd5b506103a46107793660046135d4565b611bd9565b34801561078a57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b3480156107be57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b3480156107f257600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000000081565b34801561082657600080fd5b506103e561083536600461335f565b611c73565b34801561084657600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b34801561087a57600080fd5b506103e561088936600461335f565b60036020526000908152604090205481565b3480156108a757600080fd5b50601654610413906001600160a01b031681565b3480156108c757600080fd5b5061044b6108d6366004613594565b611d0d565b3480156108e757600080fd5b506103a4611d9d565b3480156108fc57600080fd5b5061044b61090b3660046134e8565b611dac565b34801561091c57600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000000081565b34801561095057600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000000081565b34801561098457600080fd5b5061044b61099336600461340f565b611e7e565b3480156109a457600080fd5b506103e56109b33660046135d4565b60066020526000908152604090205481565b3480156109d157600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b348015610a0557600080fd5b506103e560025481565b61044b610a1d36600461365a565b611f0c565b348015610a2e57600080fd5b506103a4610a3d3660046135d4565b612175565b348015610a4e57600080fd5b5061044b610a5d366004613610565b61225e565b348015610a6e57600080fd5b50601454610413906001600160a01b031681565b348015610a8e57600080fd5b50610413610a9d3660046135d4565b6008602052600090815260409020546001600160a01b031681565b348015610ac457600080fd5b50610acd6124f5565b60408051928352602083019190915201610386565b348015610aee57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b348015610b2257600080fd5b5061037a610b31366004613397565b6126b3565b348015610b4257600080fd5b506103e5610b513660046135ec565b600960209081526000928352604080842090915290825290205481565b348015610b7a57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000081565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610be05750610be08261279c565b90505b919050565b6060600a8054610bf7906138cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c23906138cf565b8015610c705780601f10610c4557610100808354040283529160200191610c70565b820191906000526020600020905b815481529060010190602001808311610c5357829003601f168201915b5050505050905090565b6000818152600c60205260408120546001600160a01b0316610cf85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600e60205260409020546001600160a01b031690565b6000610d1f82611b4e565b9050806001600160a01b0316836001600160a01b03161415610da95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610cef565b336001600160a01b0382161480610de357506001600160a01b0381166000908152600f6020908152604080832033845290915290205460ff165b610e555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610cef565b610e5f8383612837565b505050565b600080610e6f6124f5565b9150610e9d9050817f0000000000000000000000000000000000000000000000000000000000000000613875565b91505090565b333014610ef25760405162461bcd60e51b815260206004820152601360248201527f63616e2774207377617020616e64206275726e000000000000000000000000006044820152606401610cef565b6040805160028082526060820183526000926020830190803683370190505090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa4919061337b565b81600081518110610fc557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f00000000000000000000000000000000000000000000000000000000000000008160018151811061102757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526040517fb6f9de950000000000000000000000000000000000000000000000000000000081527f00000000000000000000000000000000000000000000000000000000000000009091169063b6f9de959084906110c59060009086907f0000000000000000000000000000000000000000000000000000000000000000904290600401613743565b6000604051808303818588803b1580156110de57600080fd5b505af11580156110f2573d6000803e3d6000fd5b50505050505050565b7f000000000000000000000000000000000000000000000000000000000000000042101561116b5760405162461bcd60e51b815260206004820152600960248201527f746f6f206561726c7900000000000000000000000000000000000000000000006044820152606401610cef565b336000908152600360205260409020546111a6907f0000000000000000000000000000000000000000000000000000000000000000906137f6565b4310156111f55760405162461bcd60e51b815260206004820152600860248201527f746f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610cef565b6000600154116112475760405162461bcd60e51b815260206004820152600c60248201527f6e6f2063617473206c65667400000000000000000000000000000000000000006044820152606401610cef565b6002543410156112995760405162461bcd60e51b815260206004820152600d60248201527f76616c756520746f6f206c6f77000000000000000000000000000000000000006044820152606401610cef565b33600090815260036020526040812043905560025460048054919283926112c19084906137f6565b9091555050600180549060006112d6836138b8565b91905055507f00000000000000000000000000000000000000000000000000000000000000006001547f000000000000000000000000000000000000000000000000000000000000000061132a9190613875565b611334919061394d565b15806113405750600154155b156113f35760015461135657600060025561138e565b7f00000000000000000000000000000000000000000000000000000000000000006002600082825461138891906137f6565b90915550505b60005460048054604051630eb2d36560e11b8152918201526001600160a01b0390911690631d65a6ca90602401600060405180830381600087803b1580156113d557600080fd5b505af11580156113e9573d6000803e3d6000fd5b5050600060045550505b60006001547f00000000000000000000000000000000000000000000000000000000000000006114239190613875565b6000546040516340c10f1960e01b8152336004820152602481018390529192506001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b50505050813411156114c857336108fc61149e8434613875565b6040518115909202916000818181858888f193505050501580156114c6573d6000803e3d6000fd5b505b60025460405133917f28f3dc959abf766a02cc0ae09b189920c2262e217ab99e40302eb498c3d1c88b9161150491858252602082015260400190565b60405180910390a25050565b61151a33826128a5565b61158c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610cef565b610e5f838383612998565b60006115a283611c73565b82106116165760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610cef565b506001600160a01b03821660009081526010602090815260408083208484529091529020545b92915050565b3330146116915760405162461bcd60e51b815260206004820152600a60248201527f63616e2774206d696e74000000000000000000000000000000000000000000006044820152606401610cef565b61169b8282612b70565b5050565b610e5f83838360405180602001604052806000815250611e7e565b60006116c46124f5565b915050808211156117175760405162461bcd60e51b815260206004820152601160248201527f636174206e6f7420636c61696d61626c650000000000000000000000000000006044820152606401610cef565b6000828152600860205260409020546001600160a01b03161561179a576000828152600860205260409020546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600f60248201527f6e6f742077696e6e696e672062696400000000000000000000000000000000006044820152606401610cef565b6005546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b5050506000838152600760205260409020541590506118885760055460008381526007602052604090819020549051630eb2d36560e11b81526001600160a01b0390921691631d65a6ca916118559160040190815260200190565b600060405180830381600087803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b505050505b6000828152600760209081526040918290205482518581529182015233917f5194250dcf8127c64e3f127f24a8638af7d0d9f87e556a812bb01c3bf5cc56c99101611504565b60006118d960125490565b821061194d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610cef565b6012828154811061196e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600860205260409020546001600160a01b03163314156119e75760405162461bcd60e51b815260206004820152601760248201527f63616e27742077697468647261772068696768206269640000000000000000006044820152606401610cef565b600081815260096020908152604080832033845290915290205480611a4e5760405162461bcd60e51b815260206004820152601360248201527f6e6f7468696e6720746f207769746864726177000000000000000000000000006044820152606401610cef565b600082815260096020908152604080832033808552925280832083905551909183156108fc02918491818181858888f19350505050158015611a94573d6000803e3d6000fd5b50604080518381526020810183905233917fbf619f0eaf6ffbae02f4d242ffb652123efc1efcbed6685d92b22ac25af1d1e89101611504565b6016546001600160a01b03163314611b135760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610cef565b601680546001600160a01b03191690556040517f1b3f3fa5932c6c919461570f437425f40635b18a91b9f11a911b477648e4665790600090a1565b6000818152600c60205260408120546001600160a01b031680610be05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610cef565b60176020526000908152604090208054611bf2906138cf565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e906138cf565b8015611c6b5780601f10611c4057610100808354040283529160200191611c6b565b820191906000526020600020905b815481529060010190602001808311611c4e57829003601f168201915b505050505081565b60006001600160a01b038216611cf15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610cef565b506001600160a01b03166000908152600d602052604090205490565b6016546001600160a01b03163314611d535760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610cef565b611d5f6015838361327f565b507f157d450c8fb1377294d9db75af1de2753efc52d8e5578551d70d2c7d9cd74df98282604051611d919291906137ac565b60405180910390a15050565b6060600b8054610bf7906138cf565b6001600160a01b038216331415611e055760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cef565b336000818152600f602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e72911515815260200190565b60405180910390a35050565b611e8833836128a5565b611efa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610cef565b611f0684848484612cbe565b50505050565b600080611f176124f5565b91509150808211611f6a5760405162461bcd60e51b815260206004820152600e60248201527f6e6f7420696e2061756374696f6e0000000000000000000000000000000000006044820152606401610cef565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168367ffffffffffffffff1610611fed5760405162461bcd60e51b815260206004820152600960248201527f62616420696e64657800000000000000000000000000000000000000000000006044820152606401610cef565b600061200367ffffffffffffffff8516846137f6565b60008181526009602090815260408083203384529091528120549192509061202c9034906137f6565b6000838152600760205260409020549091506120739067ffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906137f6565b8110156120c25760405162461bcd60e51b815260206004820152600a60248201527f6e6f7420656e6f756768000000000000000000000000000000000000000000006044820152606401610cef565b60008281526006602052604081208054600192906120e19084906137f6565b909155505060008281526007602090815260408083208490556008825280832080546001600160a01b031916339081179091556009835281842081855283528184208590558584526006835292819020548151868152928301859052908201527f4dcc013473324698bfbe263facec4ea4b1bc43624236542deabec62c2122b3059060600160405180910390a25050505050565b6000818152600c60205260409020546060906001600160a01b03166122025760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610cef565b600061220c612d47565b9050600081511161222c5760405180602001604052806000815250612257565b8061223684612d56565b6040516020016122479291906136d8565b6040516020818303038152906040525b9392505050565b3361226884611b4e565b6001600160a01b0316146122be5760405162461bcd60e51b815260206004820152600c60248201527f6e6f7420796f75722063617400000000000000000000000000000000000000006044820152606401610cef565b600083815260176020526040812080546122d7906138cf565b80601f0160208091040260200160405190810160405280929190818152602001828054612303906138cf565b80156123505780601f1061232557610100808354040283529160200191612350565b820191906000526020600020905b81548152906001019060200180831161233357829003601f168201915b5050505050905080516000146123a85760405162461bcd60e51b815260206004820152600d60248201527f616c7265616479206e616d6564000000000000000000000000000000000000006044820152606401610cef565b60008481526017602052604090206123c190848461327f565b506018546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116602483015260448201929092527f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd90606401602060405180830381600087803b15801561247157600080fd5b505af1158015612485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a99190613540565b50336001600160a01b03167f14be965782dad2b022f119f93532e6354c58d324c1fe44822adc5930083728778585856040516124e7939291906137d3565b60405180910390a250505050565b60008060008060005b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff168367ffffffffffffffff16116126a95760006125857f00000000000000000000000000000000000000000000000000000000000000007f000000000000000000000000000000000000000000000000000000000000000061380e565b61258f9085613845565b6125b9907f000000000000000000000000000000000000000000000000000000000000000061380e565b9050428167ffffffffffffffff1611156125d357506126a9565b6125fd7f000000000000000000000000000000000000000000000000000000000000000085613845565b61260890600161380e565b67ffffffffffffffff1692504261263f7f00000000000000000000000000000000000000000000000000000000000000008361380e565b67ffffffffffffffff16111561265557506126a9565b7f00000000000000000000000000000000000000000000000000000000000000006126808186613845565b61268a919061380e565b67ffffffffffffffff169150836126a081613925565b945050506124fe565b9093509150509091565b6014546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561271957600080fd5b505afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612751919061337b565b6001600160a01b0316141561276a57600191505061163c565b6001600160a01b038085166000908152600f602090815260408083209387168352929052205460ff165b949350505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806127ff57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610be057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610be0565b6000818152600e6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061286c82611b4e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600c60205260408120546001600160a01b031661291e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cef565b600061292983611b4e565b9050806001600160a01b0316846001600160a01b031614806129645750836001600160a01b031661295984610c7a565b6001600160a01b0316145b8061279457506001600160a01b038082166000908152600f602090815260408083209388168352929052205460ff16612794565b826001600160a01b03166129ab82611b4e565b6001600160a01b031614612a275760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610cef565b6001600160a01b038216612aa25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610cef565b612aad838383612ea5565b612ab8600082612837565b6001600160a01b0383166000908152600d60205260408120805460019290612ae1908490613875565b90915550506001600160a01b0382166000908152600d60205260408120805460019290612b0f9084906137f6565b90915550506000818152600c602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216612bc65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cef565b6000818152600c60205260409020546001600160a01b031615612c2b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cef565b612c3760008383612ea5565b6001600160a01b0382166000908152600d60205260408120805460019290612c609084906137f6565b90915550506000818152600c602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612cc9848484612998565b612cd584848484612f62565b611f065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610cef565b606060158054610bf7906138cf565b606081612d97575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610be3565b8160005b8115612dc15780612dab8161390a565b9150612dba9050600a83613831565b9150612d9b565b60008167ffffffffffffffff811115612dea57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e14576020820181803683370190505b5090505b841561279457612e29600183613875565b9150612e36600a8661394d565b612e419060306137f6565b60f81b818381518110612e6457634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e9e600a86613831565b9450612e18565b6001600160a01b038316612f0057612efb81601280546000838152601360205260408120829055600182018355919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440155565b612f23565b816001600160a01b0316836001600160a01b031614612f2357612f2383826130c5565b6001600160a01b038216612f3f57612f3a81613162565b610e5f565b826001600160a01b0316826001600160a01b031614610e5f57610e5f828261323b565b60006001600160a01b0384163b156130ba57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fa6903390899088908890600401613707565b602060405180830381600087803b158015612fc057600080fd5b505af1925050508015612ff0575060408051601f3d908101601f19168201909252612fed91810190613578565b60015b6130a0573d80801561301e576040519150601f19603f3d011682016040523d82523d6000602084013e613023565b606091505b5080516130985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610cef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612794565b506001949350505050565b600060016130d284611c73565b6130dc9190613875565b60008381526011602052604090205490915080821461312f576001600160a01b03841660009081526010602090815260408083208584528252808320548484528184208190558352601190915290208190555b5060009182526011602090815260408084208490556001600160a01b039094168352601081528383209183525290812055565b60125460009061317490600190613875565b600083815260136020526040812054601280549394509092849081106131aa57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080601283815481106131d957634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260139091526040808220849055858252812055601280548061321f57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061324683611c73565b6001600160a01b039093166000908152601060209081526040808320868452825280832085905593825260119052919091209190915550565b82805461328b906138cf565b90600052602060002090601f0160209004810192826132ad57600085556132f3565b82601f106132c65782800160ff198235161785556132f3565b828001600101855582156132f3579182015b828111156132f35782358255916020019190600101906132d8565b506132ff929150613303565b5090565b5b808211156132ff5760008155600101613304565b60008083601f840112613329578182fd5b50813567ffffffffffffffff811115613340578182fd5b60208301915083602082850101111561335857600080fd5b9250929050565b600060208284031215613370578081fd5b8135612257816139a3565b60006020828403121561338c578081fd5b8151612257816139a3565b600080604083850312156133a9578081fd5b82356133b4816139a3565b915060208301356133c4816139a3565b809150509250929050565b6000806000606084860312156133e3578081fd5b83356133ee816139a3565b925060208401356133fe816139a3565b929592945050506040919091013590565b60008060008060808587031215613424578081fd5b843561342f816139a3565b9350602085013561343f816139a3565b925060408501359150606085013567ffffffffffffffff80821115613462578283fd5b818701915087601f830112613475578283fd5b8135818111156134875761348761398d565b604051601f8201601f19908116603f011681019083821181831017156134af576134af61398d565b816040528281528a60208487010111156134c7578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156134fa578182fd5b8235613505816139a3565b915060208301356133c4816139bb565b60008060408385031215613527578182fd5b8235613532816139a3565b946020939093013593505050565b600060208284031215613551578081fd5b8151612257816139bb565b60006020828403121561356d578081fd5b8135612257816139c9565b600060208284031215613589578081fd5b8151612257816139c9565b600080602083850312156135a6578182fd5b823567ffffffffffffffff8111156135bc578283fd5b6135c885828601613318565b90969095509350505050565b6000602082840312156135e5578081fd5b5035919050565b600080604083850312156135fe578182fd5b8235915060208301356133c4816139a3565b600080600060408486031215613624578283fd5b83359250602084013567ffffffffffffffff811115613641578283fd5b61364d86828701613318565b9497909650939450505050565b60006020828403121561366b578081fd5b813567ffffffffffffffff81168114612257578182fd5b6000815180845261369a81602086016020860161388c565b601f01601f19169290920160200192915050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600083516136ea81846020880161388c565b8351908301906136fe81836020880161388c565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526137396080830184613682565b9695505050505050565b600060808201868352602060808185015281875180845260a0860191508289019350845b8181101561378c5784516001600160a01b031683529383019391830191600101613767565b50506001600160a01b039690961660408501525050506060015292915050565b6000602082526127946020830184866136ae565b6000602082526122576020830184613682565b6000848252604060208301526137ed6040830184866136ae565b95945050505050565b6000821982111561380957613809613961565b500190565b600067ffffffffffffffff8083168185168083038211156136fe576136fe613961565b60008261384057613840613977565b500490565b600067ffffffffffffffff8083168185168183048111821515161561386c5761386c613961565b02949350505050565b60008282101561388757613887613961565b500390565b60005b838110156138a757818101518382015260200161388f565b83811115611f065750506000910152565b6000816138c7576138c7613961565b506000190190565b600181811c908216806138e357607f821691505b6020821081141561390457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561391e5761391e613961565b5060010190565b600067ffffffffffffffff8083168181141561394357613943613961565b6001019392505050565b60008261395c5761395c613977565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146139b857600080fd5b50565b80151581146139b857600080fd5b6001600160e01b0319811681146139b857600080fdfea264697066735822122009e1c9500da7c610661c8e0103bf64a4784e45f7316962f24ff9fe38f421706764736f6c63430008030033000000000000000000000000054bd236b42385c938357112f419dc59436878860000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000dead000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000030e2a5a81c000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000606e0f40000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000607b06000000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000007e90000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f6170692e646f6f6d2e6361742f6d657461646174612f0000

Deployed Bytecode

0x6080604052600436106103555760003560e01c8063696ded4a116101bb578063b88d4fde116100f7578063cd7c032611610095578063e2d3b78e1161006f578063e2d3b78e14610ae2578063e985e9c514610b16578063f285dec014610b36578063f76d050d14610b6e57610355565b8063cd7c032614610a62578063d1f61c1214610a82578063d849f74d14610ab857610355565b8063c18c469c116100d1578063c18c469c146109f9578063c261d45614610a0f578063c87b56dd14610a22578063c8f5b7f814610a4257610355565b8063b88d4fde14610978578063b9a958b414610998578063c1168c60146109c557610355565b80638c49f2e61161016457806395d89b411161013e57806395d89b41146108db578063a22cb465146108f0578063a8e2057b14610910578063b830620a1461094457610355565b80638c49f2e61461086e5780638da5cb5b1461089b578063931688cb146108bb57610355565b80636eb756ea116101955780636eb756ea146107e657806370a082311461081a5780637ca9ae681461083a57610355565b8063696ded4a1461075e57806369aa8dfe1461077e5780636c817912146107b257610355565b806323b872dd1161029557806344df8e70116102335780634f6ccce71161020d5780634f6ccce7146106e9578063561ce984146107095780636012565b146107295780636352211e1461073e57610355565b806344df8e701461067f57806345ca7738146106b35780634d1a9846146106c957610355565b80633d5e63571161026f5780633d5e6357146105de57806340c10f191461060b5780634193e5fa1461062b57806342842e0e1461065f57610355565b806323b872dd1461056a5780632a5ad5021461058a5780632f745c59146105be57610355565b80630ff3687b11610302578063196ee9c7116102dc578063196ee9c7146104df5780631d65a6ca146104f55780631f423965146105155780631fbe19791461056257610355565b80630ff3687b146104815780631694505e1461049657806318160ddd146104ca57610355565b8063081812fc11610333578063081812fc146103f3578063095ea7b31461042b5780630d48c5d61461044d57610355565b806301ffc9a71461035a57806306fdde031461038f5780630783b338146103b1575b600080fd5b34801561036657600080fd5b5061037a61037536600461355c565b610ba2565b60405190151581526020015b60405180910390f35b34801561039b57600080fd5b506103a4610be8565b60405161038691906137c0565b3480156103bd57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000640081565b604051908152602001610386565b3480156103ff57600080fd5b5061041361040e3660046135d4565b610c7a565b6040516001600160a01b039091168152602001610386565b34801561043757600080fd5b5061044b610446366004613515565b610d14565b005b34801561045957600080fd5b506104137f000000000000000000000000054bd236b42385c938357112f419dc594368788681565b34801561048d57600080fd5b506103e5610e64565b3480156104a257600080fd5b506104137f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d81565b3480156104d657600080fd5b506012546103e5565b3480156104eb57600080fd5b506103e560015481565b34801561050157600080fd5b5061044b6105103660046135d4565b610ea3565b34801561052157600080fd5b506105497f00000000000000000000000000000000000000000000000000000000607b060081565b60405167ffffffffffffffff9091168152602001610386565b61044b6110fb565b34801561057657600080fd5b5061044b6105853660046133cf565b611510565b34801561059657600080fd5b506105497f000000000000000000000000000000000000000000000000000000000007e90081565b3480156105ca57600080fd5b506103e56105d9366004613515565b611597565b3480156105ea57600080fd5b506103e56105f93660046135d4565b60076020526000908152604090205481565b34801561061757600080fd5b5061044b610626366004613515565b611642565b34801561063757600080fd5b506105497f000000000000000000000000000000000000000000000000016345785d8a000081565b34801561066b57600080fd5b5061044b61067a3660046133cf565b61169f565b34801561068b57600080fd5b506104137f000000000000000000000000000000000000000000000000000000000000dead81565b3480156106bf57600080fd5b506103e560185481565b3480156106d557600080fd5b5061044b6106e43660046135d4565b6116ba565b3480156106f557600080fd5b506103e56107043660046135d4565b6118ce565b34801561071557600080fd5b5061044b6107243660046135d4565b611980565b34801561073557600080fd5b5061044b611acd565b34801561074a57600080fd5b506104136107593660046135d4565b611b4e565b34801561076a57600080fd5b506103a46107793660046135d4565b611bd9565b34801561078a57600080fd5b506103e57f00000000000000000000000000000000000000000000000000030e2a5a81c00081565b3480156107be57600080fd5b506103e57f00000000000000000000000000000000000000000000000000000000606e0f4081565b3480156107f257600080fd5b506105497f000000000000000000000000000000000000000000000000000000000001518081565b34801561082657600080fd5b506103e561083536600461335f565b611c73565b34801561084657600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000000181565b34801561087a57600080fd5b506103e561088936600461335f565b60036020526000908152604090205481565b3480156108a757600080fd5b50601654610413906001600160a01b031681565b3480156108c757600080fd5b5061044b6108d6366004613594565b611d0d565b3480156108e757600080fd5b506103a4611d9d565b3480156108fc57600080fd5b5061044b61090b3660046134e8565b611dac565b34801561091c57600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000001081565b34801561095057600080fd5b506105497f000000000000000000000000000000000000000000000000000000000000001081565b34801561098457600080fd5b5061044b61099336600461340f565b611e7e565b3480156109a457600080fd5b506103e56109b33660046135d4565b60066020526000908152604090205481565b3480156109d157600080fd5b506103e57f000000000000000000000000000000000000000000000000002386f26fc1000081565b348015610a0557600080fd5b506103e560025481565b61044b610a1d36600461365a565b611f0c565b348015610a2e57600080fd5b506103a4610a3d3660046135d4565b612175565b348015610a4e57600080fd5b5061044b610a5d366004613610565b61225e565b348015610a6e57600080fd5b50601454610413906001600160a01b031681565b348015610a8e57600080fd5b50610413610a9d3660046135d4565b6008602052600090815260409020546001600160a01b031681565b348015610ac457600080fd5b50610acd6124f5565b60408051928352602083019190915201610386565b348015610aee57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000006481565b348015610b2257600080fd5b5061037a610b31366004613397565b6126b3565b348015610b4257600080fd5b506103e5610b513660046135ec565b600960209081526000928352604080842090915290825290205481565b348015610b7a57600080fd5b506103e57f000000000000000000000000000000000000000000000000000000000000010081565b60006001600160e01b031982167f780e9d63000000000000000000000000000000000000000000000000000000001480610be05750610be08261279c565b90505b919050565b6060600a8054610bf7906138cf565b80601f0160208091040260200160405190810160405280929190818152602001828054610c23906138cf565b8015610c705780601f10610c4557610100808354040283529160200191610c70565b820191906000526020600020905b815481529060010190602001808311610c5357829003601f168201915b5050505050905090565b6000818152600c60205260408120546001600160a01b0316610cf85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600e60205260409020546001600160a01b031690565b6000610d1f82611b4e565b9050806001600160a01b0316836001600160a01b03161415610da95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610cef565b336001600160a01b0382161480610de357506001600160a01b0381166000908152600f6020908152604080832033845290915290205460ff165b610e555760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610cef565b610e5f8383612837565b505050565b600080610e6f6124f5565b9150610e9d9050817f0000000000000000000000000000000000000000000000000000000000000100613875565b91505090565b333014610ef25760405162461bcd60e51b815260206004820152601360248201527f63616e2774207377617020616e64206275726e000000000000000000000000006044820152606401610cef565b6040805160028082526060820183526000926020830190803683370190505090507f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d6001600160a01b031663ad5c46486040518163ffffffff1660e01b815260040160206040518083038186803b158015610f6c57600080fd5b505afa158015610f80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa4919061337b565b81600081518110610fc557634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b0316815250507f000000000000000000000000054bd236b42385c938357112f419dc59436878868160018151811061102757634e487b7160e01b600052603260045260246000fd5b6001600160a01b0392831660209182029290920101526040517fb6f9de950000000000000000000000000000000000000000000000000000000081527f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d9091169063b6f9de959084906110c59060009086907f000000000000000000000000000000000000000000000000000000000000dead904290600401613743565b6000604051808303818588803b1580156110de57600080fd5b505af11580156110f2573d6000803e3d6000fd5b50505050505050565b7f00000000000000000000000000000000000000000000000000000000606e0f4042101561116b5760405162461bcd60e51b815260206004820152600960248201527f746f6f206561726c7900000000000000000000000000000000000000000000006044820152606401610cef565b336000908152600360205260409020546111a6907f0000000000000000000000000000000000000000000000000000000000000001906137f6565b4310156111f55760405162461bcd60e51b815260206004820152600860248201527f746f6f20736f6f6e0000000000000000000000000000000000000000000000006044820152606401610cef565b6000600154116112475760405162461bcd60e51b815260206004820152600c60248201527f6e6f2063617473206c65667400000000000000000000000000000000000000006044820152606401610cef565b6002543410156112995760405162461bcd60e51b815260206004820152600d60248201527f76616c756520746f6f206c6f77000000000000000000000000000000000000006044820152606401610cef565b33600090815260036020526040812043905560025460048054919283926112c19084906137f6565b9091555050600180549060006112d6836138b8565b91905055507f00000000000000000000000000000000000000000000000000000000000000646001547f000000000000000000000000000000000000000000000000000000000000630061132a9190613875565b611334919061394d565b15806113405750600154155b156113f35760015461135657600060025561138e565b7f00000000000000000000000000000000000000000000000000030e2a5a81c0006002600082825461138891906137f6565b90915550505b60005460048054604051630eb2d36560e11b8152918201526001600160a01b0390911690631d65a6ca90602401600060405180830381600087803b1580156113d557600080fd5b505af11580156113e9573d6000803e3d6000fd5b5050600060045550505b60006001547f00000000000000000000000000000000000000000000000000000000000064006114239190613875565b6000546040516340c10f1960e01b8152336004820152602481018390529192506001600160a01b0316906340c10f1990604401600060405180830381600087803b15801561147057600080fd5b505af1158015611484573d6000803e3d6000fd5b50505050813411156114c857336108fc61149e8434613875565b6040518115909202916000818181858888f193505050501580156114c6573d6000803e3d6000fd5b505b60025460405133917f28f3dc959abf766a02cc0ae09b189920c2262e217ab99e40302eb498c3d1c88b9161150491858252602082015260400190565b60405180910390a25050565b61151a33826128a5565b61158c5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610cef565b610e5f838383612998565b60006115a283611c73565b82106116165760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e64730000000000000000000000000000000000000000006064820152608401610cef565b506001600160a01b03821660009081526010602090815260408083208484529091529020545b92915050565b3330146116915760405162461bcd60e51b815260206004820152600a60248201527f63616e2774206d696e74000000000000000000000000000000000000000000006044820152606401610cef565b61169b8282612b70565b5050565b610e5f83838360405180602001604052806000815250611e7e565b60006116c46124f5565b915050808211156117175760405162461bcd60e51b815260206004820152601160248201527f636174206e6f7420636c61696d61626c650000000000000000000000000000006044820152606401610cef565b6000828152600860205260409020546001600160a01b03161561179a576000828152600860205260409020546001600160a01b0316331461179a5760405162461bcd60e51b815260206004820152600f60248201527f6e6f742077696e6e696e672062696400000000000000000000000000000000006044820152606401610cef565b6005546040516340c10f1960e01b8152336004820152602481018490526001600160a01b03909116906340c10f1990604401600060405180830381600087803b1580156117e657600080fd5b505af11580156117fa573d6000803e3d6000fd5b5050506000838152600760205260409020541590506118885760055460008381526007602052604090819020549051630eb2d36560e11b81526001600160a01b0390921691631d65a6ca916118559160040190815260200190565b600060405180830381600087803b15801561186f57600080fd5b505af1158015611883573d6000803e3d6000fd5b505050505b6000828152600760209081526040918290205482518581529182015233917f5194250dcf8127c64e3f127f24a8638af7d0d9f87e556a812bb01c3bf5cc56c99101611504565b60006118d960125490565b821061194d5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e647300000000000000000000000000000000000000006064820152608401610cef565b6012828154811061196e57634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600860205260409020546001600160a01b03163314156119e75760405162461bcd60e51b815260206004820152601760248201527f63616e27742077697468647261772068696768206269640000000000000000006044820152606401610cef565b600081815260096020908152604080832033845290915290205480611a4e5760405162461bcd60e51b815260206004820152601360248201527f6e6f7468696e6720746f207769746864726177000000000000000000000000006044820152606401610cef565b600082815260096020908152604080832033808552925280832083905551909183156108fc02918491818181858888f19350505050158015611a94573d6000803e3d6000fd5b50604080518381526020810183905233917fbf619f0eaf6ffbae02f4d242ffb652123efc1efcbed6685d92b22ac25af1d1e89101611504565b6016546001600160a01b03163314611b135760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610cef565b601680546001600160a01b03191690556040517f1b3f3fa5932c6c919461570f437425f40635b18a91b9f11a911b477648e4665790600090a1565b6000818152600c60205260408120546001600160a01b031680610be05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610cef565b60176020526000908152604090208054611bf2906138cf565b80601f0160208091040260200160405190810160405280929190818152602001828054611c1e906138cf565b8015611c6b5780601f10611c4057610100808354040283529160200191611c6b565b820191906000526020600020905b815481529060010190602001808311611c4e57829003601f168201915b505050505081565b60006001600160a01b038216611cf15760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610cef565b506001600160a01b03166000908152600d602052604090205490565b6016546001600160a01b03163314611d535760405162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b6044820152606401610cef565b611d5f6015838361327f565b507f157d450c8fb1377294d9db75af1de2753efc52d8e5578551d70d2c7d9cd74df98282604051611d919291906137ac565b60405180910390a15050565b6060600b8054610bf7906138cf565b6001600160a01b038216331415611e055760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610cef565b336000818152600f602090815260408083206001600160a01b0387168085529252909120805460ff1916841515179055906001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e72911515815260200190565b60405180910390a35050565b611e8833836128a5565b611efa5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610cef565b611f0684848484612cbe565b50505050565b600080611f176124f5565b91509150808211611f6a5760405162461bcd60e51b815260206004820152600e60248201527f6e6f7420696e2061756374696f6e0000000000000000000000000000000000006044820152606401610cef565b7f000000000000000000000000000000000000000000000000000000000000001067ffffffffffffffff168367ffffffffffffffff1610611fed5760405162461bcd60e51b815260206004820152600960248201527f62616420696e64657800000000000000000000000000000000000000000000006044820152606401610cef565b600061200367ffffffffffffffff8516846137f6565b60008181526009602090815260408083203384529091528120549192509061202c9034906137f6565b6000838152600760205260409020549091506120739067ffffffffffffffff7f000000000000000000000000000000000000000000000000016345785d8a000016906137f6565b8110156120c25760405162461bcd60e51b815260206004820152600a60248201527f6e6f7420656e6f756768000000000000000000000000000000000000000000006044820152606401610cef565b60008281526006602052604081208054600192906120e19084906137f6565b909155505060008281526007602090815260408083208490556008825280832080546001600160a01b031916339081179091556009835281842081855283528184208590558584526006835292819020548151868152928301859052908201527f4dcc013473324698bfbe263facec4ea4b1bc43624236542deabec62c2122b3059060600160405180910390a25050505050565b6000818152600c60205260409020546060906001600160a01b03166122025760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610cef565b600061220c612d47565b9050600081511161222c5760405180602001604052806000815250612257565b8061223684612d56565b6040516020016122479291906136d8565b6040516020818303038152906040525b9392505050565b3361226884611b4e565b6001600160a01b0316146122be5760405162461bcd60e51b815260206004820152600c60248201527f6e6f7420796f75722063617400000000000000000000000000000000000000006044820152606401610cef565b600083815260176020526040812080546122d7906138cf565b80601f0160208091040260200160405190810160405280929190818152602001828054612303906138cf565b80156123505780601f1061232557610100808354040283529160200191612350565b820191906000526020600020905b81548152906001019060200180831161233357829003601f168201915b5050505050905080516000146123a85760405162461bcd60e51b815260206004820152600d60248201527f616c7265616479206e616d6564000000000000000000000000000000000000006044820152606401610cef565b60008481526017602052604090206123c190848461327f565b506018546040517f23b872dd0000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b037f000000000000000000000000000000000000000000000000000000000000dead8116602483015260448201929092527f000000000000000000000000054bd236b42385c938357112f419dc5943687886909116906323b872dd90606401602060405180830381600087803b15801561247157600080fd5b505af1158015612485573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124a99190613540565b50336001600160a01b03167f14be965782dad2b022f119f93532e6354c58d324c1fe44822adc5930083728778585856040516124e7939291906137d3565b60405180910390a250505050565b60008060008060005b7f000000000000000000000000000000000000000000000000000000000000001067ffffffffffffffff168367ffffffffffffffff16116126a95760006125857f000000000000000000000000000000000000000000000000000000000007e9007f000000000000000000000000000000000000000000000000000000000001518061380e565b61258f9085613845565b6125b9907f00000000000000000000000000000000000000000000000000000000607b060061380e565b9050428167ffffffffffffffff1611156125d357506126a9565b6125fd7f000000000000000000000000000000000000000000000000000000000000001085613845565b61260890600161380e565b67ffffffffffffffff1692504261263f7f00000000000000000000000000000000000000000000000000000000000151808361380e565b67ffffffffffffffff16111561265557506126a9565b7f00000000000000000000000000000000000000000000000000000000000000106126808186613845565b61268a919061380e565b67ffffffffffffffff169150836126a081613925565b945050506124fe565b9093509150509091565b6014546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b15801561271957600080fd5b505afa15801561272d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612751919061337b565b6001600160a01b0316141561276a57600191505061163c565b6001600160a01b038085166000908152600f602090815260408083209387168352929052205460ff165b949350505050565b60006001600160e01b031982167f80ac58cd0000000000000000000000000000000000000000000000000000000014806127ff57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610be057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610be0565b6000818152600e6020526040902080546001600160a01b0319166001600160a01b038416908117909155819061286c82611b4e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600c60205260408120546001600160a01b031661291e5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610cef565b600061292983611b4e565b9050806001600160a01b0316846001600160a01b031614806129645750836001600160a01b031661295984610c7a565b6001600160a01b0316145b8061279457506001600160a01b038082166000908152600f602090815260408083209388168352929052205460ff16612794565b826001600160a01b03166129ab82611b4e565b6001600160a01b031614612a275760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610cef565b6001600160a01b038216612aa25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610cef565b612aad838383612ea5565b612ab8600082612837565b6001600160a01b0383166000908152600d60205260408120805460019290612ae1908490613875565b90915550506001600160a01b0382166000908152600d60205260408120805460019290612b0f9084906137f6565b90915550506000818152600c602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b038216612bc65760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610cef565b6000818152600c60205260409020546001600160a01b031615612c2b5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610cef565b612c3760008383612ea5565b6001600160a01b0382166000908152600d60205260408120805460019290612c609084906137f6565b90915550506000818152600c602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b612cc9848484612998565b612cd584848484612f62565b611f065760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610cef565b606060158054610bf7906138cf565b606081612d97575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610be3565b8160005b8115612dc15780612dab8161390a565b9150612dba9050600a83613831565b9150612d9b565b60008167ffffffffffffffff811115612dea57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612e14576020820181803683370190505b5090505b841561279457612e29600183613875565b9150612e36600a8661394d565b612e419060306137f6565b60f81b818381518110612e6457634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612e9e600a86613831565b9450612e18565b6001600160a01b038316612f0057612efb81601280546000838152601360205260408120829055600182018355919091527fbb8a6a4669ba250d26cd7a459eca9d215f8307e33aebe50379bc5a3617ec34440155565b612f23565b816001600160a01b0316836001600160a01b031614612f2357612f2383826130c5565b6001600160a01b038216612f3f57612f3a81613162565b610e5f565b826001600160a01b0316826001600160a01b031614610e5f57610e5f828261323b565b60006001600160a01b0384163b156130ba57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612fa6903390899088908890600401613707565b602060405180830381600087803b158015612fc057600080fd5b505af1925050508015612ff0575060408051601f3d908101601f19168201909252612fed91810190613578565b60015b6130a0573d80801561301e576040519150601f19603f3d011682016040523d82523d6000602084013e613023565b606091505b5080516130985760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610cef565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612794565b506001949350505050565b600060016130d284611c73565b6130dc9190613875565b60008381526011602052604090205490915080821461312f576001600160a01b03841660009081526010602090815260408083208584528252808320548484528184208190558352601190915290208190555b5060009182526011602090815260408084208490556001600160a01b039094168352601081528383209183525290812055565b60125460009061317490600190613875565b600083815260136020526040812054601280549394509092849081106131aa57634e487b7160e01b600052603260045260246000fd5b9060005260206000200154905080601283815481106131d957634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260139091526040808220849055858252812055601280548061321f57634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061324683611c73565b6001600160a01b039093166000908152601060209081526040808320868452825280832085905593825260119052919091209190915550565b82805461328b906138cf565b90600052602060002090601f0160209004810192826132ad57600085556132f3565b82601f106132c65782800160ff198235161785556132f3565b828001600101855582156132f3579182015b828111156132f35782358255916020019190600101906132d8565b506132ff929150613303565b5090565b5b808211156132ff5760008155600101613304565b60008083601f840112613329578182fd5b50813567ffffffffffffffff811115613340578182fd5b60208301915083602082850101111561335857600080fd5b9250929050565b600060208284031215613370578081fd5b8135612257816139a3565b60006020828403121561338c578081fd5b8151612257816139a3565b600080604083850312156133a9578081fd5b82356133b4816139a3565b915060208301356133c4816139a3565b809150509250929050565b6000806000606084860312156133e3578081fd5b83356133ee816139a3565b925060208401356133fe816139a3565b929592945050506040919091013590565b60008060008060808587031215613424578081fd5b843561342f816139a3565b9350602085013561343f816139a3565b925060408501359150606085013567ffffffffffffffff80821115613462578283fd5b818701915087601f830112613475578283fd5b8135818111156134875761348761398d565b604051601f8201601f19908116603f011681019083821181831017156134af576134af61398d565b816040528281528a60208487010111156134c7578586fd5b82602086016020830137918201602001949094529598949750929550505050565b600080604083850312156134fa578182fd5b8235613505816139a3565b915060208301356133c4816139bb565b60008060408385031215613527578182fd5b8235613532816139a3565b946020939093013593505050565b600060208284031215613551578081fd5b8151612257816139bb565b60006020828403121561356d578081fd5b8135612257816139c9565b600060208284031215613589578081fd5b8151612257816139c9565b600080602083850312156135a6578182fd5b823567ffffffffffffffff8111156135bc578283fd5b6135c885828601613318565b90969095509350505050565b6000602082840312156135e5578081fd5b5035919050565b600080604083850312156135fe578182fd5b8235915060208301356133c4816139a3565b600080600060408486031215613624578283fd5b83359250602084013567ffffffffffffffff811115613641578283fd5b61364d86828701613318565b9497909650939450505050565b60006020828403121561366b578081fd5b813567ffffffffffffffff81168114612257578182fd5b6000815180845261369a81602086016020860161388c565b601f01601f19169290920160200192915050565b60008284528282602086013780602084860101526020601f19601f85011685010190509392505050565b600083516136ea81846020880161388c565b8351908301906136fe81836020880161388c565b01949350505050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526137396080830184613682565b9695505050505050565b600060808201868352602060808185015281875180845260a0860191508289019350845b8181101561378c5784516001600160a01b031683529383019391830191600101613767565b50506001600160a01b039690961660408501525050506060015292915050565b6000602082526127946020830184866136ae565b6000602082526122576020830184613682565b6000848252604060208301526137ed6040830184866136ae565b95945050505050565b6000821982111561380957613809613961565b500190565b600067ffffffffffffffff8083168185168083038211156136fe576136fe613961565b60008261384057613840613977565b500490565b600067ffffffffffffffff8083168185168183048111821515161561386c5761386c613961565b02949350505050565b60008282101561388757613887613961565b500390565b60005b838110156138a757818101518382015260200161388f565b83811115611f065750506000910152565b6000816138c7576138c7613961565b506000190190565b600181811c908216806138e357607f821691505b6020821081141561390457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561391e5761391e613961565b5060010190565b600067ffffffffffffffff8083168181141561394357613943613961565b6001019392505050565b60008261395c5761395c613977565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146139b857600080fd5b50565b80151581146139b857600080fd5b6001600160e01b0319811681146139b857600080fdfea264697066735822122009e1c9500da7c610661c8e0103bf64a4784e45f7316962f24ff9fe38f421706764736f6c63430008030033

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

000000000000000000000000054bd236b42385c938357112f419dc59436878860000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d000000000000000000000000000000000000000000000000000000000000dead000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c100000000000000000000000000000000000000000000000000000000000002400000000000000000000000000000000000000000000000000000000000006300000000000000000000000000000000000000000000000000002386f26fc1000000000000000000000000000000000000000000000000000000030e2a5a81c000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000606e0f40000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000607b06000000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000007e90000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000016345785d8a0000000000000000000000000000000000000000000000000000000000000000001e68747470733a2f2f6170692e646f6f6d2e6361742f6d657461646174612f0000

-----Decoded View---------------
Arg [0] : addresses (address[4]): 0x054bD236b42385c938357112F419dC5943687886,0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D,0x000000000000000000000000000000000000dEaD,0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [1] : baseURI_ (string): https://api.doom.cat/metadata/
Arg [2] : normalCats_ (uint32): 25344
Arg [3] : rescueDetails_ (uint256[5]): 10000000000000000,860000000000000,100,1617825600,1
Arg [4] : auctionsDetails_ (uint64[6]): 1618675200,86400,518400,16,16,100000000000000000
Arg [5] : nameChangePrice_ (uint256): 100000000000000000

-----Encoded View---------------
20 Constructor Arguments found :
Arg [0] : 000000000000000000000000054bd236b42385c938357112f419dc5943687886
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 000000000000000000000000000000000000000000000000000000000000dead
Arg [3] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000240
Arg [5] : 0000000000000000000000000000000000000000000000000000000000006300
Arg [6] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [7] : 00000000000000000000000000000000000000000000000000030e2a5a81c000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [9] : 00000000000000000000000000000000000000000000000000000000606e0f40
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [11] : 00000000000000000000000000000000000000000000000000000000607b0600
Arg [12] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [13] : 000000000000000000000000000000000000000000000000000000000007e900
Arg [14] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [16] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [17] : 000000000000000000000000000000000000000000000000016345785d8a0000
Arg [18] : 000000000000000000000000000000000000000000000000000000000000001e
Arg [19] : 68747470733a2f2f6170692e646f6f6d2e6361742f6d657461646174612f0000


Deployed Bytecode Sourcemap

59158:3858:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39148:237;;;;;;;;;;-1:-1:-1;39148:237:0;;;;;:::i;:::-;;:::i;:::-;;;9026:14:1;;9019:22;9001:41;;8989:2;8974:18;39148:237:0;;;;;;;;27326:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47057:34::-;;;;;;;;;;;;;;;;;;22813:25:1;;;22801:2;22786:18;47057:34:0;22768:76:1;28793:221:0;;;;;;;;;;-1:-1:-1;28793:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;7573:55:1;;;7555:74;;7543:2;7528:18;28793:221:0;7510:125:1;28323:404:0;;;;;;;;;;-1:-1:-1;28323:404:0;;;;;:::i;:::-;;:::i;:::-;;59609:29;;;;;;;;;;;;;;;55746:153;;;;;;;;;;;;;:::i;59790:58::-;;;;;;;;;;;;;;;39801:113;;;;;;;;;;-1:-1:-1;39889:10:0;:17;39801:113;;47255:28;;;;;;;;;;;;;;;;62054:404;;;;;;;;;;-1:-1:-1;62054:404:0;;;;;:::i;:::-;;:::i;51490:37::-;;;;;;;;;;;;;;;;;;23923:18:1;23911:31;;;23893:50;;23881:2;23866:18;51490:37:0;23848:101:1;48831:2307:0;;;:::i;29683:305::-;;;;;;;;;;-1:-1:-1;29683:305:0;;;;;:::i;:::-;;:::i;51687:40::-;;;;;;;;;;;;;;;39469:256;;;;;;;;;;-1:-1:-1;39469:256:0;;;;;:::i;:::-;;:::i;52185:48::-;;;;;;;;;;-1:-1:-1;52185:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;61785:161;;;;;;;;;;-1:-1:-1;61785:161:0;;;;;:::i;:::-;;:::i;51972:44::-;;;;;;;;;;;;;;;30059:151;;;;;;;;;;-1:-1:-1;30059:151:0;;;;;:::i;:::-;;:::i;59721:29::-;;;;;;;;;;;;;;;59496:30;;;;;;;;;;;;;;;;58190:849;;;;;;;;;;-1:-1:-1;58190:849:0;;;;;:::i;:::-;;:::i;39991:233::-;;;;;;;;;;-1:-1:-1;39991:233:0;;;;;:::i;:::-;;:::i;57391:705::-;;;;;;;;;;-1:-1:-1;57391:705:0;;;;;:::i;:::-;;:::i;61518:148::-;;;;;;;;;;;;;:::i;27020:239::-;;;;;;;;;;-1:-1:-1;27020:239:0;;;;;:::i;:::-;;:::i;59404:42::-;;;;;;;;;;-1:-1:-1;59404:42:0;;;;;:::i;:::-;;:::i;47566:45::-;;;;;;;;;;;;;;;47323:40;;;;;;;;;;;;;;;51567;;;;;;;;;;;;;;;26750:208;;;;;;;;;;-1:-1:-1;26750:208:0;;;;;:::i;:::-;;:::i;47810:40::-;;;;;;;;;;;;;;;47919:50;;;;;;;;;;-1:-1:-1;47919:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;59342:20;;;;;;;;;;-1:-1:-1;59342:20:0;;;;-1:-1:-1;;;;;59342:20:0;;;61235:183;;;;;;;;;;-1:-1:-1;61235:183:0;;;;;:::i;:::-;;:::i;27495:104::-;;;;;;;;;;;;;:::i;29086:295::-;;;;;;;;;;-1:-1:-1;29086:295:0;;;;;:::i;:::-;;:::i;51881:46::-;;;;;;;;;;;;;;;51780:37;;;;;;;;;;;;;;;30281:285;;;;;;;;;;-1:-1:-1;30281:285:0;;;;;:::i;:::-;;:::i;52086:43::-;;;;;;;;;;-1:-1:-1;52086:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;47405;;;;;;;;;;;;;;;47490:26;;;;;;;;;;;;;;;;56008:1224;;;;;;:::i;:::-;;:::i;27670:360::-;;;;;;;;;;-1:-1:-1;27670:360:0;;;;;:::i;:::-;;:::i;62533:480::-;;;;;;;;;;-1:-1:-1;62533:480:0;;;;;:::i;:::-;;:::i;45566:35::-;;;;;;;;;;-1:-1:-1;45566:35:0;;;;-1:-1:-1;;;;;45566:35:0;;;52295:47;;;;;;;;;;-1:-1:-1;52295:47:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;52295:47:0;;;53969:1702;;;;;;;;;;;;;:::i;:::-;;;;23346:25:1;;;23402:2;23387:18;;23380:34;;;;23319:18;53969:1702:0;23301:119:1;47688:42:0;;;;;;;;;;;;;;;45821:384;;;;;;;;;;-1:-1:-1;45821:384:0;;;;;:::i;:::-;;:::i;52404:75::-;;;;;;;;;;-1:-1:-1;52404:75:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;51405:36;;;;;;;;;;;;;;;39148:237;39250:4;-1:-1:-1;;;;;;39274:50:0;;39289:35;39274:50;;:103;;;39341:36;39365:11;39341:23;:36::i;:::-;39267:110;;39148:237;;;;:::o;27326:100::-;27380:13;27413:5;27406:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27326:100;:::o;28793:221::-;28869:7;32122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32122:16:0;28889:73;;;;-1:-1:-1;;;28889:73:0;;18343:2:1;28889:73:0;;;18325:21:1;18382:2;18362:18;;;18355:30;18421:34;18401:18;;;18394:62;-1:-1:-1;;;18472:18:1;;;18465:42;18524:19;;28889:73:0;;;;;;;;;-1:-1:-1;28982:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28982:24:0;;28793:221::o;28323:404::-;28404:13;28420:23;28435:7;28420:14;:23::i;:::-;28404:39;;28468:5;-1:-1:-1;;;;;28462:11:0;:2;-1:-1:-1;;;;;28462:11:0;;;28454:57;;;;-1:-1:-1;;;28454:57:0;;20614:2:1;28454:57:0;;;20596:21:1;20653:2;20633:18;;;20626:30;20692:34;20672:18;;;20665:62;20763:3;20743:18;;;20736:31;20784:19;;28454:57:0;20586:223:1;28454:57:0;21740:10;-1:-1:-1;;;;;28532:21:0;;;;:69;;-1:-1:-1;;;;;;29573:25:0;;29549:4;29573:25;;;:18;:25;;;;;;;;21740:10;29573:35;;;;;;;;;;28557:44;28524:161;;;;-1:-1:-1;;;28524:161:0;;16390:2:1;28524:161:0;;;16372:21:1;16429:2;16409:18;;;16402:30;16468:34;16448:18;;;16441:62;16539:26;16519:18;;;16512:54;16583:19;;28524:161:0;16362:246:1;28524:161:0;28698:21;28707:2;28711:7;28698:8;:21::i;:::-;28323:404;;;:::o;55746:153::-;55799:7;55822:13;55839:15;:13;:15::i;:::-;55819:35;-1:-1:-1;55872:19:0;;-1:-1:-1;55819:35:0;55872:11;:19;:::i;:::-;55865:26;;;55746:153;:::o;62054:404::-;62127:10;62149:4;62127:27;62119:59;;;;-1:-1:-1;;;62119:59:0;;16042:2:1;62119:59:0;;;16024:21:1;16081:2;16061:18;;;16054:30;16120:21;16100:18;;;16093:49;16159:18;;62119:59:0;16014:169:1;62119:59:0;62215:16;;;62229:1;62215:16;;;;;;;;62191:21;;62215:16;;;;;;;;;;-1:-1:-1;62215:16:0;62191:40;;62252:15;-1:-1:-1;;;;;62252:20:0;;:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;62242:4;62247:1;62242:7;;;;;;-1:-1:-1;;;62242:7:0;;;;;;;;;;;;;;:32;-1:-1:-1;;;;;62242:32:0;;;-1:-1:-1;;;;;62242:32:0;;;;;62295:4;62285;62290:1;62285:7;;;;;;-1:-1:-1;;;62285:7:0;;;;;;;;;-1:-1:-1;;;;;62285:14:0;;;:7;;;;;;;;;:14;62312:138;;;;;:15;:66;;;;;;62400:7;;62312:138;;62419:1;;62422:4;;62428;;62434:15;;62312:138;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62054:404;;:::o;48831:2307::-;48957:15;48938;:34;;48930:56;;;;-1:-1:-1;;;48930:56:0;;22195:2:1;48930:56:0;;;22177:21:1;22234:1;22214:18;;;22207:29;22272:11;22252:18;;;22245:39;22301:18;;48930:56:0;22167:158:1;48930:56:0;49122:10;49106:27;;;;:15;:27;;;;;;:45;;49136:15;;49106:45;:::i;:::-;49090:12;:61;;49068:119;;;;-1:-1:-1;;;49068:119:0;;13170:2:1;49068:119:0;;;13152:21:1;13209:1;13189:18;;;13182:29;13247:10;13227:18;;;13220:38;13275:18;;49068:119:0;13142:157:1;49068:119:0;49283:1;49267:13;;:17;49259:42;;;;-1:-1:-1;;;49259:42:0;;13506:2:1;49259:42:0;;;13488:21:1;13545:2;13525:18;;;13518:30;13584:14;13564:18;;;13557:42;13616:18;;49259:42:0;13478:162:1;49259:42:0;49400:11;;49387:9;:24;;49379:50;;;;-1:-1:-1;;;49379:50:0;;14943:2:1;49379:50:0;;;14925:21:1;14982:2;14962:18;;;14955:30;15021:15;15001:18;;;14994:43;15054:18;;49379:50:0;14915:163:1;49379:50:0;49516:10;49500:27;;;;:15;:27;;;;;49530:12;49500:42;;49665:11;;49760:20;:42;;49665:11;;;;49760:42;;49665:11;;49760:42;:::i;:::-;;;;-1:-1:-1;;49852:13:0;:15;;;:13;:15;;;:::i;:::-;;;;;;50130:17;50113:13;;50089:21;:37;;;;:::i;:::-;50088:59;;;;:::i;:::-;:64;;:99;;-1:-1:-1;50169:13:0;;:18;50088:99;50070:657;;;50299:13;;50295:227;;50352:1;50338:11;:15;50295:227;;;50486:20;50471:11;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;50295:227:0;50584:8;;50605:20;;;50584:42;;-1:-1:-1;;;50584:42:0;;;;;22813:25:1;-1:-1:-1;;;;;50584:8:0;;;;:20;;22786:18:1;;50584:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;50714:1:0;50691:20;:24;-1:-1:-1;;50070:657:0;50796:15;50826:13;;50814:9;:25;;;;:::i;:::-;50850:8;;:34;;-1:-1:-1;;;50850:34:0;;50864:10;50850:34;;;8733:74:1;8823:18;;;8816:34;;;50796:43:0;;-1:-1:-1;;;;;;50850:8:0;;:13;;8706:18:1;;50850:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50966:18;50954:9;:30;50950:123;;;51009:10;51001:60;51030:30;51042:18;51030:9;:30;:::i;:::-;51001:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50950:123;51118:11;;51090:40;;51097:10;;51090:40;;;;51109:7;23346:25:1;;23402:2;23387:18;;23380:34;23334:2;23319:18;;23301:119;51090:40:0;;;;;;;;48831:2307;;:::o;29683:305::-;29844:41;21740:10;29877:7;29844:18;:41::i;:::-;29836:103;;;;-1:-1:-1;;;29836:103:0;;21016:2:1;29836:103:0;;;20998:21:1;21055:2;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21165:19;21145:18;;;21138:47;21202:19;;29836:103:0;20988:239:1;29836:103:0;29952:28;29962:4;29968:2;29972:7;29952:9;:28::i;39469:256::-;39566:7;39602:23;39619:5;39602:16;:23::i;:::-;39594:5;:31;39586:87;;;;-1:-1:-1;;;39586:87:0;;11643:2:1;39586:87:0;;;11625:21:1;11682:2;11662:18;;;11655:30;11721:34;11701:18;;;11694:62;11792:13;11772:18;;;11765:41;11823:19;;39586:87:0;11615:233:1;39586:87:0;-1:-1:-1;;;;;;39691:19:0;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;39469:256;;;;;:::o;61785:161::-;61865:10;61887:4;61865:27;61857:50;;;;-1:-1:-1;;;61857:50:0;;18756:2:1;61857:50:0;;;18738:21:1;18795:2;18775:18;;;18768:30;18834:12;18814:18;;;18807:40;18864:18;;61857:50:0;18728:160:1;61857:50:0;61918:20;61924:3;61929:8;61918:5;:20::i;:::-;61785:161;;:::o;30059:151::-;30163:39;30180:4;30186:2;30190:7;30163:39;;;;;;;;;;;;:16;:39::i;58190:849::-;58329:13;58346:15;:13;:15::i;:::-;58326:35;;;58389:5;58380;:14;;58372:44;;;;-1:-1:-1;;;58372:44:0;;17636:2:1;58372:44:0;;;17618:21:1;17675:2;17655:18;;;17648:30;17714:19;17694:18;;;17687:47;17751:18;;58372:44:0;17608:167:1;58372:44:0;58557:1;58526:19;;;:12;:19;;;;;;-1:-1:-1;;;;;58526:19:0;:33;58522:200;;58671:19;;;;:12;:19;;;;;;-1:-1:-1;;;;;58671:19:0;58657:10;:33;58649:61;;;;-1:-1:-1;;;58649:61:0;;15285:2:1;58649:61:0;;;15267:21:1;15324:2;15304:18;;;15297:30;15363:17;15343:18;;;15336:45;15398:18;;58649:61:0;15257:165:1;58649:61:0;58760:8;;:32;;-1:-1:-1;;;58760:32:0;;58774:10;58760:32;;;8733:74:1;8823:18;;;8816:34;;;-1:-1:-1;;;;;58760:8:0;;;;:13;;8706:18:1;;58760:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;58886:1:0;58863:20;;;:13;:20;;;;;;:24;;-1:-1:-1;58859:99:0;;58904:8;;;58925:20;;;:13;:20;;;;;;;;58904:42;;-1:-1:-1;;;58904:42:0;;-1:-1:-1;;;;;58904:8:0;;;;:20;;:42;;;;22813:25:1;;;22801:2;22786:18;;22768:76;58904:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58859:99;59010:20;;;;:13;:20;;;;;;;;;;58975:56;;23346:25:1;;;23387:18;;;23380:34;58991:10:0;;58975:56;;23319:18:1;58975:56:0;23301:119:1;39991:233:0;40066:7;40102:30;39889:10;:17;39801:113;;40102:30;40094:5;:38;40086:95;;;;-1:-1:-1;;;40086:95:0;;21782:2:1;40086:95:0;;;21764:21:1;21821:2;21801:18;;;21794:30;21860:34;21840:18;;;21833:62;21931:14;21911:18;;;21904:42;21963:19;;40086:95:0;21754:234:1;40086:95:0;40199:10;40210:5;40199:17;;;;;;-1:-1:-1;;;40199:17:0;;;;;;;;;;;;;;;;;40192:24;;39991:233;;;:::o;57391:705::-;57546:19;;;;:12;:19;;;;;;-1:-1:-1;;;;;57546:19:0;57532:10;:33;;57524:69;;;;-1:-1:-1;;;57524:69:0;;20262:2:1;57524:69:0;;;20244:21:1;20301:2;20281:18;;;20274:30;20340:25;20320:18;;;20313:53;20383:18;;57524:69:0;20234:173:1;57524:69:0;57652:17;57672:27;;;:20;:27;;;;;;;;57700:10;57672:39;;;;;;;;57794:13;57786:45;;;;-1:-1:-1;;;57786:45:0;;21434:2:1;57786:45:0;;;21416:21:1;21473:2;21453:18;;;21446:30;21512:21;21492:18;;;21485:49;21551:18;;57786:45:0;21406:169:1;57786:45:0;57935:1;57893:27;;;:20;:27;;;;;;;;57921:10;57893:39;;;;;;;;:43;;;57987:39;57921:10;;57987:39;;;;;58016:9;;57987:39;57935:1;57987:39;58016:9;57921:10;57987:39;;;;;;;;;;;;;;;;;;;;-1:-1:-1;58044:44:0;;;23346:25:1;;;23402:2;23387:18;;23380:34;;;58059:10:0;;58044:44;;23319:18:1;58044:44:0;23301:119:1;61518:148:0;61581:5;;-1:-1:-1;;;;;61581:5:0;61567:10;:19;61559:41;;;;-1:-1:-1;;;61559:41:0;;22532:2:1;61559:41:0;;;22514:21:1;22571:1;22551:18;;;22544:29;-1:-1:-1;;;22589:18:1;;;22582:39;22638:18;;61559:41:0;22504:158:1;61559:41:0;61611:5;:18;;-1:-1:-1;;;;;;61611:18:0;;;61645:13;;;;61627:1;;61645:13;61518:148::o;27020:239::-;27092:7;27128:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27128:16:0;27163:19;27155:73;;;;-1:-1:-1;;;27155:73:0;;17226:2:1;27155:73:0;;;17208:21:1;17265:2;17245:18;;;17238:30;17304:34;17284:18;;;17277:62;17375:11;17355:18;;;17348:39;17404:19;;27155:73:0;17198:231:1;59404:42:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26750:208::-;26822:7;-1:-1:-1;;;;;26850:19:0;;26842:74;;;;-1:-1:-1;;;26842:74:0;;16815:2:1;26842:74:0;;;16797:21:1;16854:2;16834:18;;;16827:30;16893:34;16873:18;;;16866:62;16964:12;16944:18;;;16937:40;16994:19;;26842:74:0;16787:232:1;26842:74:0;-1:-1:-1;;;;;;26934:16:0;;;;;:9;:16;;;;;;;26750:208::o;61235:183::-;61323:5;;-1:-1:-1;;;;;61323:5:0;61309:10;:19;61301:41;;;;-1:-1:-1;;;61301:41:0;;22532:2:1;61301:41:0;;;22514:21:1;22571:1;22551:18;;;22544:29;-1:-1:-1;;;22589:18:1;;;22582:39;22638:18;;61301:41:0;22504:158:1;61301:41:0;61353:19;:9;61365:7;;61353:19;:::i;:::-;;61388:22;61402:7;;61388:22;;;;;;;:::i;:::-;;;;;;;;61235:183;;:::o;27495:104::-;27551:13;27584:7;27577:14;;;;;:::i;29086:295::-;-1:-1:-1;;;;;29189:24:0;;21740:10;29189:24;;29181:62;;;;-1:-1:-1;;;29181:62:0;;14252:2:1;29181:62:0;;;14234:21:1;14291:2;14271:18;;;14264:30;14330:27;14310:18;;;14303:55;14375:18;;29181:62:0;14224:175:1;29181:62:0;21740:10;29256:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29256:42:0;;;;;;;;;;:53;;-1:-1:-1;;29256:53:0;;;;;;;:42;-1:-1:-1;;;;;29325:48:0;;29364:8;29325:48;;;;9026:14:1;9019:22;9001:41;;8989:2;8974:18;;8956:92;29325:48:0;;;;;;;;29086:295;;:::o;30281:285::-;30413:41;21740:10;30446:7;30413:18;:41::i;:::-;30405:103;;;;-1:-1:-1;;;30405:103:0;;21016:2:1;30405:103:0;;;20998:21:1;21055:2;21035:18;;;21028:30;21094:34;21074:18;;;21067:62;21165:19;21145:18;;;21138:47;21202:19;;30405:103:0;20988:239:1;30405:103:0;30519:39;30533:4;30539:2;30543:7;30552:5;30519:13;:39::i;:::-;30281:285;;;;:::o;56008:1224::-;56062:15;56079:13;56096:15;:13;:15::i;:::-;56061:50;;;;56198:5;56188:7;:15;56180:42;;;;-1:-1:-1;;;56180:42:0;;10958:2:1;56180:42:0;;;10940:21:1;10997:2;10977:18;;;10970:30;11036:16;11016:18;;;11009:44;11070:18;;56180:42:0;10930:164:1;56180:42:0;56313:22;56305:30;;:5;:30;;;56297:52;;;;-1:-1:-1;;;56297:52:0;;14606:2:1;56297:52:0;;;14588:21:1;14645:1;14625:18;;;14618:29;14683:11;14663:18;;;14656:39;14712:18;;56297:52:0;14578:158:1;56297:52:0;56360:13;56376:15;;;;:7;:15;:::i;:::-;56543:14;56560:27;;;:20;:27;;;;;;;;56588:10;56560:39;;;;;;;;56360:31;;-1:-1:-1;56543:14:0;56560:51;;56602:9;;56560:51;:::i;:::-;56724:20;;;;:13;:20;;;;;;56543:68;;-1:-1:-1;56724:43:0;;;56747:20;56724:43;;;:::i;:::-;56714:6;:53;;56692:113;;;;-1:-1:-1;;;56692:113:0;;12831:2:1;56692:113:0;;;12813:21:1;12870:2;12850:18;;;12843:30;12909:12;12889:18;;;12882:40;12939:18;;56692:113:0;12803:160:1;56692:113:0;56854:15;;;;:8;:15;;;;;:20;;56873:1;;56854:15;:20;;56873:1;;56854:20;:::i;:::-;;;;-1:-1:-1;;56923:20:0;;;;:13;:20;;;;;;;;:29;;;57000:12;:19;;;;;:32;;-1:-1:-1;;;;;;57000:32:0;57022:10;57000:32;;;;;;57111:20;:27;;;;;:39;;;;;;;;:48;;;57208:15;;;:8;:15;;;;;;;57177:47;;23627:25:1;;;23668:18;;;23661:34;;;23711:18;;;23704:34;57177:47:0;;23615:2:1;23600:18;57177:47:0;;;;;;;56008:1224;;;;;:::o;27670:360::-;32098:4;32122:16;;;:7;:16;;;;;;27743:13;;-1:-1:-1;;;;;32122:16:0;27769:76;;;;-1:-1:-1;;;27769:76:0;;19505:2:1;27769:76:0;;;19487:21:1;19544:2;19524:18;;;19517:30;19583:34;19563:18;;;19556:62;19654:17;19634:18;;;19627:45;19689:19;;27769:76:0;19477:237:1;27769:76:0;27858:21;27882:10;:8;:10::i;:::-;27858:34;;27934:1;27916:7;27910:21;:25;:112;;;;;;;;;;;;;;;;;27975:7;27984:18;:7;:16;:18::i;:::-;27958:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27910:112;27903:119;27670:360;-1:-1:-1;;;27670:360:0:o;62533:480::-;62636:10;62618:14;62626:5;62618:7;:14::i;:::-;-1:-1:-1;;;;;62618:28:0;;62610:53;;;;-1:-1:-1;;;62610:53:0;;19921:2:1;62610:53:0;;;19903:21:1;19960:2;19940:18;;;19933:30;19999:14;19979:18;;;19972:42;20031:18;;62610:53:0;19893:162:1;62610:53:0;62734:24;62767:15;;;:8;:15;;;;;62734:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62802:11;:18;62824:1;62802:23;62794:49;;;;-1:-1:-1;;;62794:49:0;;11301:2:1;62794:49:0;;;11283:21:1;11340:2;11320:18;;;11313:30;11379:15;11359:18;;;11352:43;11412:18;;62794:49:0;11273:163:1;62794:49:0;62856:15;;;;:8;:15;;;;;:25;;62874:7;;62856:25;:::i;:::-;-1:-1:-1;62936:15:0;;62892:60;;;;;62918:10;62892:60;;;7903:34:1;-1:-1:-1;;;;;62930:4:0;7973:15:1;;7953:18;;;7946:43;8005:18;;;7998:34;;;;62899:4:0;62892:25;;;;;;7815:18:1;;62892:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;62978:10;-1:-1:-1;;;;;62970:35:0;;62990:5;62997:7;;62970:35;;;;;;;;:::i;:::-;;;;;;;;62533:480;;;;:::o;53969:1702::-;54015:7;54024;54044:22;54081:15;54111:13;54179:1449;54205:13;54186:32;;:15;:32;;;54179:1449;;54309:19;54405:35;54424:16;54405;:35;:::i;:::-;54386:55;;:15;:55;:::i;:::-;54348:94;;:13;:94;:::i;:::-;54309:133;;54563:15;54548:12;:30;;;54544:76;;;54599:5;;;54544:76;54950:40;54968:22;54950:15;:40;:::i;:::-;:44;;54993:1;54950:44;:::i;:::-;54940:54;;;-1:-1:-1;55176:15:0;55142:31;55157:16;55142:12;:31;:::i;:::-;:49;;;55138:421;;;55294:5;;;55138:421;55521:22;55436:61;55521:22;55436:15;:61;:::i;:::-;:107;;;;:::i;:::-;55407:136;;;;55599:17;;;;:::i;:::-;;;;54179:1449;;;;55648:7;;-1:-1:-1;55657:5:0;-1:-1:-1;;53969:1702:0;;:::o;45821:384::-;46012:20;;46058:28;;;;;-1:-1:-1;;;;;7573:55:1;;;46058:28:0;;;7555:74:1;45946:4:0;;46012:20;;;46050:49;;;;46012:20;;46058:21;;7528:18:1;;46058:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;46050:49:0;;46046:93;;;46123:4;46116:11;;;;;46046:93;-1:-1:-1;;;;;29573:25:0;;;29549:4;29573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;46158:39;46151:46;45821:384;-1:-1:-1;;;;45821:384:0:o;26394:292::-;26496:4;-1:-1:-1;;;;;;26520:40:0;;26535:25;26520:40;;:105;;-1:-1:-1;;;;;;;26577:48:0;;26592:33;26577:48;26520:105;:158;;;-1:-1:-1;25008:25:0;-1:-1:-1;;;;;;24993:40:0;;;26642:36;24884:157;35917:174;35992:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35992:29:0;-1:-1:-1;;;;;35992:29:0;;;;;;;;:24;;36046:23;35992:24;36046:14;:23::i;:::-;-1:-1:-1;;;;;36037:46:0;;;;;;;;;;;35917:174;;:::o;32327:355::-;32420:4;32122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32122:16:0;32437:73;;;;-1:-1:-1;;;32437:73:0;;15629:2:1;32437:73:0;;;15611:21:1;15668:2;15648:18;;;15641:30;15707:34;15687:18;;;15680:62;-1:-1:-1;;;15758:18:1;;;15751:42;15810:19;;32437:73:0;15601:234:1;32437:73:0;32521:13;32537:23;32552:7;32537:14;:23::i;:::-;32521:39;;32590:5;-1:-1:-1;;;;;32579:16:0;:7;-1:-1:-1;;;;;32579:16:0;;:51;;;;32623:7;-1:-1:-1;;;;;32599:31:0;:20;32611:7;32599:11;:20::i;:::-;-1:-1:-1;;;;;32599:31:0;;32579:51;:94;;;-1:-1:-1;;;;;;29573:25:0;;;29549:4;29573:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32634:39;29452:164;35255:544;35380:4;-1:-1:-1;;;;;35353:31:0;:23;35368:7;35353:14;:23::i;:::-;-1:-1:-1;;;;;35353:31:0;;35345:85;;;;-1:-1:-1;;;35345:85:0;;19095:2:1;35345:85:0;;;19077:21:1;19134:2;19114:18;;;19107:30;19173:34;19153:18;;;19146:62;19244:11;19224:18;;;19217:39;19273:19;;35345:85:0;19067:231:1;35345:85:0;-1:-1:-1;;;;;35449:16:0;;35441:65;;;;-1:-1:-1;;;35441:65:0;;13847:2:1;35441:65:0;;;13829:21:1;13886:2;13866:18;;;13859:30;13925:34;13905:18;;;13898:62;13996:6;13976:18;;;13969:34;14020:19;;35441:65:0;13819:226:1;35441:65:0;35519:39;35540:4;35546:2;35550:7;35519:20;:39::i;:::-;35623:29;35640:1;35644:7;35623:8;:29::i;:::-;-1:-1:-1;;;;;35665:15:0;;;;;;:9;:15;;;;;:20;;35684:1;;35665:15;:20;;35684:1;;35665:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35696:13:0;;;;;;:9;:13;;;;;:18;;35713:1;;35696:13;:18;;35713:1;;35696:18;:::i;:::-;;;;-1:-1:-1;;35725:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35725:21:0;-1:-1:-1;;;;;35725:21:0;;;;;;;;;35764:27;;35725:16;;35764:27;;;;;;;35255:544;;;:::o;33947:382::-;-1:-1:-1;;;;;34027:16:0;;34019:61;;;;-1:-1:-1;;;34019:61:0;;17982:2:1;34019:61:0;;;17964:21:1;;;18001:18;;;17994:30;18060:34;18040:18;;;18033:62;18112:18;;34019:61:0;17954:182:1;34019:61:0;32098:4;32122:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32122:16:0;:30;34091:58;;;;-1:-1:-1;;;34091:58:0;;12474:2:1;34091:58:0;;;12456:21:1;12513:2;12493:18;;;12486:30;12552;12532:18;;;12525:58;12600:18;;34091:58:0;12446:178:1;34091:58:0;34162:45;34191:1;34195:2;34199:7;34162:20;:45::i;:::-;-1:-1:-1;;;;;34220:13:0;;;;;;:9;:13;;;;;:18;;34237:1;;34220:13;:18;;34237:1;;34220:18;:::i;:::-;;;;-1:-1:-1;;34249:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34249:21:0;-1:-1:-1;;;;;34249:21:0;;;;;;;;34288:33;;34249:16;;;34288:33;;34249:16;;34288:33;33947:382;;:::o;31448:272::-;31562:28;31572:4;31578:2;31582:7;31562:9;:28::i;:::-;31609:48;31632:4;31638:2;31642:7;31651:5;31609:22;:48::i;:::-;31601:111;;;;-1:-1:-1;;;31601:111:0;;12055:2:1;31601:111:0;;;12037:21:1;12094:2;12074:18;;;12067:30;12133:34;12113:18;;;12106:62;12204:20;12184:18;;;12177:48;12242:19;;31601:111:0;12027:240:1;61020:110:0;61080:13;61113:9;61106:16;;;;;:::i;22323:723::-;22379:13;22600:10;22596:53;;-1:-1:-1;22627:10:0;;;;;;;;;;;;;;;;;;;22596:53;22674:5;22659:12;22715:78;22722:9;;22715:78;;22748:8;;;;:::i;:::-;;-1:-1:-1;22771:10:0;;-1:-1:-1;22779:2:0;22771:10;;:::i;:::-;;;22715:78;;;22803:19;22835:6;22825:17;;;;;;-1:-1:-1;;;22825:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;22825:17:0;;22803:39;;22853:154;22860:10;;22853:154;;22887:11;22897:1;22887:11;;:::i;:::-;;-1:-1:-1;22956:10:0;22964:2;22956:5;:10;:::i;:::-;22943:24;;:2;:24;:::i;:::-;22930:39;;22913:6;22920;22913:14;;;;;;-1:-1:-1;;;22913:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;22984:11:0;22993:2;22984:11;;:::i;:::-;;;22853:154;;40837:555;-1:-1:-1;;;;;41009:18:0;;41005:187;;41044:40;41076:7;42219:10;:17;;42192:24;;;;:15;:24;;;;;:44;;;42247:24;;;;;;;;;;;;42115:164;41044:40;41005:187;;;41114:2;-1:-1:-1;;;;;41106:10:0;:4;-1:-1:-1;;;;;41106:10:0;;41102:90;;41133:47;41166:4;41172:7;41133:32;:47::i;:::-;-1:-1:-1;;;;;41206:16:0;;41202:183;;41239:45;41276:7;41239:36;:45::i;:::-;41202:183;;;41312:4;-1:-1:-1;;;;;41306:10:0;:2;-1:-1:-1;;;;;41306:10:0;;41302:83;;41333:40;41361:2;41365:7;41333:27;:40::i;36656:843::-;36777:4;-1:-1:-1;;;;;36803:13:0;;14136:20;14175:8;36799:693;;36839:72;;-1:-1:-1;;;36839:72:0;;-1:-1:-1;;;;;36839:36:0;;;;;:72;;21740:10;;36890:4;;36896:7;;36905:5;;36839:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36839:72:0;;;;;;;;-1:-1:-1;;36839:72:0;;;;;;;;;;;;:::i;:::-;;;36835:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37085:13:0;;37081:341;;37128:60;;-1:-1:-1;;;37128:60:0;;12055:2:1;37128:60:0;;;12037:21:1;12094:2;12074:18;;;12067:30;12133:34;12113:18;;;12106:62;12204:20;12184:18;;;12177:48;12242:19;;37128:60:0;12027:240:1;37081:341:0;37372:6;37366:13;37357:6;37353:2;37349:15;37342:38;36835:602;-1:-1:-1;;;;;;36962:55:0;-1:-1:-1;;;36962:55:0;;-1:-1:-1;36955:62:0;;36799:693;-1:-1:-1;37476:4:0;36656:843;;;;;;:::o;42906:988::-;43172:22;43222:1;43197:22;43214:4;43197:16;:22::i;:::-;:26;;;;:::i;:::-;43234:18;43255:26;;;:17;:26;;;;;;43172:51;;-1:-1:-1;43388:28:0;;;43384:328;;-1:-1:-1;;;;;43455:18:0;;43433:19;43455:18;;;:12;:18;;;;;;;;:34;;;;;;;;;43506:30;;;;;;:44;;;43623:30;;:17;:30;;;;;:43;;;43384:328;-1:-1:-1;43808:26:0;;;;:17;:26;;;;;;;;43801:33;;;-1:-1:-1;;;;;43852:18:0;;;;;:12;:18;;;;;:34;;;;;;;43845:41;42906:988::o;44189:1079::-;44467:10;:17;44442:22;;44467:21;;44487:1;;44467:21;:::i;:::-;44499:18;44520:24;;;:15;:24;;;;;;44893:10;:26;;44442:46;;-1:-1:-1;44520:24:0;;44442:46;;44893:26;;;;-1:-1:-1;;;44893:26:0;;;;;;;;;;;;;;;;;44871:48;;44957:11;44932:10;44943;44932:22;;;;;;-1:-1:-1;;;44932:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;45037:28;;;:15;:28;;;;;;;:41;;;45209:24;;;;;45202:31;45244:10;:16;;;;;-1:-1:-1;;;45244:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;44189:1079;;;;:::o;41693:221::-;41778:14;41795:20;41812:2;41795:16;:20::i;:::-;-1:-1:-1;;;;;41826:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;41871:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;41693:221:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:376:1;;;130:3;123:4;115:6;111:17;107:27;97:2;;155:8;145;138:26;97:2;-1:-1:-1;185:20:1;;228:18;217:30;;214:2;;;267:8;257;250:26;214:2;311:4;303:6;299:17;287:29;;363:3;356:4;347:6;339;335:19;331:30;328:39;325:2;;;380:1;377;370:12;325:2;87:303;;;;;:::o;395:257::-;;507:2;495:9;486:7;482:23;478:32;475:2;;;528:6;520;513:22;475:2;572:9;559:23;591:31;616:5;591:31;:::i;657:261::-;;780:2;768:9;759:7;755:23;751:32;748:2;;;801:6;793;786:22;748:2;838:9;832:16;857:31;882:5;857:31;:::i;923:398::-;;;1052:2;1040:9;1031:7;1027:23;1023:32;1020:2;;;1073:6;1065;1058:22;1020:2;1117:9;1104:23;1136:31;1161:5;1136:31;:::i;:::-;1186:5;-1:-1:-1;1243:2:1;1228:18;;1215:32;1256:33;1215:32;1256:33;:::i;:::-;1308:7;1298:17;;;1010:311;;;;;:::o;1326:466::-;;;;1472:2;1460:9;1451:7;1447:23;1443:32;1440:2;;;1493:6;1485;1478:22;1440:2;1537:9;1524:23;1556:31;1581:5;1556:31;:::i;:::-;1606:5;-1:-1:-1;1663:2:1;1648:18;;1635:32;1676:33;1635:32;1676:33;:::i;:::-;1430:362;;1728:7;;-1:-1:-1;;;1782:2:1;1767:18;;;;1754:32;;1430:362::o;1797:1311::-;;;;;1969:3;1957:9;1948:7;1944:23;1940:33;1937:2;;;1991:6;1983;1976:22;1937:2;2035:9;2022:23;2054:31;2079:5;2054:31;:::i;:::-;2104:5;-1:-1:-1;2161:2:1;2146:18;;2133:32;2174:33;2133:32;2174:33;:::i;:::-;2226:7;-1:-1:-1;2280:2:1;2265:18;;2252:32;;-1:-1:-1;2335:2:1;2320:18;;2307:32;2358:18;2388:14;;;2385:2;;;2420:6;2412;2405:22;2385:2;2463:6;2452:9;2448:22;2438:32;;2508:7;2501:4;2497:2;2493:13;2489:27;2479:2;;2535:6;2527;2520:22;2479:2;2576;2563:16;2598:2;2594;2591:10;2588:2;;;2604:18;;:::i;:::-;2679:2;2673:9;2647:2;2733:13;;-1:-1:-1;;2729:22:1;;;2753:2;2725:31;2721:40;2709:53;;;2777:18;;;2797:22;;;2774:46;2771:2;;;2823:18;;:::i;:::-;2863:10;2859:2;2852:22;2898:2;2890:6;2883:18;2938:7;2933:2;2928;2924;2920:11;2916:20;2913:33;2910:2;;;2964:6;2956;2949:22;2910:2;3025;3020;3016;3012:11;3007:2;2999:6;2995:15;2982:46;3048:15;;;3065:2;3044:24;3037:40;;;;1927:1181;;;;-1:-1:-1;1927:1181:1;;-1:-1:-1;;;;1927:1181:1:o;3113:392::-;;;3239:2;3227:9;3218:7;3214:23;3210:32;3207:2;;;3260:6;3252;3245:22;3207:2;3304:9;3291:23;3323:31;3348:5;3323:31;:::i;:::-;3373:5;-1:-1:-1;3430:2:1;3415:18;;3402:32;3443:30;3402:32;3443:30;:::i;3510:325::-;;;3639:2;3627:9;3618:7;3614:23;3610:32;3607:2;;;3660:6;3652;3645:22;3607:2;3704:9;3691:23;3723:31;3748:5;3723:31;:::i;:::-;3773:5;3825:2;3810:18;;;;3797:32;;-1:-1:-1;;;3597:238:1:o;3840:255::-;;3960:2;3948:9;3939:7;3935:23;3931:32;3928:2;;;3981:6;3973;3966:22;3928:2;4018:9;4012:16;4037:28;4059:5;4037:28;:::i;4100:255::-;;4211:2;4199:9;4190:7;4186:23;4182:32;4179:2;;;4232:6;4224;4217:22;4179:2;4276:9;4263:23;4295:30;4319:5;4295:30;:::i;4360:259::-;;4482:2;4470:9;4461:7;4457:23;4453:32;4450:2;;;4503:6;4495;4488:22;4450:2;4540:9;4534:16;4559:30;4583:5;4559:30;:::i;4624:431::-;;;4756:2;4744:9;4735:7;4731:23;4727:32;4724:2;;;4777:6;4769;4762:22;4724:2;4822:9;4809:23;4855:18;4847:6;4844:30;4841:2;;;4892:6;4884;4877:22;4841:2;4936:59;4987:7;4978:6;4967:9;4963:22;4936:59;:::i;:::-;5014:8;;4910:85;;-1:-1:-1;4714:341:1;-1:-1:-1;;;;4714:341:1:o;5060:190::-;;5172:2;5160:9;5151:7;5147:23;5143:32;5140:2;;;5193:6;5185;5178:22;5140:2;-1:-1:-1;5221:23:1;;5130:120;-1:-1:-1;5130:120:1:o;5255:325::-;;;5384:2;5372:9;5363:7;5359:23;5355:32;5352:2;;;5405:6;5397;5390:22;5352:2;5446:9;5433:23;5423:33;;5506:2;5495:9;5491:18;5478:32;5519:31;5544:5;5519:31;:::i;5585:499::-;;;;5734:2;5722:9;5713:7;5709:23;5705:32;5702:2;;;5755:6;5747;5740:22;5702:2;5796:9;5783:23;5773:33;;5857:2;5846:9;5842:18;5829:32;5884:18;5876:6;5873:30;5870:2;;;5921:6;5913;5906:22;5870:2;5965:59;6016:7;6007:6;5996:9;5992:22;5965:59;:::i;:::-;5692:392;;6043:8;;-1:-1:-1;5939:85:1;;-1:-1:-1;;;;5692:392:1:o;6089:304::-;;6200:2;6188:9;6179:7;6175:23;6171:32;6168:2;;;6221:6;6213;6206:22;6168:2;6265:9;6252:23;6315:18;6308:5;6304:30;6297:5;6294:41;6284:2;;6354:6;6346;6339:22;6398:257;;6477:5;6471:12;6504:6;6499:3;6492:19;6520:63;6576:6;6569:4;6564:3;6560:14;6553:4;6546:5;6542:16;6520:63;:::i;:::-;6637:2;6616:15;-1:-1:-1;;6612:29:1;6603:39;;;;6644:4;6599:50;;6447:208;-1:-1:-1;;6447:208:1:o;6660:269::-;;6749:6;6744:3;6737:19;6801:6;6794:5;6787:4;6782:3;6778:14;6765:43;6853:3;6846:4;6837:6;6832:3;6828:16;6824:27;6817:40;6918:4;6911:2;6907:7;6902:2;6894:6;6890:15;6886:29;6881:3;6877:39;6873:50;6866:57;;6727:202;;;;;:::o;6934:470::-;;7151:6;7145:13;7167:53;7213:6;7208:3;7201:4;7193:6;7189:17;7167:53;:::i;:::-;7283:13;;7242:16;;;;7305:57;7283:13;7242:16;7339:4;7327:17;;7305:57;:::i;:::-;7378:20;;7121:283;-1:-1:-1;;;;7121:283:1:o;8043:511::-;;-1:-1:-1;;;;;8347:2:1;8339:6;8335:15;8324:9;8317:34;8399:2;8391:6;8387:15;8382:2;8371:9;8367:18;8360:43;;8439:6;8434:2;8423:9;8419:18;8412:34;8482:3;8477:2;8466:9;8462:18;8455:31;8503:45;8543:3;8532:9;8528:19;8520:6;8503:45;:::i;:::-;8495:53;8246:308;-1:-1:-1;;;;;;8246:308:1:o;9318:957::-;;9600:3;9589:9;9585:19;9631:6;9620:9;9613:25;9657:2;9695:3;9690:2;9679:9;9675:18;9668:31;9719:6;9754;9748:13;9785:6;9777;9770:22;9823:3;9812:9;9808:19;9801:26;;9862:2;9854:6;9850:15;9836:29;;9883:4;9896:218;9910:6;9907:1;9904:13;9896:218;;;9975:13;;-1:-1:-1;;;;;9971:62:1;9959:75;;10089:15;;;;10054:12;;;;9932:1;9925:9;9896:218;;;-1:-1:-1;;;;;;;10170:55:1;;;;10165:2;10150:18;;10143:83;-1:-1:-1;;;10257:2:1;10242:18;10235:34;10131:3;9561:714;-1:-1:-1;;9561:714:1:o;10280:247::-;;10439:2;10428:9;10421:21;10459:62;10517:2;10506:9;10502:18;10494:6;10486;10459:62;:::i;10532:219::-;;10681:2;10670:9;10663:21;10701:44;10741:2;10730:9;10726:18;10718:6;10701:44;:::i;22849:318::-;;23036:6;23025:9;23018:25;23079:2;23074;23063:9;23059:18;23052:30;23099:62;23157:2;23146:9;23142:18;23134:6;23126;23099:62;:::i;:::-;23091:70;23008:159;-1:-1:-1;;;;;23008:159:1:o;23954:128::-;;24025:1;24021:6;24018:1;24015:13;24012:2;;;24031:18;;:::i;:::-;-1:-1:-1;24067:9:1;;24002:80::o;24087:236::-;;24154:18;24199:2;24196:1;24192:10;24229:2;24226:1;24222:10;24260:3;24256:2;24252:12;24247:3;24244:21;24241:2;;;24268:18;;:::i;24328:120::-;;24394:1;24384:2;;24399:18;;:::i;:::-;-1:-1:-1;24433:9:1;;24374:74::o;24453:270::-;;24524:18;24569:2;24566:1;24562:10;24599:2;24596:1;24592:10;24655:3;24651:2;24647:12;24642:3;24639:21;24632:3;24625:11;24618:19;24614:47;24611:2;;;24664:18;;:::i;:::-;24704:13;;24504:219;-1:-1:-1;;;;24504:219:1:o;24728:125::-;;24796:1;24793;24790:8;24787:2;;;24801:18;;:::i;:::-;-1:-1:-1;24838:9:1;;24777:76::o;24858:258::-;24930:1;24940:113;24954:6;24951:1;24948:13;24940:113;;;25030:11;;;25024:18;25011:11;;;25004:39;24976:2;24969:10;24940:113;;;25071:6;25068:1;25065:13;25062:2;;;-1:-1:-1;;25106:1:1;25088:16;;25081:27;24911:205::o;25121:136::-;;25188:5;25178:2;;25197:18;;:::i;:::-;-1:-1:-1;;;25233:18:1;;25168:89::o;25262:437::-;25341:1;25337:12;;;;25384;;;25405:2;;25459:4;25451:6;25447:17;25437:27;;25405:2;25512;25504:6;25501:14;25481:18;25478:38;25475:2;;;-1:-1:-1;;;25546:1:1;25539:88;25650:4;25647:1;25640:15;25678:4;25675:1;25668:15;25475:2;;25317:382;;;:::o;25704:135::-;;-1:-1:-1;;25764:17:1;;25761:2;;;25784:18;;:::i;:::-;-1:-1:-1;25831:1:1;25820:13;;25751:88::o;25844:209::-;;25910:18;25963:2;25956:5;25952:14;25990:2;25981:7;25978:15;25975:2;;;25996:18;;:::i;:::-;26045:1;26032:15;;25890:163;-1:-1:-1;;;25890:163:1:o;26058:112::-;;26116:1;26106:2;;26121:18;;:::i;:::-;-1:-1:-1;26155:9:1;;26096:74::o;26175:184::-;-1:-1:-1;;;26224:1:1;26217:88;26324:4;26321:1;26314:15;26348:4;26345:1;26338:15;26364:184;-1:-1:-1;;;26413:1:1;26406:88;26513:4;26510:1;26503:15;26537:4;26534:1;26527:15;26553:184;-1:-1:-1;;;26602:1:1;26595:88;26702:4;26699:1;26692:15;26726:4;26723:1;26716:15;26742:154;-1:-1:-1;;;;;26821:5:1;26817:54;26810:5;26807:65;26797:2;;26886:1;26883;26876:12;26797:2;26787:109;:::o;26901:118::-;26987:5;26980:13;26973:21;26966:5;26963:32;26953:2;;27009:1;27006;26999:12;27024:177;-1:-1:-1;;;;;;27102:5:1;27098:78;27091:5;27088:89;27078:2;;27191:1;27188;27181:12

Swarm Source

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