ETH Price: $3,710.98 (+4.67%)

Token

Rogue Society Bots (RSB)
 

Overview

Max Total Supply

15,777 RSB

Holders

6,880

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 RSB
0x440BD23858e50918895171F24D4e142E5A1Abe39
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Rogue Society Bot is a collection of 15,777 unique Rogue Bot NFTs— unique digital collectibles living on the Ethereum blockchain. Your Rogue Bot doubles as your Rogue Society membership card, and grants access to members-only benefits and experiences.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RogueSocietyBots

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-31
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

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

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

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

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

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

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

contract RogueSocietyBots is ERC721Pausable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    uint256 private constant _maxTokens = 15777;
    uint256 private constant _maxMint = 25;
    uint256 private constant _maxPresaleMint = 2;
    uint256 public constant _price = 90000000000000000; // 0.09 ETH

    mapping (address => bool) private _whitelist;
    mapping (address => uint256) private _presaleMints;
    bool private _presaleActive = false;
    bool private _saleActive = false;
    
    string public _prefixURI;

    constructor() ERC721("Rogue Society Bots", "RSB") {
        _pause();
    }

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

    function setBaseURI(string memory _uri) public onlyOwner {
        _prefixURI = _uri;
    }

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

    function isWhitelisted(address addr) public view returns (bool) {
        return _whitelist[addr];
    }

    function addToWhitelist(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            _whitelist[addrs[i]] = true;
            _presaleMints[addrs[i]] = 0;
        }
    }

    function presaleMintItems(uint256 amount) public payable {
        require(amount <= _maxMint);
        require(amount <= _maxPresaleMint);
        require(isWhitelisted(msg.sender));
        require(msg.value >= amount * _price);
        require(_presaleMints[msg.sender] + amount <= _maxPresaleMint);
        require(_presaleActive);

        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxTokens);

        for (uint256 i = 0; i < amount; i++) {
            _presaleMints[msg.sender] += 1;
            _mintItem(msg.sender);
        }
    }

    function mintItems(uint256 amount) public payable {
        require(amount <= _maxMint);
        require(_saleActive);

        uint256 totalMinted = _tokenIds.current();
        require(totalMinted + amount <= _maxTokens);

        require(msg.value >= amount * _price);

        for (uint256 i = 0; i < amount; i++) {
            _mintItem(msg.sender);
        }
    }

    function _mintItem(address to) internal returns (uint256) {
        _tokenIds.increment();

        uint256 id = _tokenIds.current();
        _safeMint(to, id);

        return id;
    }

    function togglePreSale() public onlyOwner {
        _presaleActive = !_presaleActive;
    }

    function toggleSale() public onlyOwner {
        _saleActive = !_saleActive;
    }

    function toggleTransferPause() public onlyOwner {
        paused() ? _unpause() : _pause();
    }

    function reserve(uint256 quantity) public onlyOwner {
        for(uint i = _tokenIds.current(); i < quantity; i++) {
            if (i < _maxTokens) {
                _tokenIds.increment();
                _safeMint(msg.sender, i + 1);
            }
        }
    }

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

    // Allows minting(transfer from 0 address), but not transferring while paused() except from owner
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        if (!(from == address(0)) && !(from == owner())) {
            require(!paused(), "ERC721Pausable: token transfer while paused");
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"_prefixURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintItems","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"presaleMintItems","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"togglePreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"toggleTransferPause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280601281526020017f526f67756520536f636965747920426f747300000000000000000000000000008152506040518060400160405280600381526020017f52534200000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620002d6565b508060019080519060200190620000e5929190620002d6565b5050506000600660006101000a81548160ff02191690831515021790555062000123620001176200013960201b60201c565b6200014160201b60201c565b620001336200020760201b60201c565b620004d0565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000217620002bf60201b60201c565b156200025a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025190620003db565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002a66200013960201b60201c565b604051620002b59190620003be565b60405180910390a1565b6000600660009054906101000a900460ff16905090565b828054620002e49062000442565b90600052602060002090601f01602090048101928262000308576000855562000354565b82601f106200032357805160ff191683800117855562000354565b8280016001018555821562000354579182015b828111156200035357825182559160200191906001019062000336565b5b50905062000363919062000367565b5090565b5b808211156200038257600081600090555060010162000368565b5090565b62000391816200040e565b82525050565b6000620003a6601083620003fd565b9150620003b382620004a7565b602082019050919050565b6000602082019050620003d5600083018462000386565b92915050565b60006020820190508181036000830152620003f68162000397565b9050919050565b600082825260208201905092915050565b60006200041b8262000422565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200045b57607f821691505b6020821081141562000472576200047162000478565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b613e3480620004e06000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105ff578063ca3cb5221461063c578063e985e9c514610653578063f2fde38b14610690576101cd565b806395d89b411461056b5780639752a01714610596578063a22cb465146105ad578063b88d4fde146105d6576101cd565b80637f649783116100d15780637f649783146104c3578063819b25ba146104ec5780638da5cb5b1461051557806391860f7814610540576101cd565b806370a0823114610458578063715018a6146104955780637d8966e4146104ac576101cd565b806323b872dd1161016f5780635367de6a1161013e5780635367de6a146103ab57806355f804b3146103c75780635c975abb146103f05780636352211e1461041b576101cd565b806323b872dd146103125780633af32abf1461033b5780633ccfd60b1461037857806342842e0e14610382576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630b4b9878146102a057806318160ddd146102bc578063235b6ea1146102e7576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612cd6565b6106b9565b6040516102069190613186565b60405180910390f35b34801561021b57600080fd5b5061022461079b565b60405161023191906131a1565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d69565b61082d565b60405161026e919061311f565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612c59565b6108b2565b005b6102ba60048036038101906102b59190612d69565b6109ca565b005b3480156102c857600080fd5b506102d1610b35565b6040516102de9190613423565b60405180910390f35b3480156102f357600080fd5b506102fc610b46565b6040516103099190613423565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612b53565b610b52565b005b34801561034757600080fd5b50610362600480360381019061035d9190612aee565b610bb2565b60405161036f9190613186565b60405180910390f35b610380610c08565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612b53565b610cc4565b005b6103c560048036038101906103c09190612d69565b610ce4565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612d28565b610d80565b005b3480156103fc57600080fd5b50610405610e16565b6040516104129190613186565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d9190612d69565b610e2d565b60405161044f919061311f565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612aee565b610edf565b60405161048c9190613423565b60405180910390f35b3480156104a157600080fd5b506104aa610f97565b005b3480156104b857600080fd5b506104c161101f565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612c95565b6110c7565b005b3480156104f857600080fd5b50610513600480360381019061050e9190612d69565b611283565b005b34801561052157600080fd5b5061052a611358565b604051610537919061311f565b60405180910390f35b34801561054c57600080fd5b50610555611382565b60405161056291906131a1565b60405180910390f35b34801561057757600080fd5b50610580611410565b60405161058d91906131a1565b60405180910390f35b3480156105a257600080fd5b506105ab6114a2565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612c1d565b611542565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612ba2565b6116c3565b005b34801561060b57600080fd5b5061062660048036038101906106219190612d69565b611725565b60405161063391906131a1565b60405180910390f35b34801561064857600080fd5b506106516117cc565b005b34801561065f57600080fd5b5061067a60048036038101906106759190612b17565b611874565b6040516106879190613186565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190612aee565b611908565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610794575061079382611a00565b5b9050919050565b6060600080546107aa906136ff565b80601f01602080910402602001604051908101604052809291908181526020018280546107d6906136ff565b80156108235780601f106107f857610100808354040283529160200191610823565b820191906000526020600020905b81548152906001019060200180831161080657829003601f168201915b5050505050905090565b600061083882611a6a565b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613363565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108bd82610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610925906133e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094d611ad6565b73ffffffffffffffffffffffffffffffffffffffff16148061097c575061097b81610976611ad6565b611874565b5b6109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b2906132e3565b60405180910390fd5b6109c58383611ade565b505050565b60198111156109d857600080fd5b60028111156109e657600080fd5b6109ef33610bb2565b6109f857600080fd5b67013fbe85edc9000081610a0c91906135bb565b341015610a1857600080fd5b600281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a659190613534565b1115610a7057600080fd5b600a60009054906101000a900460ff16610a8957600080fd5b6000610a956007611b97565b9050613da18282610aa69190613534565b1115610ab157600080fd5b60005b82811015610b30576001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b0c9190613534565b92505081905550610b1c33611ba5565b508080610b2890613762565b915050610ab4565b505050565b6000610b416007611b97565b905090565b67013fbe85edc9000081565b610b63610b5d611ad6565b82611bd2565b610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990613403565b60405180910390fd5b610bad838383611cb0565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c10611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610c2e611358565b73ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613383565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cc257600080fd5b565b610cdf838383604051806020016040528060008152506116c3565b505050565b6019811115610cf257600080fd5b600a60019054906101000a900460ff16610d0b57600080fd5b6000610d176007611b97565b9050613da18282610d289190613534565b1115610d3357600080fd5b67013fbe85edc9000082610d4791906135bb565b341015610d5357600080fd5b60005b82811015610d7b57610d6733611ba5565b508080610d7390613762565b915050610d56565b505050565b610d88611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610da6611358565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613383565b60405180910390fd5b80600b9080519060200190610e1292919061287c565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90613323565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613303565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f9f611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610fbd611358565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613383565b60405180910390fd5b61101d6000611f0c565b565b611027611ad6565b73ffffffffffffffffffffffffffffffffffffffff16611045611358565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613383565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6110cf611ad6565b73ffffffffffffffffffffffffffffffffffffffff166110ed611358565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90613383565b60405180910390fd5b60005b815181101561127f5760016008600084848151811061118e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060096000848481518110611226577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061127790613762565b915050611146565b5050565b61128b611ad6565b73ffffffffffffffffffffffffffffffffffffffff166112a9611358565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613383565b60405180910390fd5b600061130b6007611b97565b90505b8181101561135457613da18110156113415761132a6007611fd2565b6113403360018361133b9190613534565b611fe8565b5b808061134c90613762565b91505061130e565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b805461138f906136ff565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb906136ff565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b505050505081565b60606001805461141f906136ff565b80601f016020809104026020016040519081016040528092919081815260200182805461144b906136ff565b80156114985780601f1061146d57610100808354040283529160200191611498565b820191906000526020600020905b81548152906001019060200180831161147b57829003601f168201915b5050505050905090565b6114aa611ad6565b73ffffffffffffffffffffffffffffffffffffffff166114c8611358565b73ffffffffffffffffffffffffffffffffffffffff161461151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151590613383565b60405180910390fd5b611526610e16565b61153757611532612006565b611540565b61153f6120a9565b5b565b61154a611ad6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613283565b60405180910390fd5b80600560006115c5611ad6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611672611ad6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b79190613186565b60405180910390a35050565b6116d46116ce611ad6565b83611bd2565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90613403565b60405180910390fd5b61171f8484848461214b565b50505050565b606061173082611a6a565b61176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906133c3565b60405180910390fd5b60006117796121a7565b9050600081511161179957604051806020016040528060008152506117c4565b806117a384612239565b6040516020016117b49291906130fb565b6040516020818303038152906040525b915050919050565b6117d4611ad6565b73ffffffffffffffffffffffffffffffffffffffff166117f2611358565b73ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90613383565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611910611ad6565b73ffffffffffffffffffffffffffffffffffffffff1661192e611358565b73ffffffffffffffffffffffffffffffffffffffff1614611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90613383565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613223565b60405180910390fd5b6119fd81611f0c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5183610e2d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611bb16007611fd2565b6000611bbd6007611b97565b9050611bc98382611fe8565b80915050919050565b6000611bdd82611a6a565b611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906132a3565b60405180910390fd5b6000611c2783610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9657508373ffffffffffffffffffffffffffffffffffffffff16611c7e8461082d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ca75750611ca68185611874565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd082610e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d906133a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613263565b60405180910390fd5b611da18383836123e6565b611dac600082611ade565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dfc9190613615565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190613534565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b6120028282604051806020016040528060008152506124a9565b5050565b61200e610e16565b1561204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906132c3565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612092611ad6565b60405161209f919061311f565b60405180910390a1565b6120b1610e16565b6120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906131e3565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612134611ad6565b604051612141919061311f565b60405180910390a1565b612156848484611cb0565b61216284848484612504565b6121a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219890613203565b60405180910390fd5b50505050565b6060600b80546121b6906136ff565b80601f01602080910402602001604051908101604052809291908181526020018280546121e2906136ff565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b5050505050905090565b60606000821415612281576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e1565b600082905060005b600082146122b357808061229c90613762565b915050600a826122ac919061358a565b9150612289565b60008167ffffffffffffffff8111156122f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123275781602001600182028036833780820191505090505b5090505b600085146123da576001826123409190613615565b9150600a8561234f91906137ab565b603061235b9190613534565b60f81b818381518110612397577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123d3919061358a565b945061232b565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124565750612426611358565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156124a457612463610e16565b156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a906131c3565b60405180910390fd5b5b505050565b6124b3838361269b565b6124c06000848484612504565b6124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613203565b60405180910390fd5b505050565b60006125258473ffffffffffffffffffffffffffffffffffffffff16612869565b1561268e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261254e611ad6565b8786866040518563ffffffff1660e01b8152600401612570949392919061313a565b602060405180830381600087803b15801561258a57600080fd5b505af19250505080156125bb57506040513d601f19601f820116820180604052508101906125b89190612cff565b60015b61263e573d80600081146125eb576040519150601f19603f3d011682016040523d82523d6000602084013e6125f0565b606091505b50600081511415612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90613203565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612693565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290613343565b60405180910390fd5b61271481611a6a565b15612754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274b90613243565b60405180910390fd5b612760600083836123e6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b09190613534565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612888906136ff565b90600052602060002090601f0160209004810192826128aa57600085556128f1565b82601f106128c357805160ff19168380011785556128f1565b828001600101855582156128f1579182015b828111156128f05782518255916020019190600101906128d5565b5b5090506128fe9190612902565b5090565b5b8082111561291b576000816000905550600101612903565b5090565b600061293261292d84613463565b61343e565b9050808382526020820190508285602086028201111561295157600080fd5b60005b8581101561298157816129678882612a07565b845260208401935060208301925050600181019050612954565b5050509392505050565b600061299e6129998461348f565b61343e565b9050828152602081018484840111156129b657600080fd5b6129c18482856136bd565b509392505050565b60006129dc6129d7846134c0565b61343e565b9050828152602081018484840111156129f457600080fd5b6129ff8482856136bd565b509392505050565b600081359050612a1681613da2565b92915050565b600082601f830112612a2d57600080fd5b8135612a3d84826020860161291f565b91505092915050565b600081359050612a5581613db9565b92915050565b600081359050612a6a81613dd0565b92915050565b600081519050612a7f81613dd0565b92915050565b600082601f830112612a9657600080fd5b8135612aa684826020860161298b565b91505092915050565b600082601f830112612ac057600080fd5b8135612ad08482602086016129c9565b91505092915050565b600081359050612ae881613de7565b92915050565b600060208284031215612b0057600080fd5b6000612b0e84828501612a07565b91505092915050565b60008060408385031215612b2a57600080fd5b6000612b3885828601612a07565b9250506020612b4985828601612a07565b9150509250929050565b600080600060608486031215612b6857600080fd5b6000612b7686828701612a07565b9350506020612b8786828701612a07565b9250506040612b9886828701612ad9565b9150509250925092565b60008060008060808587031215612bb857600080fd5b6000612bc687828801612a07565b9450506020612bd787828801612a07565b9350506040612be887828801612ad9565b925050606085013567ffffffffffffffff811115612c0557600080fd5b612c1187828801612a85565b91505092959194509250565b60008060408385031215612c3057600080fd5b6000612c3e85828601612a07565b9250506020612c4f85828601612a46565b9150509250929050565b60008060408385031215612c6c57600080fd5b6000612c7a85828601612a07565b9250506020612c8b85828601612ad9565b9150509250929050565b600060208284031215612ca757600080fd5b600082013567ffffffffffffffff811115612cc157600080fd5b612ccd84828501612a1c565b91505092915050565b600060208284031215612ce857600080fd5b6000612cf684828501612a5b565b91505092915050565b600060208284031215612d1157600080fd5b6000612d1f84828501612a70565b91505092915050565b600060208284031215612d3a57600080fd5b600082013567ffffffffffffffff811115612d5457600080fd5b612d6084828501612aaf565b91505092915050565b600060208284031215612d7b57600080fd5b6000612d8984828501612ad9565b91505092915050565b612d9b81613649565b82525050565b612daa8161365b565b82525050565b6000612dbb826134f1565b612dc58185613507565b9350612dd58185602086016136cc565b612dde81613898565b840191505092915050565b6000612df4826134fc565b612dfe8185613518565b9350612e0e8185602086016136cc565b612e1781613898565b840191505092915050565b6000612e2d826134fc565b612e378185613529565b9350612e478185602086016136cc565b80840191505092915050565b6000612e60602b83613518565b9150612e6b826138a9565b604082019050919050565b6000612e83601483613518565b9150612e8e826138f8565b602082019050919050565b6000612ea6603283613518565b9150612eb182613921565b604082019050919050565b6000612ec9602683613518565b9150612ed482613970565b604082019050919050565b6000612eec601c83613518565b9150612ef7826139bf565b602082019050919050565b6000612f0f602483613518565b9150612f1a826139e8565b604082019050919050565b6000612f32601983613518565b9150612f3d82613a37565b602082019050919050565b6000612f55602c83613518565b9150612f6082613a60565b604082019050919050565b6000612f78601083613518565b9150612f8382613aaf565b602082019050919050565b6000612f9b603883613518565b9150612fa682613ad8565b604082019050919050565b6000612fbe602a83613518565b9150612fc982613b27565b604082019050919050565b6000612fe1602983613518565b9150612fec82613b76565b604082019050919050565b6000613004602083613518565b915061300f82613bc5565b602082019050919050565b6000613027602c83613518565b915061303282613bee565b604082019050919050565b600061304a602083613518565b915061305582613c3d565b602082019050919050565b600061306d602983613518565b915061307882613c66565b604082019050919050565b6000613090602f83613518565b915061309b82613cb5565b604082019050919050565b60006130b3602183613518565b91506130be82613d04565b604082019050919050565b60006130d6603183613518565b91506130e182613d53565b604082019050919050565b6130f5816136b3565b82525050565b60006131078285612e22565b91506131138284612e22565b91508190509392505050565b60006020820190506131346000830184612d92565b92915050565b600060808201905061314f6000830187612d92565b61315c6020830186612d92565b61316960408301856130ec565b818103606083015261317b8184612db0565b905095945050505050565b600060208201905061319b6000830184612da1565b92915050565b600060208201905081810360008301526131bb8184612de9565b905092915050565b600060208201905081810360008301526131dc81612e53565b9050919050565b600060208201905081810360008301526131fc81612e76565b9050919050565b6000602082019050818103600083015261321c81612e99565b9050919050565b6000602082019050818103600083015261323c81612ebc565b9050919050565b6000602082019050818103600083015261325c81612edf565b9050919050565b6000602082019050818103600083015261327c81612f02565b9050919050565b6000602082019050818103600083015261329c81612f25565b9050919050565b600060208201905081810360008301526132bc81612f48565b9050919050565b600060208201905081810360008301526132dc81612f6b565b9050919050565b600060208201905081810360008301526132fc81612f8e565b9050919050565b6000602082019050818103600083015261331c81612fb1565b9050919050565b6000602082019050818103600083015261333c81612fd4565b9050919050565b6000602082019050818103600083015261335c81612ff7565b9050919050565b6000602082019050818103600083015261337c8161301a565b9050919050565b6000602082019050818103600083015261339c8161303d565b9050919050565b600060208201905081810360008301526133bc81613060565b9050919050565b600060208201905081810360008301526133dc81613083565b9050919050565b600060208201905081810360008301526133fc816130a6565b9050919050565b6000602082019050818103600083015261341c816130c9565b9050919050565b600060208201905061343860008301846130ec565b92915050565b6000613448613459565b90506134548282613731565b919050565b6000604051905090565b600067ffffffffffffffff82111561347e5761347d613869565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156134aa576134a9613869565b5b6134b382613898565b9050602081019050919050565b600067ffffffffffffffff8211156134db576134da613869565b5b6134e482613898565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061353f826136b3565b915061354a836136b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561357f5761357e6137dc565b5b828201905092915050565b6000613595826136b3565b91506135a0836136b3565b9250826135b0576135af61380b565b5b828204905092915050565b60006135c6826136b3565b91506135d1836136b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561360a576136096137dc565b5b828202905092915050565b6000613620826136b3565b915061362b836136b3565b92508282101561363e5761363d6137dc565b5b828203905092915050565b600061365482613693565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136ea5780820151818401526020810190506136cf565b838111156136f9576000848401525b50505050565b6000600282049050600182168061371757607f821691505b6020821081141561372b5761372a61383a565b5b50919050565b61373a82613898565b810181811067ffffffffffffffff8211171561375957613758613869565b5b80604052505050565b600061376d826136b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137a05761379f6137dc565b5b600182019050919050565b60006137b6826136b3565b91506137c1836136b3565b9250826137d1576137d061380b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613dab81613649565b8114613db657600080fd5b50565b613dc28161365b565b8114613dcd57600080fd5b50565b613dd981613667565b8114613de457600080fd5b50565b613df0816136b3565b8114613dfb57600080fd5b5056fea2646970667358221220c116f14b06fd3201e2860569e9f9ddfe80291ca7a6ae9fbd628ab992bd02199664736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105ff578063ca3cb5221461063c578063e985e9c514610653578063f2fde38b14610690576101cd565b806395d89b411461056b5780639752a01714610596578063a22cb465146105ad578063b88d4fde146105d6576101cd565b80637f649783116100d15780637f649783146104c3578063819b25ba146104ec5780638da5cb5b1461051557806391860f7814610540576101cd565b806370a0823114610458578063715018a6146104955780637d8966e4146104ac576101cd565b806323b872dd1161016f5780635367de6a1161013e5780635367de6a146103ab57806355f804b3146103c75780635c975abb146103f05780636352211e1461041b576101cd565b806323b872dd146103125780633af32abf1461033b5780633ccfd60b1461037857806342842e0e14610382576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630b4b9878146102a057806318160ddd146102bc578063235b6ea1146102e7576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612cd6565b6106b9565b6040516102069190613186565b60405180910390f35b34801561021b57600080fd5b5061022461079b565b60405161023191906131a1565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d69565b61082d565b60405161026e919061311f565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612c59565b6108b2565b005b6102ba60048036038101906102b59190612d69565b6109ca565b005b3480156102c857600080fd5b506102d1610b35565b6040516102de9190613423565b60405180910390f35b3480156102f357600080fd5b506102fc610b46565b6040516103099190613423565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612b53565b610b52565b005b34801561034757600080fd5b50610362600480360381019061035d9190612aee565b610bb2565b60405161036f9190613186565b60405180910390f35b610380610c08565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612b53565b610cc4565b005b6103c560048036038101906103c09190612d69565b610ce4565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612d28565b610d80565b005b3480156103fc57600080fd5b50610405610e16565b6040516104129190613186565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d9190612d69565b610e2d565b60405161044f919061311f565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612aee565b610edf565b60405161048c9190613423565b60405180910390f35b3480156104a157600080fd5b506104aa610f97565b005b3480156104b857600080fd5b506104c161101f565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612c95565b6110c7565b005b3480156104f857600080fd5b50610513600480360381019061050e9190612d69565b611283565b005b34801561052157600080fd5b5061052a611358565b604051610537919061311f565b60405180910390f35b34801561054c57600080fd5b50610555611382565b60405161056291906131a1565b60405180910390f35b34801561057757600080fd5b50610580611410565b60405161058d91906131a1565b60405180910390f35b3480156105a257600080fd5b506105ab6114a2565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612c1d565b611542565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612ba2565b6116c3565b005b34801561060b57600080fd5b5061062660048036038101906106219190612d69565b611725565b60405161063391906131a1565b60405180910390f35b34801561064857600080fd5b506106516117cc565b005b34801561065f57600080fd5b5061067a60048036038101906106759190612b17565b611874565b6040516106879190613186565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190612aee565b611908565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610794575061079382611a00565b5b9050919050565b6060600080546107aa906136ff565b80601f01602080910402602001604051908101604052809291908181526020018280546107d6906136ff565b80156108235780601f106107f857610100808354040283529160200191610823565b820191906000526020600020905b81548152906001019060200180831161080657829003601f168201915b5050505050905090565b600061083882611a6a565b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613363565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108bd82610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561092e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610925906133e3565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094d611ad6565b73ffffffffffffffffffffffffffffffffffffffff16148061097c575061097b81610976611ad6565b611874565b5b6109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b2906132e3565b60405180910390fd5b6109c58383611ade565b505050565b60198111156109d857600080fd5b60028111156109e657600080fd5b6109ef33610bb2565b6109f857600080fd5b67013fbe85edc9000081610a0c91906135bb565b341015610a1857600080fd5b600281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a659190613534565b1115610a7057600080fd5b600a60009054906101000a900460ff16610a8957600080fd5b6000610a956007611b97565b9050613da18282610aa69190613534565b1115610ab157600080fd5b60005b82811015610b30576001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b0c9190613534565b92505081905550610b1c33611ba5565b508080610b2890613762565b915050610ab4565b505050565b6000610b416007611b97565b905090565b67013fbe85edc9000081565b610b63610b5d611ad6565b82611bd2565b610ba2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9990613403565b60405180910390fd5b610bad838383611cb0565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c10611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610c2e611358565b73ffffffffffffffffffffffffffffffffffffffff1614610c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7b90613383565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cc257600080fd5b565b610cdf838383604051806020016040528060008152506116c3565b505050565b6019811115610cf257600080fd5b600a60019054906101000a900460ff16610d0b57600080fd5b6000610d176007611b97565b9050613da18282610d289190613534565b1115610d3357600080fd5b67013fbe85edc9000082610d4791906135bb565b341015610d5357600080fd5b60005b82811015610d7b57610d6733611ba5565b508080610d7390613762565b915050610d56565b505050565b610d88611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610da6611358565b73ffffffffffffffffffffffffffffffffffffffff1614610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613383565b60405180910390fd5b80600b9080519060200190610e1292919061287c565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecd90613323565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f50576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4790613303565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f9f611ad6565b73ffffffffffffffffffffffffffffffffffffffff16610fbd611358565b73ffffffffffffffffffffffffffffffffffffffff1614611013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100a90613383565b60405180910390fd5b61101d6000611f0c565b565b611027611ad6565b73ffffffffffffffffffffffffffffffffffffffff16611045611358565b73ffffffffffffffffffffffffffffffffffffffff161461109b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109290613383565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6110cf611ad6565b73ffffffffffffffffffffffffffffffffffffffff166110ed611358565b73ffffffffffffffffffffffffffffffffffffffff1614611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90613383565b60405180910390fd5b60005b815181101561127f5760016008600084848151811061118e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550600060096000848481518110611226577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061127790613762565b915050611146565b5050565b61128b611ad6565b73ffffffffffffffffffffffffffffffffffffffff166112a9611358565b73ffffffffffffffffffffffffffffffffffffffff16146112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690613383565b60405180910390fd5b600061130b6007611b97565b90505b8181101561135457613da18110156113415761132a6007611fd2565b6113403360018361133b9190613534565b611fe8565b5b808061134c90613762565b91505061130e565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b805461138f906136ff565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb906136ff565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b505050505081565b60606001805461141f906136ff565b80601f016020809104026020016040519081016040528092919081815260200182805461144b906136ff565b80156114985780601f1061146d57610100808354040283529160200191611498565b820191906000526020600020905b81548152906001019060200180831161147b57829003601f168201915b5050505050905090565b6114aa611ad6565b73ffffffffffffffffffffffffffffffffffffffff166114c8611358565b73ffffffffffffffffffffffffffffffffffffffff161461151e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151590613383565b60405180910390fd5b611526610e16565b61153757611532612006565b611540565b61153f6120a9565b5b565b61154a611ad6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115af90613283565b60405180910390fd5b80600560006115c5611ad6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611672611ad6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116b79190613186565b60405180910390a35050565b6116d46116ce611ad6565b83611bd2565b611713576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170a90613403565b60405180910390fd5b61171f8484848461214b565b50505050565b606061173082611a6a565b61176f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611766906133c3565b60405180910390fd5b60006117796121a7565b9050600081511161179957604051806020016040528060008152506117c4565b806117a384612239565b6040516020016117b49291906130fb565b6040516020818303038152906040525b915050919050565b6117d4611ad6565b73ffffffffffffffffffffffffffffffffffffffff166117f2611358565b73ffffffffffffffffffffffffffffffffffffffff1614611848576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161183f90613383565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611910611ad6565b73ffffffffffffffffffffffffffffffffffffffff1661192e611358565b73ffffffffffffffffffffffffffffffffffffffff1614611984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197b90613383565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119eb90613223565b60405180910390fd5b6119fd81611f0c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b5183610e2d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611bb16007611fd2565b6000611bbd6007611b97565b9050611bc98382611fe8565b80915050919050565b6000611bdd82611a6a565b611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c13906132a3565b60405180910390fd5b6000611c2783610e2d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c9657508373ffffffffffffffffffffffffffffffffffffffff16611c7e8461082d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611ca75750611ca68185611874565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611cd082610e2d565b73ffffffffffffffffffffffffffffffffffffffff1614611d26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1d906133a3565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8d90613263565b60405180910390fd5b611da18383836123e6565b611dac600082611ade565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dfc9190613615565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e539190613534565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b6120028282604051806020016040528060008152506124a9565b5050565b61200e610e16565b1561204e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612045906132c3565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612092611ad6565b60405161209f919061311f565b60405180910390a1565b6120b1610e16565b6120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906131e3565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612134611ad6565b604051612141919061311f565b60405180910390a1565b612156848484611cb0565b61216284848484612504565b6121a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219890613203565b60405180910390fd5b50505050565b6060600b80546121b6906136ff565b80601f01602080910402602001604051908101604052809291908181526020018280546121e2906136ff565b801561222f5780601f106122045761010080835404028352916020019161222f565b820191906000526020600020905b81548152906001019060200180831161221257829003601f168201915b5050505050905090565b60606000821415612281576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123e1565b600082905060005b600082146122b357808061229c90613762565b915050600a826122ac919061358a565b9150612289565b60008167ffffffffffffffff8111156122f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156123275781602001600182028036833780820191505090505b5090505b600085146123da576001826123409190613615565b9150600a8561234f91906137ab565b603061235b9190613534565b60f81b818381518110612397577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123d3919061358a565b945061232b565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156124565750612426611358565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b156124a457612463610e16565b156124a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249a906131c3565b60405180910390fd5b5b505050565b6124b3838361269b565b6124c06000848484612504565b6124ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f690613203565b60405180910390fd5b505050565b60006125258473ffffffffffffffffffffffffffffffffffffffff16612869565b1561268e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261254e611ad6565b8786866040518563ffffffff1660e01b8152600401612570949392919061313a565b602060405180830381600087803b15801561258a57600080fd5b505af19250505080156125bb57506040513d601f19601f820116820180604052508101906125b89190612cff565b60015b61263e573d80600081146125eb576040519150601f19603f3d011682016040523d82523d6000602084013e6125f0565b606091505b50600081511415612636576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262d90613203565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612693565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561270b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161270290613343565b60405180910390fd5b61271481611a6a565b15612754576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161274b90613243565b60405180910390fd5b612760600083836123e6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127b09190613534565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612888906136ff565b90600052602060002090601f0160209004810192826128aa57600085556128f1565b82601f106128c357805160ff19168380011785556128f1565b828001600101855582156128f1579182015b828111156128f05782518255916020019190600101906128d5565b5b5090506128fe9190612902565b5090565b5b8082111561291b576000816000905550600101612903565b5090565b600061293261292d84613463565b61343e565b9050808382526020820190508285602086028201111561295157600080fd5b60005b8581101561298157816129678882612a07565b845260208401935060208301925050600181019050612954565b5050509392505050565b600061299e6129998461348f565b61343e565b9050828152602081018484840111156129b657600080fd5b6129c18482856136bd565b509392505050565b60006129dc6129d7846134c0565b61343e565b9050828152602081018484840111156129f457600080fd5b6129ff8482856136bd565b509392505050565b600081359050612a1681613da2565b92915050565b600082601f830112612a2d57600080fd5b8135612a3d84826020860161291f565b91505092915050565b600081359050612a5581613db9565b92915050565b600081359050612a6a81613dd0565b92915050565b600081519050612a7f81613dd0565b92915050565b600082601f830112612a9657600080fd5b8135612aa684826020860161298b565b91505092915050565b600082601f830112612ac057600080fd5b8135612ad08482602086016129c9565b91505092915050565b600081359050612ae881613de7565b92915050565b600060208284031215612b0057600080fd5b6000612b0e84828501612a07565b91505092915050565b60008060408385031215612b2a57600080fd5b6000612b3885828601612a07565b9250506020612b4985828601612a07565b9150509250929050565b600080600060608486031215612b6857600080fd5b6000612b7686828701612a07565b9350506020612b8786828701612a07565b9250506040612b9886828701612ad9565b9150509250925092565b60008060008060808587031215612bb857600080fd5b6000612bc687828801612a07565b9450506020612bd787828801612a07565b9350506040612be887828801612ad9565b925050606085013567ffffffffffffffff811115612c0557600080fd5b612c1187828801612a85565b91505092959194509250565b60008060408385031215612c3057600080fd5b6000612c3e85828601612a07565b9250506020612c4f85828601612a46565b9150509250929050565b60008060408385031215612c6c57600080fd5b6000612c7a85828601612a07565b9250506020612c8b85828601612ad9565b9150509250929050565b600060208284031215612ca757600080fd5b600082013567ffffffffffffffff811115612cc157600080fd5b612ccd84828501612a1c565b91505092915050565b600060208284031215612ce857600080fd5b6000612cf684828501612a5b565b91505092915050565b600060208284031215612d1157600080fd5b6000612d1f84828501612a70565b91505092915050565b600060208284031215612d3a57600080fd5b600082013567ffffffffffffffff811115612d5457600080fd5b612d6084828501612aaf565b91505092915050565b600060208284031215612d7b57600080fd5b6000612d8984828501612ad9565b91505092915050565b612d9b81613649565b82525050565b612daa8161365b565b82525050565b6000612dbb826134f1565b612dc58185613507565b9350612dd58185602086016136cc565b612dde81613898565b840191505092915050565b6000612df4826134fc565b612dfe8185613518565b9350612e0e8185602086016136cc565b612e1781613898565b840191505092915050565b6000612e2d826134fc565b612e378185613529565b9350612e478185602086016136cc565b80840191505092915050565b6000612e60602b83613518565b9150612e6b826138a9565b604082019050919050565b6000612e83601483613518565b9150612e8e826138f8565b602082019050919050565b6000612ea6603283613518565b9150612eb182613921565b604082019050919050565b6000612ec9602683613518565b9150612ed482613970565b604082019050919050565b6000612eec601c83613518565b9150612ef7826139bf565b602082019050919050565b6000612f0f602483613518565b9150612f1a826139e8565b604082019050919050565b6000612f32601983613518565b9150612f3d82613a37565b602082019050919050565b6000612f55602c83613518565b9150612f6082613a60565b604082019050919050565b6000612f78601083613518565b9150612f8382613aaf565b602082019050919050565b6000612f9b603883613518565b9150612fa682613ad8565b604082019050919050565b6000612fbe602a83613518565b9150612fc982613b27565b604082019050919050565b6000612fe1602983613518565b9150612fec82613b76565b604082019050919050565b6000613004602083613518565b915061300f82613bc5565b602082019050919050565b6000613027602c83613518565b915061303282613bee565b604082019050919050565b600061304a602083613518565b915061305582613c3d565b602082019050919050565b600061306d602983613518565b915061307882613c66565b604082019050919050565b6000613090602f83613518565b915061309b82613cb5565b604082019050919050565b60006130b3602183613518565b91506130be82613d04565b604082019050919050565b60006130d6603183613518565b91506130e182613d53565b604082019050919050565b6130f5816136b3565b82525050565b60006131078285612e22565b91506131138284612e22565b91508190509392505050565b60006020820190506131346000830184612d92565b92915050565b600060808201905061314f6000830187612d92565b61315c6020830186612d92565b61316960408301856130ec565b818103606083015261317b8184612db0565b905095945050505050565b600060208201905061319b6000830184612da1565b92915050565b600060208201905081810360008301526131bb8184612de9565b905092915050565b600060208201905081810360008301526131dc81612e53565b9050919050565b600060208201905081810360008301526131fc81612e76565b9050919050565b6000602082019050818103600083015261321c81612e99565b9050919050565b6000602082019050818103600083015261323c81612ebc565b9050919050565b6000602082019050818103600083015261325c81612edf565b9050919050565b6000602082019050818103600083015261327c81612f02565b9050919050565b6000602082019050818103600083015261329c81612f25565b9050919050565b600060208201905081810360008301526132bc81612f48565b9050919050565b600060208201905081810360008301526132dc81612f6b565b9050919050565b600060208201905081810360008301526132fc81612f8e565b9050919050565b6000602082019050818103600083015261331c81612fb1565b9050919050565b6000602082019050818103600083015261333c81612fd4565b9050919050565b6000602082019050818103600083015261335c81612ff7565b9050919050565b6000602082019050818103600083015261337c8161301a565b9050919050565b6000602082019050818103600083015261339c8161303d565b9050919050565b600060208201905081810360008301526133bc81613060565b9050919050565b600060208201905081810360008301526133dc81613083565b9050919050565b600060208201905081810360008301526133fc816130a6565b9050919050565b6000602082019050818103600083015261341c816130c9565b9050919050565b600060208201905061343860008301846130ec565b92915050565b6000613448613459565b90506134548282613731565b919050565b6000604051905090565b600067ffffffffffffffff82111561347e5761347d613869565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156134aa576134a9613869565b5b6134b382613898565b9050602081019050919050565b600067ffffffffffffffff8211156134db576134da613869565b5b6134e482613898565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061353f826136b3565b915061354a836136b3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561357f5761357e6137dc565b5b828201905092915050565b6000613595826136b3565b91506135a0836136b3565b9250826135b0576135af61380b565b5b828204905092915050565b60006135c6826136b3565b91506135d1836136b3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561360a576136096137dc565b5b828202905092915050565b6000613620826136b3565b915061362b836136b3565b92508282101561363e5761363d6137dc565b5b828203905092915050565b600061365482613693565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156136ea5780820151818401526020810190506136cf565b838111156136f9576000848401525b50505050565b6000600282049050600182168061371757607f821691505b6020821081141561372b5761372a61383a565b5b50919050565b61373a82613898565b810181811067ffffffffffffffff8211171561375957613758613869565b5b80604052505050565b600061376d826136b3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137a05761379f6137dc565b5b600182019050919050565b60006137b6826136b3565b91506137c1836136b3565b9250826137d1576137d061380b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613dab81613649565b8114613db657600080fd5b50565b613dc28161365b565b8114613dcd57600080fd5b50565b613dd981613667565b8114613de457600080fd5b50565b613df0816136b3565b8114613dfb57600080fd5b5056fea2646970667358221220c116f14b06fd3201e2860569e9f9ddfe80291ca7a6ae9fbd628ab992bd02199664736f6c63430008040033

Deployed Bytecode Sourcemap

38200:3640:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19623:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20568:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22127:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21650:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39537:598;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39087:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38491:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23017:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39193:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41314:120;;;:::i;:::-;;23427:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40143:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38986:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32733:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20262:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19992:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37571:94;;;;;;;;;;;;;:::i;:::-;;40835:84;;;;;;;;;;;;;:::i;:::-;;39307:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41034:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36920:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38757:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20737:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40927:99;;;;;;;;;;;;;:::i;:::-;;22420:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23683:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20912:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40734:93;;;;;;;;;;;;;:::i;:::-;;22786:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37820:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19623:305;19725:4;19777:25;19762:40;;;:11;:40;;;;:105;;;;19834:33;19819:48;;;:11;:48;;;;19762:105;:158;;;;19884:36;19908:11;19884:23;:36::i;:::-;19762:158;19742:178;;19623:305;;;:::o;20568:100::-;20622:13;20655:5;20648:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20568:100;:::o;22127:221::-;22203:7;22231:16;22239:7;22231;:16::i;:::-;22223:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22316:15;:24;22332:7;22316:24;;;;;;;;;;;;;;;;;;;;;22309:31;;22127:221;;;:::o;21650:411::-;21731:13;21747:23;21762:7;21747:14;:23::i;:::-;21731:39;;21795:5;21789:11;;:2;:11;;;;21781:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;21889:5;21873:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;21898:37;21915:5;21922:12;:10;:12::i;:::-;21898:16;:37::i;:::-;21873:62;21851:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22032:21;22041:2;22045:7;22032:8;:21::i;:::-;21650:411;;;:::o;39537:598::-;38431:2;39613:6;:18;;39605:27;;;;;;38483:1;39651:6;:25;;39643:34;;;;;;39696:25;39710:10;39696:13;:25::i;:::-;39688:34;;;;;;38524:17;39754:6;:15;;;;:::i;:::-;39741:9;:28;;39733:37;;;;;;38483:1;39817:6;39789:13;:25;39803:10;39789:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:53;;39781:62;;;;;;39862:14;;;;;;;;;;;39854:23;;;;;;39890:19;39912;:9;:17;:19::i;:::-;39890:41;;38383:5;39964:6;39950:11;:20;;;;:::i;:::-;:34;;39942:43;;;;;;40003:9;39998:130;40022:6;40018:1;:10;39998:130;;;40079:1;40050:13;:25;40064:10;40050:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;40095:21;40105:10;40095:9;:21::i;:::-;;40030:3;;;;;:::i;:::-;;;;39998:130;;;;39537:598;;:::o;39087:98::-;39131:7;39158:19;:9;:17;:19::i;:::-;39151:26;;39087:98;:::o;38491:50::-;38524:17;38491:50;:::o;23017:339::-;23212:41;23231:12;:10;:12::i;:::-;23245:7;23212:18;:41::i;:::-;23204:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23320:28;23330:4;23336:2;23340:7;23320:9;:28::i;:::-;23017:339;;;:::o;39193:106::-;39251:4;39275:10;:16;39286:4;39275:16;;;;;;;;;;;;;;;;;;;;;;;;;39268:23;;39193:106;;;:::o;41314:120::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41386:10:::1;41378:24;;:47;41403:21;41378:47;;;;;;;;;;;;;;;;;;;;;;;41370:56;;;::::0;::::1;;41314:120::o:0;23427:185::-;23565:39;23582:4;23588:2;23592:7;23565:39;;;;;;;;;;;;:16;:39::i;:::-;23427:185;;;:::o;40143:382::-;38431:2;40212:6;:18;;40204:27;;;;;;40250:11;;;;;;;;;;;40242:20;;;;;;40275:19;40297;:9;:17;:19::i;:::-;40275:41;;38383:5;40349:6;40335:11;:20;;;;:::i;:::-;:34;;40327:43;;;;;;38524:17;40404:6;:15;;;;:::i;:::-;40391:9;:28;;40383:37;;;;;;40438:9;40433:85;40457:6;40453:1;:10;40433:85;;;40485:21;40495:10;40485:9;:21::i;:::-;;40465:3;;;;;:::i;:::-;;;;40433:85;;;;40143:382;;:::o;38986:93::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39067:4:::1;39054:10;:17;;;;;;;;;;;;:::i;:::-;;38986:93:::0;:::o;32733:86::-;32780:4;32804:7;;;;;;;;;;;32797:14;;32733:86;:::o;20262:239::-;20334:7;20354:13;20370:7;:16;20378:7;20370:16;;;;;;;;;;;;;;;;;;;;;20354:32;;20422:1;20405:19;;:5;:19;;;;20397:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20488:5;20481:12;;;20262:239;;;:::o;19992:208::-;20064:7;20109:1;20092:19;;:5;:19;;;;20084:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;20176:9;:16;20186:5;20176:16;;;;;;;;;;;;;;;;20169:23;;19992:208;;;:::o;37571:94::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37636:21:::1;37654:1;37636:9;:21::i;:::-;37571:94::o:0;40835:84::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40900:11:::1;;;;;;;;;;;40899:12;40885:11;;:26;;;;;;;;;;;;;;;;;;40835:84::o:0;39307:222::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39388:9:::1;39383:139;39407:5;:12;39403:1;:16;39383:139;;;39464:4;39441:10;:20;39452:5;39458:1;39452:8;;;;;;;;;;;;;;;;;;;;;;39441:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;39509:1;39483:13;:23;39497:5;39503:1;39497:8;;;;;;;;;;;;;;;;;;;;;;39483:23;;;;;;;;;;;;;;;:27;;;;39421:3;;;;;:::i;:::-;;;;39383:139;;;;39307:222:::0;:::o;41034:272::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41101:6:::1;41110:19;:9;:17;:19::i;:::-;41101:28;;41097:202;41135:8;41131:1;:12;41097:202;;;38383:5;41169:1;:14;41165:123;;;41204:21;:9;:19;:21::i;:::-;41244:28;41254:10;41270:1;41266;:5;;;;:::i;:::-;41244:9;:28::i;:::-;41165:123;41145:3;;;;;:::i;:::-;;;;41097:202;;;;41034:272:::0;:::o;36920:87::-;36966:7;36993:6;;;;;;;;;;;36986:13;;36920:87;:::o;38757:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20737:104::-;20793:13;20826:7;20819:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20737:104;:::o;40927:99::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40986:8:::1;:6;:8::i;:::-;:32;;41010:8;:6;:8::i;:::-;40986:32;;;40997:10;:8;:10::i;:::-;40986:32;40927:99::o:0;22420:295::-;22535:12;:10;:12::i;:::-;22523:24;;:8;:24;;;;22515:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;22635:8;22590:18;:32;22609:12;:10;:12::i;:::-;22590:32;;;;;;;;;;;;;;;:42;22623:8;22590:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;22688:8;22659:48;;22674:12;:10;:12::i;:::-;22659:48;;;22698:8;22659:48;;;;;;:::i;:::-;;;;;;;;22420:295;;:::o;23683:328::-;23858:41;23877:12;:10;:12::i;:::-;23891:7;23858:18;:41::i;:::-;23850:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;23964:39;23978:4;23984:2;23988:7;23997:5;23964:13;:39::i;:::-;23683:328;;;;:::o;20912:334::-;20985:13;21019:16;21027:7;21019;:16::i;:::-;21011:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;21100:21;21124:10;:8;:10::i;:::-;21100:34;;21176:1;21158:7;21152:21;:25;:86;;;;;;;;;;;;;;;;;21204:7;21213:18;:7;:16;:18::i;:::-;21187:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;21152:86;21145:93;;;20912:334;;;:::o;40734:93::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40805:14:::1;;;;;;;;;;;40804:15;40787:14;;:32;;;;;;;;;;;;;;;;;;40734:93::o:0;22786:164::-;22883:4;22907:18;:25;22926:5;22907:25;;;;;;;;;;;;;;;:35;22933:8;22907:35;;;;;;;;;;;;;;;;;;;;;;;;;22900:42;;22786:164;;;;:::o;37820:192::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37929:1:::1;37909:22;;:8;:22;;;;37901:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37985:19;37995:8;37985:9;:19::i;:::-;37820:192:::0;:::o;18232:157::-;18317:4;18356:25;18341:40;;;:11;:40;;;;18334:47;;18232:157;;;:::o;25521:127::-;25586:4;25638:1;25610:30;;:7;:16;25618:7;25610:16;;;;;;;;;;;;;;;;;;;;;:30;;;;25603:37;;25521:127;;;:::o;15335:98::-;15388:7;15415:10;15408:17;;15335:98;:::o;29503:174::-;29605:2;29578:15;:24;29594:7;29578:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;29661:7;29657:2;29623:46;;29632:23;29647:7;29632:14;:23::i;:::-;29623:46;;;;;;;;;;;;29503:174;;:::o;35417:114::-;35482:7;35509;:14;;;35502:21;;35417:114;;;:::o;40533:193::-;40582:7;40602:21;:9;:19;:21::i;:::-;40636:10;40649:19;:9;:17;:19::i;:::-;40636:32;;40679:17;40689:2;40693;40679:9;:17::i;:::-;40716:2;40709:9;;;40533:193;;;:::o;25815:348::-;25908:4;25933:16;25941:7;25933;:16::i;:::-;25925:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26009:13;26025:23;26040:7;26025:14;:23::i;:::-;26009:39;;26078:5;26067:16;;:7;:16;;;:51;;;;26111:7;26087:31;;:20;26099:7;26087:11;:20::i;:::-;:31;;;26067:51;:87;;;;26122:32;26139:5;26146:7;26122:16;:32::i;:::-;26067:87;26059:96;;;25815:348;;;;:::o;28807:578::-;28966:4;28939:31;;:23;28954:7;28939:14;:23::i;:::-;:31;;;28931:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;29049:1;29035:16;;:2;:16;;;;29027:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;29105:39;29126:4;29132:2;29136:7;29105:20;:39::i;:::-;29209:29;29226:1;29230:7;29209:8;:29::i;:::-;29270:1;29251:9;:15;29261:4;29251:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;29299:1;29282:9;:13;29292:2;29282:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29330:2;29311:7;:16;29319:7;29311:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29369:7;29365:2;29350:27;;29359:4;29350:27;;;;;;;;;;;;28807:578;;;:::o;38020:173::-;38076:16;38095:6;;;;;;;;;;;38076:25;;38121:8;38112:6;;:17;;;;;;;;;;;;;;;;;;38176:8;38145:40;;38166:8;38145:40;;;;;;;;;;;;38020:173;;:::o;35539:127::-;35646:1;35628:7;:14;;;:19;;;;;;;;;;;35539:127;:::o;26505:110::-;26581:26;26591:2;26595:7;26581:26;;;;;;;;;;;;:9;:26::i;:::-;26505:110;;:::o;33533:118::-;33059:8;:6;:8::i;:::-;33058:9;33050:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;33603:4:::1;33593:7;;:14;;;;;;;;;;;;;;;;;;33623:20;33630:12;:10;:12::i;:::-;33623:20;;;;;;:::i;:::-;;;;;;;;33533:118::o:0;33792:120::-;33336:8;:6;:8::i;:::-;33328:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;33861:5:::1;33851:7;;:15;;;;;;;;;;;;;;;;;;33882:22;33891:12;:10;:12::i;:::-;33882:22;;;;;;:::i;:::-;;;;;;;;33792:120::o:0;24893:315::-;25050:28;25060:4;25066:2;25070:7;25050:9;:28::i;:::-;25097:48;25120:4;25126:2;25130:7;25139:5;25097:22;:48::i;:::-;25089:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;24893:315;;;;:::o;38875:103::-;38927:13;38960:10;38953:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38875:103;:::o;15775:723::-;15831:13;16061:1;16052:5;:10;16048:53;;;16079:10;;;;;;;;;;;;;;;;;;;;;16048:53;16111:12;16126:5;16111:20;;16142:14;16167:78;16182:1;16174:4;:9;16167:78;;16200:8;;;;;:::i;:::-;;;;16231:2;16223:10;;;;;:::i;:::-;;;16167:78;;;16255:19;16287:6;16277:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16255:39;;16305:154;16321:1;16312:5;:10;16305:154;;16349:1;16339:11;;;;;:::i;:::-;;;16416:2;16408:5;:10;;;;:::i;:::-;16395:2;:24;;;;:::i;:::-;16382:39;;16365:6;16372;16365:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;16445:2;16436:11;;;;;:::i;:::-;;;16305:154;;;16483:6;16469:21;;;;;15775:723;;;;:::o;41545:292::-;41711:1;41695:18;;:4;:18;;;41693:21;:43;;;;;41728:7;:5;:7::i;:::-;41720:15;;:4;:15;;;41718:18;41693:43;41689:141;;;41762:8;:6;:8::i;:::-;41761:9;41753:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41689:141;41545:292;;;:::o;26842:321::-;26972:18;26978:2;26982:7;26972:5;:18::i;:::-;27023:54;27054:1;27058:2;27062:7;27071:5;27023:22;:54::i;:::-;27001:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;26842:321;;;:::o;30242:803::-;30397:4;30418:15;:2;:13;;;:15::i;:::-;30414:624;;;30470:2;30454:36;;;30491:12;:10;:12::i;:::-;30505:4;30511:7;30520:5;30454:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;30450:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30717:1;30700:6;:13;:18;30696:272;;;30743:60;;;;;;;;;;:::i;:::-;;;;;;;;30696:272;30918:6;30912:13;30903:6;30899:2;30895:15;30888:38;30450:533;30587:45;;;30577:55;;;:6;:55;;;;30570:62;;;;;30414:624;31022:4;31015:11;;30242:803;;;;;;;:::o;27499:382::-;27593:1;27579:16;;:2;:16;;;;27571:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;27652:16;27660:7;27652;:16::i;:::-;27651:17;27643:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;27714:45;27743:1;27747:2;27751:7;27714:20;:45::i;:::-;27789:1;27772:9;:13;27782:2;27772:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;27820:2;27801:7;:16;27809:7;27801:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;27865:7;27861:2;27840:33;;27857:1;27840:33;;;;;;;;;;;;27499:382;;:::o;7682:387::-;7742:4;7950:12;8017:7;8005:20;7997:28;;8060:1;8053:4;:8;8046:15;;;7682:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2040:5;2078:6;2065:20;2056:29;;2094:32;2120:5;2094:32;:::i;:::-;2046:86;;;;:::o;2138:141::-;2194:5;2225:6;2219:13;2210:22;;2241:32;2267:5;2241:32;:::i;:::-;2200:79;;;;:::o;2298:271::-;2353:5;2402:3;2395:4;2387:6;2383:17;2379:27;2369:2;;2420:1;2417;2410:12;2369:2;2460:6;2447:20;2485:78;2559:3;2551:6;2544:4;2536:6;2532:17;2485:78;:::i;:::-;2476:87;;2359:210;;;;;:::o;2589:273::-;2645:5;2694:3;2687:4;2679:6;2675:17;2671:27;2661:2;;2712:1;2709;2702:12;2661:2;2752:6;2739:20;2777:79;2852:3;2844:6;2837:4;2829:6;2825:17;2777:79;:::i;:::-;2768:88;;2651:211;;;;;:::o;2868:139::-;2914:5;2952:6;2939:20;2930:29;;2968:33;2995:5;2968:33;:::i;:::-;2920:87;;;;:::o;3013:262::-;3072:6;3121:2;3109:9;3100:7;3096:23;3092:32;3089:2;;;3137:1;3134;3127:12;3089:2;3180:1;3205:53;3250:7;3241:6;3230:9;3226:22;3205:53;:::i;:::-;3195:63;;3151:117;3079:196;;;;:::o;3281:407::-;3349:6;3357;3406:2;3394:9;3385:7;3381:23;3377:32;3374:2;;;3422:1;3419;3412:12;3374:2;3465:1;3490:53;3535:7;3526:6;3515:9;3511:22;3490:53;:::i;:::-;3480:63;;3436:117;3592:2;3618:53;3663:7;3654:6;3643:9;3639:22;3618:53;:::i;:::-;3608:63;;3563:118;3364:324;;;;;:::o;3694:552::-;3771:6;3779;3787;3836:2;3824:9;3815:7;3811:23;3807:32;3804:2;;;3852:1;3849;3842:12;3804:2;3895:1;3920:53;3965:7;3956:6;3945:9;3941:22;3920:53;:::i;:::-;3910:63;;3866:117;4022:2;4048:53;4093:7;4084:6;4073:9;4069:22;4048:53;:::i;:::-;4038:63;;3993:118;4150:2;4176:53;4221:7;4212:6;4201:9;4197:22;4176:53;:::i;:::-;4166:63;;4121:118;3794:452;;;;;:::o;4252:809::-;4347:6;4355;4363;4371;4420:3;4408:9;4399:7;4395:23;4391:33;4388:2;;;4437:1;4434;4427:12;4388:2;4480:1;4505:53;4550:7;4541:6;4530:9;4526:22;4505:53;:::i;:::-;4495:63;;4451:117;4607:2;4633:53;4678:7;4669:6;4658:9;4654:22;4633:53;:::i;:::-;4623:63;;4578:118;4735:2;4761:53;4806:7;4797:6;4786:9;4782:22;4761:53;:::i;:::-;4751:63;;4706:118;4891:2;4880:9;4876:18;4863:32;4922:18;4914:6;4911:30;4908:2;;;4954:1;4951;4944:12;4908:2;4982:62;5036:7;5027:6;5016:9;5012:22;4982:62;:::i;:::-;4972:72;;4834:220;4378:683;;;;;;;:::o;5067:401::-;5132:6;5140;5189:2;5177:9;5168:7;5164:23;5160:32;5157:2;;;5205:1;5202;5195:12;5157:2;5248:1;5273:53;5318:7;5309:6;5298:9;5294:22;5273:53;:::i;:::-;5263:63;;5219:117;5375:2;5401:50;5443:7;5434:6;5423:9;5419:22;5401:50;:::i;:::-;5391:60;;5346:115;5147:321;;;;;:::o;5474:407::-;5542:6;5550;5599:2;5587:9;5578:7;5574:23;5570:32;5567:2;;;5615:1;5612;5605:12;5567:2;5658:1;5683:53;5728:7;5719:6;5708:9;5704:22;5683:53;:::i;:::-;5673:63;;5629:117;5785:2;5811:53;5856:7;5847:6;5836:9;5832:22;5811:53;:::i;:::-;5801:63;;5756:118;5557:324;;;;;:::o;5887:405::-;5971:6;6020:2;6008:9;5999:7;5995:23;5991:32;5988:2;;;6036:1;6033;6026:12;5988:2;6107:1;6096:9;6092:17;6079:31;6137:18;6129:6;6126:30;6123:2;;;6169:1;6166;6159:12;6123:2;6197:78;6267:7;6258:6;6247:9;6243:22;6197:78;:::i;:::-;6187:88;;6050:235;5978:314;;;;:::o;6298:260::-;6356:6;6405:2;6393:9;6384:7;6380:23;6376:32;6373:2;;;6421:1;6418;6411:12;6373:2;6464:1;6489:52;6533:7;6524:6;6513:9;6509:22;6489:52;:::i;:::-;6479:62;;6435:116;6363:195;;;;:::o;6564:282::-;6633:6;6682:2;6670:9;6661:7;6657:23;6653:32;6650:2;;;6698:1;6695;6688:12;6650:2;6741:1;6766:63;6821:7;6812:6;6801:9;6797:22;6766:63;:::i;:::-;6756:73;;6712:127;6640:206;;;;:::o;6852:375::-;6921:6;6970:2;6958:9;6949:7;6945:23;6941:32;6938:2;;;6986:1;6983;6976:12;6938:2;7057:1;7046:9;7042:17;7029:31;7087:18;7079:6;7076:30;7073:2;;;7119:1;7116;7109:12;7073:2;7147:63;7202:7;7193:6;7182:9;7178:22;7147:63;:::i;:::-;7137:73;;7000:220;6928:299;;;;:::o;7233:262::-;7292:6;7341:2;7329:9;7320:7;7316:23;7312:32;7309:2;;;7357:1;7354;7347:12;7309:2;7400:1;7425:53;7470:7;7461:6;7450:9;7446:22;7425:53;:::i;:::-;7415:63;;7371:117;7299:196;;;;:::o;7501:118::-;7588:24;7606:5;7588:24;:::i;:::-;7583:3;7576:37;7566:53;;:::o;7625:109::-;7706:21;7721:5;7706:21;:::i;:::-;7701:3;7694:34;7684:50;;:::o;7740:360::-;7826:3;7854:38;7886:5;7854:38;:::i;:::-;7908:70;7971:6;7966:3;7908:70;:::i;:::-;7901:77;;7987:52;8032:6;8027:3;8020:4;8013:5;8009:16;7987:52;:::i;:::-;8064:29;8086:6;8064:29;:::i;:::-;8059:3;8055:39;8048:46;;7830:270;;;;;:::o;8106:364::-;8194:3;8222:39;8255:5;8222:39;:::i;:::-;8277:71;8341:6;8336:3;8277:71;:::i;:::-;8270:78;;8357:52;8402:6;8397:3;8390:4;8383:5;8379:16;8357:52;:::i;:::-;8434:29;8456:6;8434:29;:::i;:::-;8429:3;8425:39;8418:46;;8198:272;;;;;:::o;8476:377::-;8582:3;8610:39;8643:5;8610:39;:::i;:::-;8665:89;8747:6;8742:3;8665:89;:::i;:::-;8658:96;;8763:52;8808:6;8803:3;8796:4;8789:5;8785:16;8763:52;:::i;:::-;8840:6;8835:3;8831:16;8824:23;;8586:267;;;;;:::o;8859:366::-;9001:3;9022:67;9086:2;9081:3;9022:67;:::i;:::-;9015:74;;9098:93;9187:3;9098:93;:::i;:::-;9216:2;9211:3;9207:12;9200:19;;9005:220;;;:::o;9231:366::-;9373:3;9394:67;9458:2;9453:3;9394:67;:::i;:::-;9387:74;;9470:93;9559:3;9470:93;:::i;:::-;9588:2;9583:3;9579:12;9572:19;;9377:220;;;:::o;9603:366::-;9745:3;9766:67;9830:2;9825:3;9766:67;:::i;:::-;9759:74;;9842:93;9931:3;9842:93;:::i;:::-;9960:2;9955:3;9951:12;9944:19;;9749:220;;;:::o;9975:366::-;10117:3;10138:67;10202:2;10197:3;10138:67;:::i;:::-;10131:74;;10214:93;10303:3;10214:93;:::i;:::-;10332:2;10327:3;10323:12;10316:19;;10121:220;;;:::o;10347:366::-;10489:3;10510:67;10574:2;10569:3;10510:67;:::i;:::-;10503:74;;10586:93;10675:3;10586:93;:::i;:::-;10704:2;10699:3;10695:12;10688:19;;10493:220;;;:::o;10719:366::-;10861:3;10882:67;10946:2;10941:3;10882:67;:::i;:::-;10875:74;;10958:93;11047:3;10958:93;:::i;:::-;11076:2;11071:3;11067:12;11060:19;;10865:220;;;:::o;11091:366::-;11233:3;11254:67;11318:2;11313:3;11254:67;:::i;:::-;11247:74;;11330:93;11419:3;11330:93;:::i;:::-;11448:2;11443:3;11439:12;11432:19;;11237:220;;;:::o;11463:366::-;11605:3;11626:67;11690:2;11685:3;11626:67;:::i;:::-;11619:74;;11702:93;11791:3;11702:93;:::i;:::-;11820:2;11815:3;11811:12;11804:19;;11609:220;;;:::o;11835:366::-;11977:3;11998:67;12062:2;12057:3;11998:67;:::i;:::-;11991:74;;12074:93;12163:3;12074:93;:::i;:::-;12192:2;12187:3;12183:12;12176:19;;11981:220;;;:::o;12207:366::-;12349:3;12370:67;12434:2;12429:3;12370:67;:::i;:::-;12363:74;;12446:93;12535:3;12446:93;:::i;:::-;12564:2;12559:3;12555:12;12548:19;;12353:220;;;:::o;12579:366::-;12721:3;12742:67;12806:2;12801:3;12742:67;:::i;:::-;12735:74;;12818:93;12907:3;12818:93;:::i;:::-;12936:2;12931:3;12927:12;12920:19;;12725:220;;;:::o;12951:366::-;13093:3;13114:67;13178:2;13173:3;13114:67;:::i;:::-;13107:74;;13190:93;13279:3;13190:93;:::i;:::-;13308:2;13303:3;13299:12;13292:19;;13097:220;;;:::o;13323:366::-;13465:3;13486:67;13550:2;13545:3;13486:67;:::i;:::-;13479:74;;13562:93;13651:3;13562:93;:::i;:::-;13680:2;13675:3;13671:12;13664:19;;13469:220;;;:::o;13695:366::-;13837:3;13858:67;13922:2;13917:3;13858:67;:::i;:::-;13851:74;;13934:93;14023:3;13934:93;:::i;:::-;14052:2;14047:3;14043:12;14036:19;;13841:220;;;:::o;14067:366::-;14209:3;14230:67;14294:2;14289:3;14230:67;:::i;:::-;14223:74;;14306:93;14395:3;14306:93;:::i;:::-;14424:2;14419:3;14415:12;14408:19;;14213:220;;;:::o;14439:366::-;14581:3;14602:67;14666:2;14661:3;14602:67;:::i;:::-;14595:74;;14678:93;14767:3;14678:93;:::i;:::-;14796:2;14791:3;14787:12;14780:19;;14585:220;;;:::o;14811:366::-;14953:3;14974:67;15038:2;15033:3;14974:67;:::i;:::-;14967:74;;15050:93;15139:3;15050:93;:::i;:::-;15168:2;15163:3;15159:12;15152:19;;14957:220;;;:::o;15183:366::-;15325:3;15346:67;15410:2;15405:3;15346:67;:::i;:::-;15339:74;;15422:93;15511:3;15422:93;:::i;:::-;15540:2;15535:3;15531:12;15524:19;;15329:220;;;:::o;15555:366::-;15697:3;15718:67;15782:2;15777:3;15718:67;:::i;:::-;15711:74;;15794:93;15883:3;15794:93;:::i;:::-;15912:2;15907:3;15903:12;15896:19;;15701:220;;;:::o;15927:118::-;16014:24;16032:5;16014:24;:::i;:::-;16009:3;16002:37;15992:53;;:::o;16051:435::-;16231:3;16253:95;16344:3;16335:6;16253:95;:::i;:::-;16246:102;;16365:95;16456:3;16447:6;16365:95;:::i;:::-;16358:102;;16477:3;16470:10;;16235:251;;;;;:::o;16492:222::-;16585:4;16623:2;16612:9;16608:18;16600:26;;16636:71;16704:1;16693:9;16689:17;16680:6;16636:71;:::i;:::-;16590:124;;;;:::o;16720:640::-;16915:4;16953:3;16942:9;16938:19;16930:27;;16967:71;17035:1;17024:9;17020:17;17011:6;16967:71;:::i;:::-;17048:72;17116:2;17105:9;17101:18;17092:6;17048:72;:::i;:::-;17130;17198:2;17187:9;17183:18;17174:6;17130:72;:::i;:::-;17249:9;17243:4;17239:20;17234:2;17223:9;17219:18;17212:48;17277:76;17348:4;17339:6;17277:76;:::i;:::-;17269:84;;16920:440;;;;;;;:::o;17366:210::-;17453:4;17491:2;17480:9;17476:18;17468:26;;17504:65;17566:1;17555:9;17551:17;17542:6;17504:65;:::i;:::-;17458:118;;;;:::o;17582:313::-;17695:4;17733:2;17722:9;17718:18;17710:26;;17782:9;17776:4;17772:20;17768:1;17757:9;17753:17;17746:47;17810:78;17883:4;17874:6;17810:78;:::i;:::-;17802:86;;17700:195;;;;:::o;17901:419::-;18067:4;18105:2;18094:9;18090:18;18082:26;;18154:9;18148:4;18144:20;18140:1;18129:9;18125:17;18118:47;18182:131;18308:4;18182:131;:::i;:::-;18174:139;;18072:248;;;:::o;18326:419::-;18492:4;18530:2;18519:9;18515:18;18507:26;;18579:9;18573:4;18569:20;18565:1;18554:9;18550:17;18543:47;18607:131;18733:4;18607:131;:::i;:::-;18599:139;;18497:248;;;:::o;18751:419::-;18917:4;18955:2;18944:9;18940:18;18932:26;;19004:9;18998:4;18994:20;18990:1;18979:9;18975:17;18968:47;19032:131;19158:4;19032:131;:::i;:::-;19024:139;;18922:248;;;:::o;19176:419::-;19342:4;19380:2;19369:9;19365:18;19357:26;;19429:9;19423:4;19419:20;19415:1;19404:9;19400:17;19393:47;19457:131;19583:4;19457:131;:::i;:::-;19449:139;;19347:248;;;:::o;19601:419::-;19767:4;19805:2;19794:9;19790:18;19782:26;;19854:9;19848:4;19844:20;19840:1;19829:9;19825:17;19818:47;19882:131;20008:4;19882:131;:::i;:::-;19874:139;;19772:248;;;:::o;20026:419::-;20192:4;20230:2;20219:9;20215:18;20207:26;;20279:9;20273:4;20269:20;20265:1;20254:9;20250:17;20243:47;20307:131;20433:4;20307:131;:::i;:::-;20299:139;;20197:248;;;:::o;20451:419::-;20617:4;20655:2;20644:9;20640:18;20632:26;;20704:9;20698:4;20694:20;20690:1;20679:9;20675:17;20668:47;20732:131;20858:4;20732:131;:::i;:::-;20724:139;;20622:248;;;:::o;20876:419::-;21042:4;21080:2;21069:9;21065:18;21057:26;;21129:9;21123:4;21119:20;21115:1;21104:9;21100:17;21093:47;21157:131;21283:4;21157:131;:::i;:::-;21149:139;;21047:248;;;:::o;21301:419::-;21467:4;21505:2;21494:9;21490:18;21482:26;;21554:9;21548:4;21544:20;21540:1;21529:9;21525:17;21518:47;21582:131;21708:4;21582:131;:::i;:::-;21574:139;;21472:248;;;:::o;21726:419::-;21892:4;21930:2;21919:9;21915:18;21907:26;;21979:9;21973:4;21969:20;21965:1;21954:9;21950:17;21943:47;22007:131;22133:4;22007:131;:::i;:::-;21999:139;;21897:248;;;:::o;22151:419::-;22317:4;22355:2;22344:9;22340:18;22332:26;;22404:9;22398:4;22394:20;22390:1;22379:9;22375:17;22368:47;22432:131;22558:4;22432:131;:::i;:::-;22424:139;;22322:248;;;:::o;22576:419::-;22742:4;22780:2;22769:9;22765:18;22757:26;;22829:9;22823:4;22819:20;22815:1;22804:9;22800:17;22793:47;22857:131;22983:4;22857:131;:::i;:::-;22849:139;;22747:248;;;:::o;23001:419::-;23167:4;23205:2;23194:9;23190:18;23182:26;;23254:9;23248:4;23244:20;23240:1;23229:9;23225:17;23218:47;23282:131;23408:4;23282:131;:::i;:::-;23274:139;;23172:248;;;:::o;23426:419::-;23592:4;23630:2;23619:9;23615:18;23607:26;;23679:9;23673:4;23669:20;23665:1;23654:9;23650:17;23643:47;23707:131;23833:4;23707:131;:::i;:::-;23699:139;;23597:248;;;:::o;23851:419::-;24017:4;24055:2;24044:9;24040:18;24032:26;;24104:9;24098:4;24094:20;24090:1;24079:9;24075:17;24068:47;24132:131;24258:4;24132:131;:::i;:::-;24124:139;;24022:248;;;:::o;24276:419::-;24442:4;24480:2;24469:9;24465:18;24457:26;;24529:9;24523:4;24519:20;24515:1;24504:9;24500:17;24493:47;24557:131;24683:4;24557:131;:::i;:::-;24549:139;;24447:248;;;:::o;24701:419::-;24867:4;24905:2;24894:9;24890:18;24882:26;;24954:9;24948:4;24944:20;24940:1;24929:9;24925:17;24918:47;24982:131;25108:4;24982:131;:::i;:::-;24974:139;;24872:248;;;:::o;25126:419::-;25292:4;25330:2;25319:9;25315:18;25307:26;;25379:9;25373:4;25369:20;25365:1;25354:9;25350:17;25343:47;25407:131;25533:4;25407:131;:::i;:::-;25399:139;;25297:248;;;:::o;25551:419::-;25717:4;25755:2;25744:9;25740:18;25732:26;;25804:9;25798:4;25794:20;25790:1;25779:9;25775:17;25768:47;25832:131;25958:4;25832:131;:::i;:::-;25824:139;;25722:248;;;:::o;25976:222::-;26069:4;26107:2;26096:9;26092:18;26084:26;;26120:71;26188:1;26177:9;26173:17;26164:6;26120:71;:::i;:::-;26074:124;;;;:::o;26204:129::-;26238:6;26265:20;;:::i;:::-;26255:30;;26294:33;26322:4;26314:6;26294:33;:::i;:::-;26245:88;;;:::o;26339:75::-;26372:6;26405:2;26399:9;26389:19;;26379:35;:::o;26420:311::-;26497:4;26587:18;26579:6;26576:30;26573:2;;;26609:18;;:::i;:::-;26573:2;26659:4;26651:6;26647:17;26639:25;;26719:4;26713;26709:15;26701:23;;26502:229;;;:::o;26737:307::-;26798:4;26888:18;26880:6;26877:30;26874:2;;;26910:18;;:::i;:::-;26874:2;26948:29;26970:6;26948:29;:::i;:::-;26940:37;;27032:4;27026;27022:15;27014:23;;26803:241;;;:::o;27050:308::-;27112:4;27202:18;27194:6;27191:30;27188:2;;;27224:18;;:::i;:::-;27188:2;27262:29;27284:6;27262:29;:::i;:::-;27254:37;;27346:4;27340;27336:15;27328:23;;27117:241;;;:::o;27364:98::-;27415:6;27449:5;27443:12;27433:22;;27422:40;;;:::o;27468:99::-;27520:6;27554:5;27548:12;27538:22;;27527:40;;;:::o;27573:168::-;27656:11;27690:6;27685:3;27678:19;27730:4;27725:3;27721:14;27706:29;;27668:73;;;;:::o;27747:169::-;27831:11;27865:6;27860:3;27853:19;27905:4;27900:3;27896:14;27881:29;;27843:73;;;;:::o;27922:148::-;28024:11;28061:3;28046:18;;28036:34;;;;:::o;28076:305::-;28116:3;28135:20;28153:1;28135:20;:::i;:::-;28130:25;;28169:20;28187:1;28169:20;:::i;:::-;28164:25;;28323:1;28255:66;28251:74;28248:1;28245:81;28242:2;;;28329:18;;:::i;:::-;28242:2;28373:1;28370;28366:9;28359:16;;28120:261;;;;:::o;28387:185::-;28427:1;28444:20;28462:1;28444:20;:::i;:::-;28439:25;;28478:20;28496:1;28478:20;:::i;:::-;28473:25;;28517:1;28507:2;;28522:18;;:::i;:::-;28507:2;28564:1;28561;28557:9;28552:14;;28429:143;;;;:::o;28578:348::-;28618:7;28641:20;28659:1;28641:20;:::i;:::-;28636:25;;28675:20;28693:1;28675:20;:::i;:::-;28670:25;;28863:1;28795:66;28791:74;28788:1;28785:81;28780:1;28773:9;28766:17;28762:105;28759:2;;;28870:18;;:::i;:::-;28759:2;28918:1;28915;28911:9;28900:20;;28626:300;;;;:::o;28932:191::-;28972:4;28992:20;29010:1;28992:20;:::i;:::-;28987:25;;29026:20;29044:1;29026:20;:::i;:::-;29021:25;;29065:1;29062;29059:8;29056:2;;;29070:18;;:::i;:::-;29056:2;29115:1;29112;29108:9;29100:17;;28977:146;;;;:::o;29129:96::-;29166:7;29195:24;29213:5;29195:24;:::i;:::-;29184:35;;29174:51;;;:::o;29231:90::-;29265:7;29308:5;29301:13;29294:21;29283:32;;29273:48;;;:::o;29327:149::-;29363:7;29403:66;29396:5;29392:78;29381:89;;29371:105;;;:::o;29482:126::-;29519:7;29559:42;29552:5;29548:54;29537:65;;29527:81;;;:::o;29614:77::-;29651:7;29680:5;29669:16;;29659:32;;;:::o;29697:154::-;29781:6;29776:3;29771;29758:30;29843:1;29834:6;29829:3;29825:16;29818:27;29748:103;;;:::o;29857:307::-;29925:1;29935:113;29949:6;29946:1;29943:13;29935:113;;;30034:1;30029:3;30025:11;30019:18;30015:1;30010:3;30006:11;29999:39;29971:2;29968:1;29964:10;29959:15;;29935:113;;;30066:6;30063:1;30060:13;30057:2;;;30146:1;30137:6;30132:3;30128:16;30121:27;30057:2;29906:258;;;;:::o;30170:320::-;30214:6;30251:1;30245:4;30241:12;30231:22;;30298:1;30292:4;30288:12;30319:18;30309:2;;30375:4;30367:6;30363:17;30353:27;;30309:2;30437;30429:6;30426:14;30406:18;30403:38;30400:2;;;30456:18;;:::i;:::-;30400:2;30221:269;;;;:::o;30496:281::-;30579:27;30601:4;30579:27;:::i;:::-;30571:6;30567:40;30709:6;30697:10;30694:22;30673:18;30661:10;30658:34;30655:62;30652:2;;;30720:18;;:::i;:::-;30652:2;30760:10;30756:2;30749:22;30539:238;;;:::o;30783:233::-;30822:3;30845:24;30863:5;30845:24;:::i;:::-;30836:33;;30891:66;30884:5;30881:77;30878:2;;;30961:18;;:::i;:::-;30878:2;31008:1;31001:5;30997:13;30990:20;;30826:190;;;:::o;31022:176::-;31054:1;31071:20;31089:1;31071:20;:::i;:::-;31066:25;;31105:20;31123:1;31105:20;:::i;:::-;31100:25;;31144:1;31134:2;;31149:18;;:::i;:::-;31134:2;31190:1;31187;31183:9;31178:14;;31056:142;;;;:::o;31204:180::-;31252:77;31249:1;31242:88;31349:4;31346:1;31339:15;31373:4;31370:1;31363:15;31390:180;31438:77;31435:1;31428:88;31535:4;31532:1;31525:15;31559:4;31556:1;31549:15;31576:180;31624:77;31621:1;31614:88;31721:4;31718:1;31711:15;31745:4;31742:1;31735:15;31762:180;31810:77;31807:1;31800:88;31907:4;31904:1;31897:15;31931:4;31928:1;31921:15;31948:102;31989:6;32040:2;32036:7;32031:2;32024:5;32020:14;32016:28;32006:38;;31996:54;;;:::o;32056:230::-;32196:34;32192:1;32184:6;32180:14;32173:58;32265:13;32260:2;32252:6;32248:15;32241:38;32162:124;:::o;32292:170::-;32432:22;32428:1;32420:6;32416:14;32409:46;32398:64;:::o;32468:237::-;32608:34;32604:1;32596:6;32592:14;32585:58;32677:20;32672:2;32664:6;32660:15;32653:45;32574:131;:::o;32711:225::-;32851:34;32847:1;32839:6;32835:14;32828:58;32920:8;32915:2;32907:6;32903:15;32896:33;32817:119;:::o;32942:178::-;33082:30;33078:1;33070:6;33066:14;33059:54;33048:72;:::o;33126:223::-;33266:34;33262:1;33254:6;33250:14;33243:58;33335:6;33330:2;33322:6;33318:15;33311:31;33232:117;:::o;33355:175::-;33495:27;33491:1;33483:6;33479:14;33472:51;33461:69;:::o;33536:231::-;33676:34;33672:1;33664:6;33660:14;33653:58;33745:14;33740:2;33732:6;33728:15;33721:39;33642:125;:::o;33773:166::-;33913:18;33909:1;33901:6;33897:14;33890:42;33879:60;:::o;33945:243::-;34085:34;34081:1;34073:6;34069:14;34062:58;34154:26;34149:2;34141:6;34137:15;34130:51;34051:137;:::o;34194:229::-;34334:34;34330:1;34322:6;34318:14;34311:58;34403:12;34398:2;34390:6;34386:15;34379:37;34300:123;:::o;34429:228::-;34569:34;34565:1;34557:6;34553:14;34546:58;34638:11;34633:2;34625:6;34621:15;34614:36;34535:122;:::o;34663:182::-;34803:34;34799:1;34791:6;34787:14;34780:58;34769:76;:::o;34851:231::-;34991:34;34987:1;34979:6;34975:14;34968:58;35060:14;35055:2;35047:6;35043:15;35036:39;34957:125;:::o;35088:182::-;35228:34;35224:1;35216:6;35212:14;35205:58;35194:76;:::o;35276:228::-;35416:34;35412:1;35404:6;35400:14;35393:58;35485:11;35480:2;35472:6;35468:15;35461:36;35382:122;:::o;35510:234::-;35650:34;35646:1;35638:6;35634:14;35627:58;35719:17;35714:2;35706:6;35702:15;35695:42;35616:128;:::o;35750:220::-;35890:34;35886:1;35878:6;35874:14;35867:58;35959:3;35954:2;35946:6;35942:15;35935:28;35856:114;:::o;35976:236::-;36116:34;36112:1;36104:6;36100:14;36093:58;36185:19;36180:2;36172:6;36168:15;36161:44;36082:130;:::o;36218:122::-;36291:24;36309:5;36291:24;:::i;:::-;36284:5;36281:35;36271:2;;36330:1;36327;36320:12;36271:2;36261:79;:::o;36346:116::-;36416:21;36431:5;36416:21;:::i;:::-;36409:5;36406:32;36396:2;;36452:1;36449;36442:12;36396:2;36386:76;:::o;36468:120::-;36540:23;36557:5;36540:23;:::i;:::-;36533:5;36530:34;36520:2;;36578:1;36575;36568:12;36520:2;36510:78;:::o;36594:122::-;36667:24;36685:5;36667:24;:::i;:::-;36660:5;36657:35;36647:2;;36706:1;36703;36696:12;36647:2;36637:79;:::o

Swarm Source

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