ETH Price: $3,392.63 (+1.42%)

Token

Badonkadonks (BADONKS)
 

Overview

Max Total Supply

30 BADONKS

Holders

14

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 BADONKS
0xa442ddf27063320789b59a8fdca5b849cd2cdeac
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Badonkadonks

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-15
*/

// 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 Badonkadonks is ERC721Pausable, Ownable {
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    uint256 private constant _maxTokens = 10000;
    uint256 private constant _maxMint = 10;
    uint256 private constant _maxPresaleMint = 2;
    uint256 public constant _price = 10000000000000000; // 0.01 ETH

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

    string public _prefixURI;

    constructor() ERC721("Badonkadonks", "BADONKS") {
        _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"}]

60806040526000600a60006101000a81548160ff0219169083151502179055506000600a60016101000a81548160ff0219169083151502179055503480156200004757600080fd5b506040518060400160405280600c81526020017f4261646f6e6b61646f6e6b7300000000000000000000000000000000000000008152506040518060400160405280600781526020017f4241444f4e4b53000000000000000000000000000000000000000000000000008152508160009080519060200190620000cc929190620002d6565b508060019080519060200190620000e5929190620002d6565b5050506000600660006101000a81548160ff02191690831515021790555062000123620001176200013960201b60201c565b6200014160201b60201c565b620001336200020760201b60201c565b620004d0565b600033905090565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b62000217620002bf60201b60201c565b156200025a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200025190620003db565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620002a66200013960201b60201c565b604051620002b59190620003be565b60405180910390a1565b6000600660009054906101000a900460ff16905090565b828054620002e49062000442565b90600052602060002090601f01602090048101928262000308576000855562000354565b82601f106200032357805160ff191683800117855562000354565b8280016001018555821562000354579182015b828111156200035357825182559160200191906001019062000336565b5b50905062000363919062000367565b5090565b5b808211156200038257600081600090555060010162000368565b5090565b62000391816200040e565b82525050565b6000620003a6601083620003fd565b9150620003b382620004a7565b602082019050919050565b6000602082019050620003d5600083018462000386565b92915050565b60006020820190508181036000830152620003f68162000397565b9050919050565b600082825260208201905092915050565b60006200041b8262000422565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200045b57607f821691505b6020821081141562000472576200047162000478565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b613e3180620004e06000396000f3fe6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105ff578063ca3cb5221461063c578063e985e9c514610653578063f2fde38b14610690576101cd565b806395d89b411461056b5780639752a01714610596578063a22cb465146105ad578063b88d4fde146105d6576101cd565b80637f649783116100d15780637f649783146104c3578063819b25ba146104ec5780638da5cb5b1461051557806391860f7814610540576101cd565b806370a0823114610458578063715018a6146104955780637d8966e4146104ac576101cd565b806323b872dd1161016f5780635367de6a1161013e5780635367de6a146103ab57806355f804b3146103c75780635c975abb146103f05780636352211e1461041b576101cd565b806323b872dd146103125780633af32abf1461033b5780633ccfd60b1461037857806342842e0e14610382576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630b4b9878146102a057806318160ddd146102bc578063235b6ea1146102e7576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612c77565b6106b9565b604051610206919061313b565b60405180910390f35b34801561021b57600080fd5b5061022461079b565b6040516102319190613156565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d1a565b61082d565b60405161026e91906130d4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612bee565b6108b2565b005b6102ba60048036038101906102b59190612d1a565b6109ca565b005b3480156102c857600080fd5b506102d1610b34565b6040516102de91906133d8565b60405180910390f35b3480156102f357600080fd5b506102fc610b45565b60405161030991906133d8565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612ad8565b610b50565b005b34801561034757600080fd5b50610362600480360381019061035d9190612a6b565b610bb0565b60405161036f919061313b565b60405180910390f35b610380610c06565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612ad8565b610cc2565b005b6103c560048036038101906103c09190612d1a565b610ce2565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612cd1565b610d7d565b005b3480156103fc57600080fd5b50610405610e13565b604051610412919061313b565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d9190612d1a565b610e2a565b60405161044f91906130d4565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612a6b565b610edc565b60405161048c91906133d8565b60405180910390f35b3480156104a157600080fd5b506104aa610f94565b005b3480156104b857600080fd5b506104c161101c565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612c2e565b6110c4565b005b3480156104f857600080fd5b50610513600480360381019061050e9190612d1a565b611234565b005b34801561052157600080fd5b5061052a611309565b60405161053791906130d4565b60405180910390f35b34801561054c57600080fd5b50610555611333565b6040516105629190613156565b60405180910390f35b34801561057757600080fd5b506105806113c1565b60405161058d9190613156565b60405180910390f35b3480156105a257600080fd5b506105ab611453565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612bae565b6114f3565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612b2b565b611674565b005b34801561060b57600080fd5b5061062660048036038101906106219190612d1a565b6116d6565b6040516106339190613156565b60405180910390f35b34801561064857600080fd5b5061065161177d565b005b34801561065f57600080fd5b5061067a60048036038101906106759190612a98565b611825565b604051610687919061313b565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190612a6b565b6118b9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107945750610793826119b1565b5b9050919050565b6060600080546107aa906136b4565b80601f01602080910402602001604051908101604052809291908181526020018280546107d6906136b4565b80156108235780601f106107f857610100808354040283529160200191610823565b820191906000526020600020905b81548152906001019060200180831161080657829003601f168201915b5050505050905090565b600061083882611a1b565b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613318565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108bd82610e2a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092590613398565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094d611a87565b73ffffffffffffffffffffffffffffffffffffffff16148061097c575061097b81610976611a87565b611825565b5b6109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613298565b60405180910390fd5b6109c58383611a8f565b505050565b600a8111156109d857600080fd5b60028111156109e657600080fd5b6109ef33610bb0565b6109f857600080fd5b662386f26fc1000081610a0b9190613570565b341015610a1757600080fd5b600281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a6491906134e9565b1115610a6f57600080fd5b600a60009054906101000a900460ff16610a8857600080fd5b6000610a946007611b48565b90506127108282610aa591906134e9565b1115610ab057600080fd5b60005b82811015610b2f576001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b0b91906134e9565b92505081905550610b1b33611b56565b508080610b2790613717565b915050610ab3565b505050565b6000610b406007611b48565b905090565b662386f26fc1000081565b610b61610b5b611a87565b82611b83565b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b97906133b8565b60405180910390fd5b610bab838383611c61565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c0e611a87565b73ffffffffffffffffffffffffffffffffffffffff16610c2c611309565b73ffffffffffffffffffffffffffffffffffffffff1614610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7990613338565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cc057600080fd5b565b610cdd83838360405180602001604052806000815250611674565b505050565b600a811115610cf057600080fd5b600a60019054906101000a900460ff16610d0957600080fd5b6000610d156007611b48565b90506127108282610d2691906134e9565b1115610d3157600080fd5b662386f26fc1000082610d449190613570565b341015610d5057600080fd5b60005b82811015610d7857610d6433611b56565b508080610d7090613717565b915050610d53565b505050565b610d85611a87565b73ffffffffffffffffffffffffffffffffffffffff16610da3611309565b73ffffffffffffffffffffffffffffffffffffffff1614610df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df090613338565b60405180910390fd5b80600b9080519060200190610e0f9291906127e1565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906132d8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f44906132b8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f9c611a87565b73ffffffffffffffffffffffffffffffffffffffff16610fba611309565b73ffffffffffffffffffffffffffffffffffffffff1614611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790613338565b60405180910390fd5b61101a6000611ebd565b565b611024611a87565b73ffffffffffffffffffffffffffffffffffffffff16611042611309565b73ffffffffffffffffffffffffffffffffffffffff1614611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90613338565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6110cc611a87565b73ffffffffffffffffffffffffffffffffffffffff166110ea611309565b73ffffffffffffffffffffffffffffffffffffffff1614611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613338565b60405180910390fd5b60005b8151811015611230576001600860008484815181106111655761116461381e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600960008484815181106111d7576111d661381e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061122890613717565b915050611143565b5050565b61123c611a87565b73ffffffffffffffffffffffffffffffffffffffff1661125a611309565b73ffffffffffffffffffffffffffffffffffffffff16146112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790613338565b60405180910390fd5b60006112bc6007611b48565b90505b81811015611305576127108110156112f2576112db6007611f83565b6112f1336001836112ec91906134e9565b611f99565b5b80806112fd90613717565b9150506112bf565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b8054611340906136b4565b80601f016020809104026020016040519081016040528092919081815260200182805461136c906136b4565b80156113b95780601f1061138e576101008083540402835291602001916113b9565b820191906000526020600020905b81548152906001019060200180831161139c57829003601f168201915b505050505081565b6060600180546113d0906136b4565b80601f01602080910402602001604051908101604052809291908181526020018280546113fc906136b4565b80156114495780601f1061141e57610100808354040283529160200191611449565b820191906000526020600020905b81548152906001019060200180831161142c57829003601f168201915b5050505050905090565b61145b611a87565b73ffffffffffffffffffffffffffffffffffffffff16611479611309565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613338565b60405180910390fd5b6114d7610e13565b6114e8576114e3611fb7565b6114f1565b6114f061205a565b5b565b6114fb611a87565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613238565b60405180910390fd5b8060056000611576611a87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611623611a87565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611668919061313b565b60405180910390a35050565b61168561167f611a87565b83611b83565b6116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb906133b8565b60405180910390fd5b6116d0848484846120fc565b50505050565b60606116e182611a1b565b611720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171790613378565b60405180910390fd5b600061172a612158565b9050600081511161174a5760405180602001604052806000815250611775565b80611754846121ea565b6040516020016117659291906130b0565b6040516020818303038152906040525b915050919050565b611785611a87565b73ffffffffffffffffffffffffffffffffffffffff166117a3611309565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090613338565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118c1611a87565b73ffffffffffffffffffffffffffffffffffffffff166118df611309565b73ffffffffffffffffffffffffffffffffffffffff1614611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c90613338565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c906131d8565b60405180910390fd5b6119ae81611ebd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b0283610e2a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611b626007611f83565b6000611b6e6007611b48565b9050611b7a8382611f99565b80915050919050565b6000611b8e82611a1b565b611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc490613258565b60405180910390fd5b6000611bd883610e2a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4757508373ffffffffffffffffffffffffffffffffffffffff16611c2f8461082d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c585750611c578185611825565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8182610e2a565b73ffffffffffffffffffffffffffffffffffffffff1614611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90613358565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e90613218565b60405180910390fd5b611d5283838361234b565b611d5d600082611a8f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dad91906135ca565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0491906134e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b611fb382826040518060200160405280600081525061240e565b5050565b611fbf610e13565b15611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690613278565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612043611a87565b60405161205091906130d4565b60405180910390a1565b612062610e13565b6120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890613198565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120e5611a87565b6040516120f291906130d4565b60405180910390a1565b612107848484611c61565b61211384848484612469565b612152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612149906131b8565b60405180910390fd5b50505050565b6060600b8054612167906136b4565b80601f0160208091040260200160405190810160405280929190818152602001828054612193906136b4565b80156121e05780601f106121b5576101008083540402835291602001916121e0565b820191906000526020600020905b8154815290600101906020018083116121c357829003601f168201915b5050505050905090565b60606000821415612232576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612346565b600082905060005b6000821461226457808061224d90613717565b915050600a8261225d919061353f565b915061223a565b60008167ffffffffffffffff8111156122805761227f61384d565b5b6040519080825280601f01601f1916602001820160405280156122b25781602001600182028036833780820191505090505b5090505b6000851461233f576001826122cb91906135ca565b9150600a856122da9190613760565b60306122e691906134e9565b60f81b8183815181106122fc576122fb61381e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612338919061353f565b94506122b6565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123bb575061238b611309565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612409576123c8610e13565b15612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff90613178565b60405180910390fd5b5b505050565b6124188383612600565b6124256000848484612469565b612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b906131b8565b60405180910390fd5b505050565b600061248a8473ffffffffffffffffffffffffffffffffffffffff166127ce565b156125f3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124b3611a87565b8786866040518563ffffffff1660e01b81526004016124d594939291906130ef565b602060405180830381600087803b1580156124ef57600080fd5b505af192505050801561252057506040513d601f19601f8201168201806040525081019061251d9190612ca4565b60015b6125a3573d8060008114612550576040519150601f19603f3d011682016040523d82523d6000602084013e612555565b606091505b5060008151141561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906131b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125f8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612667906132f8565b60405180910390fd5b61267981611a1b565b156126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b0906131f8565b60405180910390fd5b6126c56000838361234b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271591906134e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546127ed906136b4565b90600052602060002090601f01602090048101928261280f5760008555612856565b82601f1061282857805160ff1916838001178555612856565b82800160010185558215612856579182015b8281111561285557825182559160200191906001019061283a565b5b5090506128639190612867565b5090565b5b80821115612880576000816000905550600101612868565b5090565b600061289761289284613418565b6133f3565b905080838252602082019050828560208602820111156128ba576128b9613881565b5b60005b858110156128ea57816128d08882612978565b8452602084019350602083019250506001810190506128bd565b5050509392505050565b600061290761290284613444565b6133f3565b90508281526020810184848401111561292357612922613886565b5b61292e848285613672565b509392505050565b600061294961294484613475565b6133f3565b90508281526020810184848401111561296557612964613886565b5b612970848285613672565b509392505050565b60008135905061298781613d9f565b92915050565b600082601f8301126129a2576129a161387c565b5b81356129b2848260208601612884565b91505092915050565b6000813590506129ca81613db6565b92915050565b6000813590506129df81613dcd565b92915050565b6000815190506129f481613dcd565b92915050565b600082601f830112612a0f57612a0e61387c565b5b8135612a1f8482602086016128f4565b91505092915050565b600082601f830112612a3d57612a3c61387c565b5b8135612a4d848260208601612936565b91505092915050565b600081359050612a6581613de4565b92915050565b600060208284031215612a8157612a80613890565b5b6000612a8f84828501612978565b91505092915050565b60008060408385031215612aaf57612aae613890565b5b6000612abd85828601612978565b9250506020612ace85828601612978565b9150509250929050565b600080600060608486031215612af157612af0613890565b5b6000612aff86828701612978565b9350506020612b1086828701612978565b9250506040612b2186828701612a56565b9150509250925092565b60008060008060808587031215612b4557612b44613890565b5b6000612b5387828801612978565b9450506020612b6487828801612978565b9350506040612b7587828801612a56565b925050606085013567ffffffffffffffff811115612b9657612b9561388b565b5b612ba2878288016129fa565b91505092959194509250565b60008060408385031215612bc557612bc4613890565b5b6000612bd385828601612978565b9250506020612be4858286016129bb565b9150509250929050565b60008060408385031215612c0557612c04613890565b5b6000612c1385828601612978565b9250506020612c2485828601612a56565b9150509250929050565b600060208284031215612c4457612c43613890565b5b600082013567ffffffffffffffff811115612c6257612c6161388b565b5b612c6e8482850161298d565b91505092915050565b600060208284031215612c8d57612c8c613890565b5b6000612c9b848285016129d0565b91505092915050565b600060208284031215612cba57612cb9613890565b5b6000612cc8848285016129e5565b91505092915050565b600060208284031215612ce757612ce6613890565b5b600082013567ffffffffffffffff811115612d0557612d0461388b565b5b612d1184828501612a28565b91505092915050565b600060208284031215612d3057612d2f613890565b5b6000612d3e84828501612a56565b91505092915050565b612d50816135fe565b82525050565b612d5f81613610565b82525050565b6000612d70826134a6565b612d7a81856134bc565b9350612d8a818560208601613681565b612d9381613895565b840191505092915050565b6000612da9826134b1565b612db381856134cd565b9350612dc3818560208601613681565b612dcc81613895565b840191505092915050565b6000612de2826134b1565b612dec81856134de565b9350612dfc818560208601613681565b80840191505092915050565b6000612e15602b836134cd565b9150612e20826138a6565b604082019050919050565b6000612e386014836134cd565b9150612e43826138f5565b602082019050919050565b6000612e5b6032836134cd565b9150612e668261391e565b604082019050919050565b6000612e7e6026836134cd565b9150612e898261396d565b604082019050919050565b6000612ea1601c836134cd565b9150612eac826139bc565b602082019050919050565b6000612ec46024836134cd565b9150612ecf826139e5565b604082019050919050565b6000612ee76019836134cd565b9150612ef282613a34565b602082019050919050565b6000612f0a602c836134cd565b9150612f1582613a5d565b604082019050919050565b6000612f2d6010836134cd565b9150612f3882613aac565b602082019050919050565b6000612f506038836134cd565b9150612f5b82613ad5565b604082019050919050565b6000612f73602a836134cd565b9150612f7e82613b24565b604082019050919050565b6000612f966029836134cd565b9150612fa182613b73565b604082019050919050565b6000612fb96020836134cd565b9150612fc482613bc2565b602082019050919050565b6000612fdc602c836134cd565b9150612fe782613beb565b604082019050919050565b6000612fff6020836134cd565b915061300a82613c3a565b602082019050919050565b60006130226029836134cd565b915061302d82613c63565b604082019050919050565b6000613045602f836134cd565b915061305082613cb2565b604082019050919050565b60006130686021836134cd565b915061307382613d01565b604082019050919050565b600061308b6031836134cd565b915061309682613d50565b604082019050919050565b6130aa81613668565b82525050565b60006130bc8285612dd7565b91506130c88284612dd7565b91508190509392505050565b60006020820190506130e96000830184612d47565b92915050565b60006080820190506131046000830187612d47565b6131116020830186612d47565b61311e60408301856130a1565b81810360608301526131308184612d65565b905095945050505050565b60006020820190506131506000830184612d56565b92915050565b600060208201905081810360008301526131708184612d9e565b905092915050565b6000602082019050818103600083015261319181612e08565b9050919050565b600060208201905081810360008301526131b181612e2b565b9050919050565b600060208201905081810360008301526131d181612e4e565b9050919050565b600060208201905081810360008301526131f181612e71565b9050919050565b6000602082019050818103600083015261321181612e94565b9050919050565b6000602082019050818103600083015261323181612eb7565b9050919050565b6000602082019050818103600083015261325181612eda565b9050919050565b6000602082019050818103600083015261327181612efd565b9050919050565b6000602082019050818103600083015261329181612f20565b9050919050565b600060208201905081810360008301526132b181612f43565b9050919050565b600060208201905081810360008301526132d181612f66565b9050919050565b600060208201905081810360008301526132f181612f89565b9050919050565b6000602082019050818103600083015261331181612fac565b9050919050565b6000602082019050818103600083015261333181612fcf565b9050919050565b6000602082019050818103600083015261335181612ff2565b9050919050565b6000602082019050818103600083015261337181613015565b9050919050565b6000602082019050818103600083015261339181613038565b9050919050565b600060208201905081810360008301526133b18161305b565b9050919050565b600060208201905081810360008301526133d18161307e565b9050919050565b60006020820190506133ed60008301846130a1565b92915050565b60006133fd61340e565b905061340982826136e6565b919050565b6000604051905090565b600067ffffffffffffffff8211156134335761343261384d565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561345f5761345e61384d565b5b61346882613895565b9050602081019050919050565b600067ffffffffffffffff8211156134905761348f61384d565b5b61349982613895565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134f482613668565b91506134ff83613668565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561353457613533613791565b5b828201905092915050565b600061354a82613668565b915061355583613668565b925082613565576135646137c0565b5b828204905092915050565b600061357b82613668565b915061358683613668565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135bf576135be613791565b5b828202905092915050565b60006135d582613668565b91506135e083613668565b9250828210156135f3576135f2613791565b5b828203905092915050565b600061360982613648565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561369f578082015181840152602081019050613684565b838111156136ae576000848401525b50505050565b600060028204905060018216806136cc57607f821691505b602082108114156136e0576136df6137ef565b5b50919050565b6136ef82613895565b810181811067ffffffffffffffff8211171561370e5761370d61384d565b5b80604052505050565b600061372282613668565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561375557613754613791565b5b600182019050919050565b600061376b82613668565b915061377683613668565b925082613786576137856137c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613da8816135fe565b8114613db357600080fd5b50565b613dbf81613610565b8114613dca57600080fd5b50565b613dd68161361c565b8114613de157600080fd5b50565b613ded81613668565b8114613df857600080fd5b5056fea2646970667358221220b8ab8f996d13a0008cbdc0417bd85eba3d29406efe089e7e49f3557f5218f4bc64736f6c63430008060033

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806370a08231116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd146105ff578063ca3cb5221461063c578063e985e9c514610653578063f2fde38b14610690576101cd565b806395d89b411461056b5780639752a01714610596578063a22cb465146105ad578063b88d4fde146105d6576101cd565b80637f649783116100d15780637f649783146104c3578063819b25ba146104ec5780638da5cb5b1461051557806391860f7814610540576101cd565b806370a0823114610458578063715018a6146104955780637d8966e4146104ac576101cd565b806323b872dd1161016f5780635367de6a1161013e5780635367de6a146103ab57806355f804b3146103c75780635c975abb146103f05780636352211e1461041b576101cd565b806323b872dd146103125780633af32abf1461033b5780633ccfd60b1461037857806342842e0e14610382576101cd565b8063095ea7b3116101ab578063095ea7b3146102775780630b4b9878146102a057806318160ddd146102bc578063235b6ea1146102e7576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612c77565b6106b9565b604051610206919061313b565b60405180910390f35b34801561021b57600080fd5b5061022461079b565b6040516102319190613156565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c9190612d1a565b61082d565b60405161026e91906130d4565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612bee565b6108b2565b005b6102ba60048036038101906102b59190612d1a565b6109ca565b005b3480156102c857600080fd5b506102d1610b34565b6040516102de91906133d8565b60405180910390f35b3480156102f357600080fd5b506102fc610b45565b60405161030991906133d8565b60405180910390f35b34801561031e57600080fd5b5061033960048036038101906103349190612ad8565b610b50565b005b34801561034757600080fd5b50610362600480360381019061035d9190612a6b565b610bb0565b60405161036f919061313b565b60405180910390f35b610380610c06565b005b34801561038e57600080fd5b506103a960048036038101906103a49190612ad8565b610cc2565b005b6103c560048036038101906103c09190612d1a565b610ce2565b005b3480156103d357600080fd5b506103ee60048036038101906103e99190612cd1565b610d7d565b005b3480156103fc57600080fd5b50610405610e13565b604051610412919061313b565b60405180910390f35b34801561042757600080fd5b50610442600480360381019061043d9190612d1a565b610e2a565b60405161044f91906130d4565b60405180910390f35b34801561046457600080fd5b5061047f600480360381019061047a9190612a6b565b610edc565b60405161048c91906133d8565b60405180910390f35b3480156104a157600080fd5b506104aa610f94565b005b3480156104b857600080fd5b506104c161101c565b005b3480156104cf57600080fd5b506104ea60048036038101906104e59190612c2e565b6110c4565b005b3480156104f857600080fd5b50610513600480360381019061050e9190612d1a565b611234565b005b34801561052157600080fd5b5061052a611309565b60405161053791906130d4565b60405180910390f35b34801561054c57600080fd5b50610555611333565b6040516105629190613156565b60405180910390f35b34801561057757600080fd5b506105806113c1565b60405161058d9190613156565b60405180910390f35b3480156105a257600080fd5b506105ab611453565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612bae565b6114f3565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612b2b565b611674565b005b34801561060b57600080fd5b5061062660048036038101906106219190612d1a565b6116d6565b6040516106339190613156565b60405180910390f35b34801561064857600080fd5b5061065161177d565b005b34801561065f57600080fd5b5061067a60048036038101906106759190612a98565b611825565b604051610687919061313b565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b29190612a6b565b6118b9565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107945750610793826119b1565b5b9050919050565b6060600080546107aa906136b4565b80601f01602080910402602001604051908101604052809291908181526020018280546107d6906136b4565b80156108235780601f106107f857610100808354040283529160200191610823565b820191906000526020600020905b81548152906001019060200180831161080657829003601f168201915b5050505050905090565b600061083882611a1b565b610877576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086e90613318565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108bd82610e2a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561092e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092590613398565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661094d611a87565b73ffffffffffffffffffffffffffffffffffffffff16148061097c575061097b81610976611a87565b611825565b5b6109bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b290613298565b60405180910390fd5b6109c58383611a8f565b505050565b600a8111156109d857600080fd5b60028111156109e657600080fd5b6109ef33610bb0565b6109f857600080fd5b662386f26fc1000081610a0b9190613570565b341015610a1757600080fd5b600281600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610a6491906134e9565b1115610a6f57600080fd5b600a60009054906101000a900460ff16610a8857600080fd5b6000610a946007611b48565b90506127108282610aa591906134e9565b1115610ab057600080fd5b60005b82811015610b2f576001600960003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610b0b91906134e9565b92505081905550610b1b33611b56565b508080610b2790613717565b915050610ab3565b505050565b6000610b406007611b48565b905090565b662386f26fc1000081565b610b61610b5b611a87565b82611b83565b610ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b97906133b8565b60405180910390fd5b610bab838383611c61565b505050565b6000600860008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610c0e611a87565b73ffffffffffffffffffffffffffffffffffffffff16610c2c611309565b73ffffffffffffffffffffffffffffffffffffffff1614610c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7990613338565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cc057600080fd5b565b610cdd83838360405180602001604052806000815250611674565b505050565b600a811115610cf057600080fd5b600a60019054906101000a900460ff16610d0957600080fd5b6000610d156007611b48565b90506127108282610d2691906134e9565b1115610d3157600080fd5b662386f26fc1000082610d449190613570565b341015610d5057600080fd5b60005b82811015610d7857610d6433611b56565b508080610d7090613717565b915050610d53565b505050565b610d85611a87565b73ffffffffffffffffffffffffffffffffffffffff16610da3611309565b73ffffffffffffffffffffffffffffffffffffffff1614610df9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df090613338565b60405180910390fd5b80600b9080519060200190610e0f9291906127e1565b5050565b6000600660009054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906132d8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f44906132b8565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f9c611a87565b73ffffffffffffffffffffffffffffffffffffffff16610fba611309565b73ffffffffffffffffffffffffffffffffffffffff1614611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100790613338565b60405180910390fd5b61101a6000611ebd565b565b611024611a87565b73ffffffffffffffffffffffffffffffffffffffff16611042611309565b73ffffffffffffffffffffffffffffffffffffffff1614611098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108f90613338565b60405180910390fd5b600a60019054906101000a900460ff1615600a60016101000a81548160ff021916908315150217905550565b6110cc611a87565b73ffffffffffffffffffffffffffffffffffffffff166110ea611309565b73ffffffffffffffffffffffffffffffffffffffff1614611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113790613338565b60405180910390fd5b60005b8151811015611230576001600860008484815181106111655761116461381e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600960008484815181106111d7576111d661381e565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808061122890613717565b915050611143565b5050565b61123c611a87565b73ffffffffffffffffffffffffffffffffffffffff1661125a611309565b73ffffffffffffffffffffffffffffffffffffffff16146112b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a790613338565b60405180910390fd5b60006112bc6007611b48565b90505b81811015611305576127108110156112f2576112db6007611f83565b6112f1336001836112ec91906134e9565b611f99565b5b80806112fd90613717565b9150506112bf565b5050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600b8054611340906136b4565b80601f016020809104026020016040519081016040528092919081815260200182805461136c906136b4565b80156113b95780601f1061138e576101008083540402835291602001916113b9565b820191906000526020600020905b81548152906001019060200180831161139c57829003601f168201915b505050505081565b6060600180546113d0906136b4565b80601f01602080910402602001604051908101604052809291908181526020018280546113fc906136b4565b80156114495780601f1061141e57610100808354040283529160200191611449565b820191906000526020600020905b81548152906001019060200180831161142c57829003601f168201915b5050505050905090565b61145b611a87565b73ffffffffffffffffffffffffffffffffffffffff16611479611309565b73ffffffffffffffffffffffffffffffffffffffff16146114cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c690613338565b60405180910390fd5b6114d7610e13565b6114e8576114e3611fb7565b6114f1565b6114f061205a565b5b565b6114fb611a87565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611569576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156090613238565b60405180910390fd5b8060056000611576611a87565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611623611a87565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611668919061313b565b60405180910390a35050565b61168561167f611a87565b83611b83565b6116c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bb906133b8565b60405180910390fd5b6116d0848484846120fc565b50505050565b60606116e182611a1b565b611720576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171790613378565b60405180910390fd5b600061172a612158565b9050600081511161174a5760405180602001604052806000815250611775565b80611754846121ea565b6040516020016117659291906130b0565b6040516020818303038152906040525b915050919050565b611785611a87565b73ffffffffffffffffffffffffffffffffffffffff166117a3611309565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090613338565b60405180910390fd5b600a60009054906101000a900460ff1615600a60006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118c1611a87565b73ffffffffffffffffffffffffffffffffffffffff166118df611309565b73ffffffffffffffffffffffffffffffffffffffff1614611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161192c90613338565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c906131d8565b60405180910390fd5b6119ae81611ebd565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b0283610e2a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000611b626007611f83565b6000611b6e6007611b48565b9050611b7a8382611f99565b80915050919050565b6000611b8e82611a1b565b611bcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bc490613258565b60405180910390fd5b6000611bd883610e2a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c4757508373ffffffffffffffffffffffffffffffffffffffff16611c2f8461082d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c585750611c578185611825565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c8182610e2a565b73ffffffffffffffffffffffffffffffffffffffff1614611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce90613358565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3e90613218565b60405180910390fd5b611d5283838361234b565b611d5d600082611a8f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dad91906135ca565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e0491906134e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b611fb382826040518060200160405280600081525061240e565b5050565b611fbf610e13565b15611fff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff690613278565b60405180910390fd5b6001600660006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612043611a87565b60405161205091906130d4565b60405180910390a1565b612062610e13565b6120a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209890613198565b60405180910390fd5b6000600660006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6120e5611a87565b6040516120f291906130d4565b60405180910390a1565b612107848484611c61565b61211384848484612469565b612152576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612149906131b8565b60405180910390fd5b50505050565b6060600b8054612167906136b4565b80601f0160208091040260200160405190810160405280929190818152602001828054612193906136b4565b80156121e05780601f106121b5576101008083540402835291602001916121e0565b820191906000526020600020905b8154815290600101906020018083116121c357829003601f168201915b5050505050905090565b60606000821415612232576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612346565b600082905060005b6000821461226457808061224d90613717565b915050600a8261225d919061353f565b915061223a565b60008167ffffffffffffffff8111156122805761227f61384d565b5b6040519080825280601f01601f1916602001820160405280156122b25781602001600182028036833780820191505090505b5090505b6000851461233f576001826122cb91906135ca565b9150600a856122da9190613760565b60306122e691906134e9565b60f81b8183815181106122fc576122fb61381e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612338919061353f565b94506122b6565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141580156123bb575061238b611309565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614155b15612409576123c8610e13565b15612408576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123ff90613178565b60405180910390fd5b5b505050565b6124188383612600565b6124256000848484612469565b612464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161245b906131b8565b60405180910390fd5b505050565b600061248a8473ffffffffffffffffffffffffffffffffffffffff166127ce565b156125f3578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124b3611a87565b8786866040518563ffffffff1660e01b81526004016124d594939291906130ef565b602060405180830381600087803b1580156124ef57600080fd5b505af192505050801561252057506040513d601f19601f8201168201806040525081019061251d9190612ca4565b60015b6125a3573d8060008114612550576040519150601f19603f3d011682016040523d82523d6000602084013e612555565b606091505b5060008151141561259b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612592906131b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125f8565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612670576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612667906132f8565b60405180910390fd5b61267981611a1b565b156126b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b0906131f8565b60405180910390fd5b6126c56000838361234b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461271591906134e9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546127ed906136b4565b90600052602060002090601f01602090048101928261280f5760008555612856565b82601f1061282857805160ff1916838001178555612856565b82800160010185558215612856579182015b8281111561285557825182559160200191906001019061283a565b5b5090506128639190612867565b5090565b5b80821115612880576000816000905550600101612868565b5090565b600061289761289284613418565b6133f3565b905080838252602082019050828560208602820111156128ba576128b9613881565b5b60005b858110156128ea57816128d08882612978565b8452602084019350602083019250506001810190506128bd565b5050509392505050565b600061290761290284613444565b6133f3565b90508281526020810184848401111561292357612922613886565b5b61292e848285613672565b509392505050565b600061294961294484613475565b6133f3565b90508281526020810184848401111561296557612964613886565b5b612970848285613672565b509392505050565b60008135905061298781613d9f565b92915050565b600082601f8301126129a2576129a161387c565b5b81356129b2848260208601612884565b91505092915050565b6000813590506129ca81613db6565b92915050565b6000813590506129df81613dcd565b92915050565b6000815190506129f481613dcd565b92915050565b600082601f830112612a0f57612a0e61387c565b5b8135612a1f8482602086016128f4565b91505092915050565b600082601f830112612a3d57612a3c61387c565b5b8135612a4d848260208601612936565b91505092915050565b600081359050612a6581613de4565b92915050565b600060208284031215612a8157612a80613890565b5b6000612a8f84828501612978565b91505092915050565b60008060408385031215612aaf57612aae613890565b5b6000612abd85828601612978565b9250506020612ace85828601612978565b9150509250929050565b600080600060608486031215612af157612af0613890565b5b6000612aff86828701612978565b9350506020612b1086828701612978565b9250506040612b2186828701612a56565b9150509250925092565b60008060008060808587031215612b4557612b44613890565b5b6000612b5387828801612978565b9450506020612b6487828801612978565b9350506040612b7587828801612a56565b925050606085013567ffffffffffffffff811115612b9657612b9561388b565b5b612ba2878288016129fa565b91505092959194509250565b60008060408385031215612bc557612bc4613890565b5b6000612bd385828601612978565b9250506020612be4858286016129bb565b9150509250929050565b60008060408385031215612c0557612c04613890565b5b6000612c1385828601612978565b9250506020612c2485828601612a56565b9150509250929050565b600060208284031215612c4457612c43613890565b5b600082013567ffffffffffffffff811115612c6257612c6161388b565b5b612c6e8482850161298d565b91505092915050565b600060208284031215612c8d57612c8c613890565b5b6000612c9b848285016129d0565b91505092915050565b600060208284031215612cba57612cb9613890565b5b6000612cc8848285016129e5565b91505092915050565b600060208284031215612ce757612ce6613890565b5b600082013567ffffffffffffffff811115612d0557612d0461388b565b5b612d1184828501612a28565b91505092915050565b600060208284031215612d3057612d2f613890565b5b6000612d3e84828501612a56565b91505092915050565b612d50816135fe565b82525050565b612d5f81613610565b82525050565b6000612d70826134a6565b612d7a81856134bc565b9350612d8a818560208601613681565b612d9381613895565b840191505092915050565b6000612da9826134b1565b612db381856134cd565b9350612dc3818560208601613681565b612dcc81613895565b840191505092915050565b6000612de2826134b1565b612dec81856134de565b9350612dfc818560208601613681565b80840191505092915050565b6000612e15602b836134cd565b9150612e20826138a6565b604082019050919050565b6000612e386014836134cd565b9150612e43826138f5565b602082019050919050565b6000612e5b6032836134cd565b9150612e668261391e565b604082019050919050565b6000612e7e6026836134cd565b9150612e898261396d565b604082019050919050565b6000612ea1601c836134cd565b9150612eac826139bc565b602082019050919050565b6000612ec46024836134cd565b9150612ecf826139e5565b604082019050919050565b6000612ee76019836134cd565b9150612ef282613a34565b602082019050919050565b6000612f0a602c836134cd565b9150612f1582613a5d565b604082019050919050565b6000612f2d6010836134cd565b9150612f3882613aac565b602082019050919050565b6000612f506038836134cd565b9150612f5b82613ad5565b604082019050919050565b6000612f73602a836134cd565b9150612f7e82613b24565b604082019050919050565b6000612f966029836134cd565b9150612fa182613b73565b604082019050919050565b6000612fb96020836134cd565b9150612fc482613bc2565b602082019050919050565b6000612fdc602c836134cd565b9150612fe782613beb565b604082019050919050565b6000612fff6020836134cd565b915061300a82613c3a565b602082019050919050565b60006130226029836134cd565b915061302d82613c63565b604082019050919050565b6000613045602f836134cd565b915061305082613cb2565b604082019050919050565b60006130686021836134cd565b915061307382613d01565b604082019050919050565b600061308b6031836134cd565b915061309682613d50565b604082019050919050565b6130aa81613668565b82525050565b60006130bc8285612dd7565b91506130c88284612dd7565b91508190509392505050565b60006020820190506130e96000830184612d47565b92915050565b60006080820190506131046000830187612d47565b6131116020830186612d47565b61311e60408301856130a1565b81810360608301526131308184612d65565b905095945050505050565b60006020820190506131506000830184612d56565b92915050565b600060208201905081810360008301526131708184612d9e565b905092915050565b6000602082019050818103600083015261319181612e08565b9050919050565b600060208201905081810360008301526131b181612e2b565b9050919050565b600060208201905081810360008301526131d181612e4e565b9050919050565b600060208201905081810360008301526131f181612e71565b9050919050565b6000602082019050818103600083015261321181612e94565b9050919050565b6000602082019050818103600083015261323181612eb7565b9050919050565b6000602082019050818103600083015261325181612eda565b9050919050565b6000602082019050818103600083015261327181612efd565b9050919050565b6000602082019050818103600083015261329181612f20565b9050919050565b600060208201905081810360008301526132b181612f43565b9050919050565b600060208201905081810360008301526132d181612f66565b9050919050565b600060208201905081810360008301526132f181612f89565b9050919050565b6000602082019050818103600083015261331181612fac565b9050919050565b6000602082019050818103600083015261333181612fcf565b9050919050565b6000602082019050818103600083015261335181612ff2565b9050919050565b6000602082019050818103600083015261337181613015565b9050919050565b6000602082019050818103600083015261339181613038565b9050919050565b600060208201905081810360008301526133b18161305b565b9050919050565b600060208201905081810360008301526133d18161307e565b9050919050565b60006020820190506133ed60008301846130a1565b92915050565b60006133fd61340e565b905061340982826136e6565b919050565b6000604051905090565b600067ffffffffffffffff8211156134335761343261384d565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561345f5761345e61384d565b5b61346882613895565b9050602081019050919050565b600067ffffffffffffffff8211156134905761348f61384d565b5b61349982613895565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006134f482613668565b91506134ff83613668565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561353457613533613791565b5b828201905092915050565b600061354a82613668565b915061355583613668565b925082613565576135646137c0565b5b828204905092915050565b600061357b82613668565b915061358683613668565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156135bf576135be613791565b5b828202905092915050565b60006135d582613668565b91506135e083613668565b9250828210156135f3576135f2613791565b5b828203905092915050565b600061360982613648565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561369f578082015181840152602081019050613684565b838111156136ae576000848401525b50505050565b600060028204905060018216806136cc57607f821691505b602082108114156136e0576136df6137ef565b5b50919050565b6136ef82613895565b810181811067ffffffffffffffff8211171561370e5761370d61384d565b5b80604052505050565b600061372282613668565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561375557613754613791565b5b600182019050919050565b600061376b82613668565b915061377683613668565b925082613786576137856137c0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b613da8816135fe565b8114613db357600080fd5b50565b613dbf81613610565b8114613dca57600080fd5b50565b613dd68161361c565b8114613de157600080fd5b50565b613ded81613668565b8114613df857600080fd5b5056fea2646970667358221220b8ab8f996d13a0008cbdc0417bd85eba3d29406efe089e7e49f3557f5218f4bc64736f6c63430008060033

Deployed Bytecode Sourcemap

38200:3630:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19623:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20568:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22127:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21650:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39527:598;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39077:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38487:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23017:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39183:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41304:120;;;:::i;:::-;;23427:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40133:382;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38976:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32733:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20262:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19992:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37571:94;;;;;;;;;;;;;:::i;:::-;;40825:84;;;;;;;;;;;;;:::i;:::-;;39297:222;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41024:272;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36920:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38749:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20737:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40917:99;;;;;;;;;;;;;:::i;:::-;;22420:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23683:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20912:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40724: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;:::-;21720:341;21650:411;;:::o;39527:598::-;38427:2;39603:6;:18;;39595:27;;;;;;38479:1;39641:6;:25;;39633:34;;;;;;39686:25;39700:10;39686:13;:25::i;:::-;39678:34;;;;;;38520:17;39744:6;:15;;;;:::i;:::-;39731:9;:28;;39723:37;;;;;;38479:1;39807:6;39779:13;:25;39793:10;39779:25;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:53;;39771:62;;;;;;39852:14;;;;;;;;;;;39844:23;;;;;;39880:19;39902;:9;:17;:19::i;:::-;39880:41;;38379:5;39954:6;39940:11;:20;;;;:::i;:::-;:34;;39932:43;;;;;;39993:9;39988:130;40012:6;40008:1;:10;39988:130;;;40069:1;40040:13;:25;40054:10;40040:25;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;40085:21;40095:10;40085:9;:21::i;:::-;;40020:3;;;;;:::i;:::-;;;;39988:130;;;;39584:541;39527:598;:::o;39077:98::-;39121:7;39148:19;:9;:17;:19::i;:::-;39141:26;;39077:98;:::o;38487:50::-;38520:17;38487: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;39183:106::-;39241:4;39265:10;:16;39276:4;39265:16;;;;;;;;;;;;;;;;;;;;;;;;;39258:23;;39183:106;;;:::o;41304:120::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41376:10:::1;41368:24;;:47;41393:21;41368:47;;;;;;;;;;;;;;;;;;;;;;;41360:56;;;::::0;::::1;;41304:120::o:0;23427:185::-;23565:39;23582:4;23588:2;23592:7;23565:39;;;;;;;;;;;;:16;:39::i;:::-;23427:185;;;:::o;40133:382::-;38427:2;40202:6;:18;;40194:27;;;;;;40240:11;;;;;;;;;;;40232:20;;;;;;40265:19;40287;:9;:17;:19::i;:::-;40265:41;;38379:5;40339:6;40325:11;:20;;;;:::i;:::-;:34;;40317:43;;;;;;38520:17;40394:6;:15;;;;:::i;:::-;40381:9;:28;;40373:37;;;;;;40428:9;40423:85;40447:6;40443:1;:10;40423:85;;;40475:21;40485:10;40475:9;:21::i;:::-;;40455:3;;;;;:::i;:::-;;;;40423:85;;;;40183:332;40133:382;:::o;38976:93::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39057:4:::1;39044:10;:17;;;;;;;;;;;;:::i;:::-;;38976: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;40825:84::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40890:11:::1;;;;;;;;;;;40889:12;40875:11;;:26;;;;;;;;;;;;;;;;;;40825:84::o:0;39297:222::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39378:9:::1;39373:139;39397:5;:12;39393:1;:16;39373:139;;;39454:4;39431:10;:20;39442:5;39448:1;39442:8;;;;;;;;:::i;:::-;;;;;;;;39431:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;39499:1;39473:13;:23;39487:5;39493:1;39487:8;;;;;;;;:::i;:::-;;;;;;;;39473:23;;;;;;;;;;;;;;;:27;;;;39411:3;;;;;:::i;:::-;;;;39373:139;;;;39297:222:::0;:::o;41024:272::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41091:6:::1;41100:19;:9;:17;:19::i;:::-;41091:28;;41087:202;41125:8;41121:1;:12;41087:202;;;38379:5;41159:1;:14;41155:123;;;41194:21;:9;:19;:21::i;:::-;41234:28;41244:10;41260:1;41256;:5;;;;:::i;:::-;41234:9;:28::i;:::-;41155:123;41135:3;;;;;:::i;:::-;;;;41087:202;;;;41024:272:::0;:::o;36920:87::-;36966:7;36993:6;;;;;;;;;;;36986:13;;36920:87;:::o;38749:24::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20737:104::-;20793:13;20826:7;20819:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20737:104;:::o;40917:99::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40976:8:::1;:6;:8::i;:::-;:32;;41000:8;:6;:8::i;:::-;40976:32;;;40987:10;:8;:10::i;:::-;40976:32;40917: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;40724:93::-;37151:12;:10;:12::i;:::-;37140:23;;:7;:5;:7::i;:::-;:23;;;37132:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40795:14:::1;;;;;;;;;;;40794:15;40777:14;;:32;;;;;;;;;;;;;;;;;;40724: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;40523:193::-;40572:7;40592:21;:9;:19;:21::i;:::-;40626:10;40639:19;:9;:17;:19::i;:::-;40626:32;;40669:17;40679:2;40683;40669:9;:17::i;:::-;40706:2;40699:9;;;40523: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;;;;;;;;;;;;38065:128;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;38865:103::-;38917:13;38950:10;38943:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38865: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;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;16445:2;16436:11;;;;;:::i;:::-;;;16305:154;;;16483:6;16469:21;;;;;15775:723;;;;:::o;41535:292::-;41701:1;41685:18;;:4;:18;;;41683:21;:43;;;;;41718:7;:5;:7::i;:::-;41710:15;;:4;:15;;;41708:18;41683:43;41679:141;;;41752:8;:6;:8::i;:::-;41751:9;41743:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41679:141;41535: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:722: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;;;404:79;;:::i;:::-;350:2;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:2;;;1025:79;;:::i;:::-;994:2;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:2;;;1443:79;;:::i;:::-;1412:2;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1638:87;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:2;;1876:79;;:::i;:::-;1835:2;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2173:84;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2314:86;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2468:79;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:2;;2678:79;;:::i;:::-;2637:2;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:2;;3037:79;;:::i;:::-;2996:2;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3322:87;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:2;;;3529:79;;:::i;:::-;3491:2;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3481:263;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:2;;;3881:79;;:::i;:::-;3843:2;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3833:391;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:2;;;4378:79;;:::i;:::-;4340:2;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4330:519;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:2;;;5030:79;;:::i;:::-;4991:2;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:2;;;5614:79;;:::i;:::-;5578:2;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4981:817;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5932:79;;:::i;:::-;5894:2;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5884:388;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:2;;;6409:79;;:::i;:::-;6371:2;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6361:391;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:2;;;6897:79;;:::i;:::-;6859:2;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:2;;;7097:79;;:::i;:::-;7061:2;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6849:448;;;;:::o;7303:327::-;7361:6;7410:2;7398:9;7389:7;7385:23;7381:32;7378:2;;;7416:79;;:::i;:::-;7378:2;7536:1;7561:52;7605:7;7596:6;7585:9;7581:22;7561:52;:::i;:::-;7551:62;;7507:116;7368:262;;;;:::o;7636:349::-;7705:6;7754:2;7742:9;7733:7;7729:23;7725:32;7722:2;;;7760:79;;:::i;:::-;7722:2;7880:1;7905:63;7960:7;7951:6;7940:9;7936:22;7905:63;:::i;:::-;7895:73;;7851:127;7712:273;;;;:::o;7991:509::-;8060:6;8109:2;8097:9;8088:7;8084:23;8080:32;8077:2;;;8115:79;;:::i;:::-;8077:2;8263:1;8252:9;8248:17;8235:31;8293:18;8285:6;8282:30;8279:2;;;8315:79;;:::i;:::-;8279:2;8420:63;8475:7;8466:6;8455:9;8451:22;8420:63;:::i;:::-;8410:73;;8206:287;8067:433;;;;:::o;8506:329::-;8565:6;8614:2;8602:9;8593:7;8589:23;8585:32;8582:2;;;8620:79;;:::i;:::-;8582:2;8740:1;8765:53;8810:7;8801:6;8790:9;8786:22;8765:53;:::i;:::-;8755:63;;8711:117;8572:263;;;;:::o;8841:118::-;8928:24;8946:5;8928:24;:::i;:::-;8923:3;8916:37;8906:53;;:::o;8965:109::-;9046:21;9061:5;9046:21;:::i;:::-;9041:3;9034:34;9024:50;;:::o;9080:360::-;9166:3;9194:38;9226:5;9194:38;:::i;:::-;9248:70;9311:6;9306:3;9248:70;:::i;:::-;9241:77;;9327:52;9372:6;9367:3;9360:4;9353:5;9349:16;9327:52;:::i;:::-;9404:29;9426:6;9404:29;:::i;:::-;9399:3;9395:39;9388:46;;9170:270;;;;;:::o;9446:364::-;9534:3;9562:39;9595:5;9562:39;:::i;:::-;9617:71;9681:6;9676:3;9617:71;:::i;:::-;9610:78;;9697:52;9742:6;9737:3;9730:4;9723:5;9719:16;9697:52;:::i;:::-;9774:29;9796:6;9774:29;:::i;:::-;9769:3;9765:39;9758:46;;9538:272;;;;;:::o;9816:377::-;9922:3;9950:39;9983:5;9950:39;:::i;:::-;10005:89;10087:6;10082:3;10005:89;:::i;:::-;9998:96;;10103:52;10148:6;10143:3;10136:4;10129:5;10125:16;10103:52;:::i;:::-;10180:6;10175:3;10171:16;10164:23;;9926:267;;;;;:::o;10199:366::-;10341:3;10362:67;10426:2;10421:3;10362:67;:::i;:::-;10355:74;;10438:93;10527:3;10438:93;:::i;:::-;10556:2;10551:3;10547:12;10540:19;;10345:220;;;:::o;10571:366::-;10713:3;10734:67;10798:2;10793:3;10734:67;:::i;:::-;10727:74;;10810:93;10899:3;10810:93;:::i;:::-;10928:2;10923:3;10919:12;10912:19;;10717:220;;;:::o;10943:366::-;11085:3;11106:67;11170:2;11165:3;11106:67;:::i;:::-;11099:74;;11182:93;11271:3;11182:93;:::i;:::-;11300:2;11295:3;11291:12;11284:19;;11089:220;;;:::o;11315:366::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11461:220;;;:::o;11687:366::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11833:220;;;:::o;12059:366::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12205:220;;;:::o;12431:366::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12577:220;;;:::o;12803:366::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12949:220;;;:::o;13175:366::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13321:220;;;:::o;13547:366::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13693:220;;;:::o;13919:366::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;14065:220;;;:::o;14291:366::-;14433:3;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14530:93;14619:3;14530:93;:::i;:::-;14648:2;14643:3;14639:12;14632:19;;14437:220;;;:::o;14663:366::-;14805:3;14826:67;14890:2;14885:3;14826:67;:::i;:::-;14819:74;;14902:93;14991:3;14902:93;:::i;:::-;15020:2;15015:3;15011:12;15004:19;;14809:220;;;:::o;15035:366::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15181:220;;;:::o;15407:366::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15553:220;;;:::o;15779:366::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15925:220;;;:::o;16151:366::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16297:220;;;:::o;16523:366::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16669:220;;;:::o;16895:366::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;17041:220;;;:::o;17267:118::-;17354:24;17372:5;17354:24;:::i;:::-;17349:3;17342:37;17332:53;;:::o;17391:435::-;17571:3;17593:95;17684:3;17675:6;17593:95;:::i;:::-;17586:102;;17705:95;17796:3;17787:6;17705:95;:::i;:::-;17698:102;;17817:3;17810:10;;17575:251;;;;;:::o;17832:222::-;17925:4;17963:2;17952:9;17948:18;17940:26;;17976:71;18044:1;18033:9;18029:17;18020:6;17976:71;:::i;:::-;17930:124;;;;:::o;18060:640::-;18255:4;18293:3;18282:9;18278:19;18270:27;;18307:71;18375:1;18364:9;18360:17;18351:6;18307:71;:::i;:::-;18388:72;18456:2;18445:9;18441:18;18432:6;18388:72;:::i;:::-;18470;18538:2;18527:9;18523:18;18514:6;18470:72;:::i;:::-;18589:9;18583:4;18579:20;18574:2;18563:9;18559:18;18552:48;18617:76;18688:4;18679:6;18617:76;:::i;:::-;18609:84;;18260:440;;;;;;;:::o;18706:210::-;18793:4;18831:2;18820:9;18816:18;18808:26;;18844:65;18906:1;18895:9;18891:17;18882:6;18844:65;:::i;:::-;18798:118;;;;:::o;18922:313::-;19035:4;19073:2;19062:9;19058:18;19050:26;;19122:9;19116:4;19112:20;19108:1;19097:9;19093:17;19086:47;19150:78;19223:4;19214:6;19150:78;:::i;:::-;19142:86;;19040:195;;;;:::o;19241:419::-;19407:4;19445:2;19434:9;19430:18;19422:26;;19494:9;19488:4;19484:20;19480:1;19469:9;19465:17;19458:47;19522:131;19648:4;19522:131;:::i;:::-;19514:139;;19412:248;;;:::o;19666:419::-;19832:4;19870:2;19859:9;19855:18;19847:26;;19919:9;19913:4;19909:20;19905:1;19894:9;19890:17;19883:47;19947:131;20073:4;19947:131;:::i;:::-;19939:139;;19837:248;;;:::o;20091:419::-;20257:4;20295:2;20284:9;20280:18;20272:26;;20344:9;20338:4;20334:20;20330:1;20319:9;20315:17;20308:47;20372:131;20498:4;20372:131;:::i;:::-;20364:139;;20262:248;;;:::o;20516:419::-;20682:4;20720:2;20709:9;20705:18;20697:26;;20769:9;20763:4;20759:20;20755:1;20744:9;20740:17;20733:47;20797:131;20923:4;20797:131;:::i;:::-;20789:139;;20687:248;;;:::o;20941:419::-;21107:4;21145:2;21134:9;21130:18;21122:26;;21194:9;21188:4;21184:20;21180:1;21169:9;21165:17;21158:47;21222:131;21348:4;21222:131;:::i;:::-;21214:139;;21112:248;;;:::o;21366:419::-;21532:4;21570:2;21559:9;21555:18;21547:26;;21619:9;21613:4;21609:20;21605:1;21594:9;21590:17;21583:47;21647:131;21773:4;21647:131;:::i;:::-;21639:139;;21537:248;;;:::o;21791:419::-;21957:4;21995:2;21984:9;21980:18;21972:26;;22044:9;22038:4;22034:20;22030:1;22019:9;22015:17;22008:47;22072:131;22198:4;22072:131;:::i;:::-;22064:139;;21962:248;;;:::o;22216:419::-;22382:4;22420:2;22409:9;22405:18;22397:26;;22469:9;22463:4;22459:20;22455:1;22444:9;22440:17;22433:47;22497:131;22623:4;22497:131;:::i;:::-;22489:139;;22387:248;;;:::o;22641:419::-;22807:4;22845:2;22834:9;22830:18;22822:26;;22894:9;22888:4;22884:20;22880:1;22869:9;22865:17;22858:47;22922:131;23048:4;22922:131;:::i;:::-;22914:139;;22812:248;;;:::o;23066:419::-;23232:4;23270:2;23259:9;23255:18;23247:26;;23319:9;23313:4;23309:20;23305:1;23294:9;23290:17;23283:47;23347:131;23473:4;23347:131;:::i;:::-;23339:139;;23237:248;;;:::o;23491:419::-;23657:4;23695:2;23684:9;23680:18;23672:26;;23744:9;23738:4;23734:20;23730:1;23719:9;23715:17;23708:47;23772:131;23898:4;23772:131;:::i;:::-;23764:139;;23662:248;;;:::o;23916:419::-;24082:4;24120:2;24109:9;24105:18;24097:26;;24169:9;24163:4;24159:20;24155:1;24144:9;24140:17;24133:47;24197:131;24323:4;24197:131;:::i;:::-;24189:139;;24087:248;;;:::o;24341:419::-;24507:4;24545:2;24534:9;24530:18;24522:26;;24594:9;24588:4;24584:20;24580:1;24569:9;24565:17;24558:47;24622:131;24748:4;24622:131;:::i;:::-;24614:139;;24512:248;;;:::o;24766:419::-;24932:4;24970:2;24959:9;24955:18;24947:26;;25019:9;25013:4;25009:20;25005:1;24994:9;24990:17;24983:47;25047:131;25173:4;25047:131;:::i;:::-;25039:139;;24937:248;;;:::o;25191:419::-;25357:4;25395:2;25384:9;25380:18;25372:26;;25444:9;25438:4;25434:20;25430:1;25419:9;25415:17;25408:47;25472:131;25598:4;25472:131;:::i;:::-;25464:139;;25362:248;;;:::o;25616:419::-;25782:4;25820:2;25809:9;25805:18;25797:26;;25869:9;25863:4;25859:20;25855:1;25844:9;25840:17;25833:47;25897:131;26023:4;25897:131;:::i;:::-;25889:139;;25787:248;;;:::o;26041:419::-;26207:4;26245:2;26234:9;26230:18;26222:26;;26294:9;26288:4;26284:20;26280:1;26269:9;26265:17;26258:47;26322:131;26448:4;26322:131;:::i;:::-;26314:139;;26212:248;;;:::o;26466:419::-;26632:4;26670:2;26659:9;26655:18;26647:26;;26719:9;26713:4;26709:20;26705:1;26694:9;26690:17;26683:47;26747:131;26873:4;26747:131;:::i;:::-;26739:139;;26637:248;;;:::o;26891:419::-;27057:4;27095:2;27084:9;27080:18;27072:26;;27144:9;27138:4;27134:20;27130:1;27119:9;27115:17;27108:47;27172:131;27298:4;27172:131;:::i;:::-;27164:139;;27062:248;;;:::o;27316:222::-;27409:4;27447:2;27436:9;27432:18;27424:26;;27460:71;27528:1;27517:9;27513:17;27504:6;27460:71;:::i;:::-;27414:124;;;;:::o;27544:129::-;27578:6;27605:20;;:::i;:::-;27595:30;;27634:33;27662:4;27654:6;27634:33;:::i;:::-;27585:88;;;:::o;27679:75::-;27712:6;27745:2;27739:9;27729:19;;27719:35;:::o;27760:311::-;27837:4;27927:18;27919:6;27916:30;27913:2;;;27949:18;;:::i;:::-;27913:2;27999:4;27991:6;27987:17;27979:25;;28059:4;28053;28049:15;28041:23;;27842:229;;;:::o;28077:307::-;28138:4;28228:18;28220:6;28217:30;28214:2;;;28250:18;;:::i;:::-;28214:2;28288:29;28310:6;28288:29;:::i;:::-;28280:37;;28372:4;28366;28362:15;28354:23;;28143:241;;;:::o;28390:308::-;28452:4;28542:18;28534:6;28531:30;28528:2;;;28564:18;;:::i;:::-;28528:2;28602:29;28624:6;28602:29;:::i;:::-;28594:37;;28686:4;28680;28676:15;28668:23;;28457:241;;;:::o;28704:98::-;28755:6;28789:5;28783:12;28773:22;;28762:40;;;:::o;28808:99::-;28860:6;28894:5;28888:12;28878:22;;28867:40;;;:::o;28913:168::-;28996:11;29030:6;29025:3;29018:19;29070:4;29065:3;29061:14;29046:29;;29008:73;;;;:::o;29087:169::-;29171:11;29205:6;29200:3;29193:19;29245:4;29240:3;29236:14;29221:29;;29183:73;;;;:::o;29262:148::-;29364:11;29401:3;29386:18;;29376:34;;;;:::o;29416:305::-;29456:3;29475:20;29493:1;29475:20;:::i;:::-;29470:25;;29509:20;29527:1;29509:20;:::i;:::-;29504:25;;29663:1;29595:66;29591:74;29588:1;29585:81;29582:2;;;29669:18;;:::i;:::-;29582:2;29713:1;29710;29706:9;29699:16;;29460:261;;;;:::o;29727:185::-;29767:1;29784:20;29802:1;29784:20;:::i;:::-;29779:25;;29818:20;29836:1;29818:20;:::i;:::-;29813:25;;29857:1;29847:2;;29862:18;;:::i;:::-;29847:2;29904:1;29901;29897:9;29892:14;;29769:143;;;;:::o;29918:348::-;29958:7;29981:20;29999:1;29981:20;:::i;:::-;29976:25;;30015:20;30033:1;30015:20;:::i;:::-;30010:25;;30203:1;30135:66;30131:74;30128:1;30125:81;30120:1;30113:9;30106:17;30102:105;30099:2;;;30210:18;;:::i;:::-;30099:2;30258:1;30255;30251:9;30240:20;;29966:300;;;;:::o;30272:191::-;30312:4;30332:20;30350:1;30332:20;:::i;:::-;30327:25;;30366:20;30384:1;30366:20;:::i;:::-;30361:25;;30405:1;30402;30399:8;30396:2;;;30410:18;;:::i;:::-;30396:2;30455:1;30452;30448:9;30440:17;;30317:146;;;;:::o;30469:96::-;30506:7;30535:24;30553:5;30535:24;:::i;:::-;30524:35;;30514:51;;;:::o;30571:90::-;30605:7;30648:5;30641:13;30634:21;30623:32;;30613:48;;;:::o;30667:149::-;30703:7;30743:66;30736:5;30732:78;30721:89;;30711:105;;;:::o;30822:126::-;30859:7;30899:42;30892:5;30888:54;30877:65;;30867:81;;;:::o;30954:77::-;30991:7;31020:5;31009:16;;30999:32;;;:::o;31037:154::-;31121:6;31116:3;31111;31098:30;31183:1;31174:6;31169:3;31165:16;31158:27;31088:103;;;:::o;31197:307::-;31265:1;31275:113;31289:6;31286:1;31283:13;31275:113;;;31374:1;31369:3;31365:11;31359:18;31355:1;31350:3;31346:11;31339:39;31311:2;31308:1;31304:10;31299:15;;31275:113;;;31406:6;31403:1;31400:13;31397:2;;;31486:1;31477:6;31472:3;31468:16;31461:27;31397:2;31246:258;;;;:::o;31510:320::-;31554:6;31591:1;31585:4;31581:12;31571:22;;31638:1;31632:4;31628:12;31659:18;31649:2;;31715:4;31707:6;31703:17;31693:27;;31649:2;31777;31769:6;31766:14;31746:18;31743:38;31740:2;;;31796:18;;:::i;:::-;31740:2;31561:269;;;;:::o;31836:281::-;31919:27;31941:4;31919:27;:::i;:::-;31911:6;31907:40;32049:6;32037:10;32034:22;32013:18;32001:10;31998:34;31995:62;31992:2;;;32060:18;;:::i;:::-;31992:2;32100:10;32096:2;32089:22;31879:238;;;:::o;32123:233::-;32162:3;32185:24;32203:5;32185:24;:::i;:::-;32176:33;;32231:66;32224:5;32221:77;32218:2;;;32301:18;;:::i;:::-;32218:2;32348:1;32341:5;32337:13;32330:20;;32166:190;;;:::o;32362:176::-;32394:1;32411:20;32429:1;32411:20;:::i;:::-;32406:25;;32445:20;32463:1;32445:20;:::i;:::-;32440:25;;32484:1;32474:2;;32489:18;;:::i;:::-;32474:2;32530:1;32527;32523:9;32518:14;;32396:142;;;;:::o;32544:180::-;32592:77;32589:1;32582:88;32689:4;32686:1;32679:15;32713:4;32710:1;32703:15;32730:180;32778:77;32775:1;32768:88;32875:4;32872:1;32865:15;32899:4;32896:1;32889:15;32916:180;32964:77;32961:1;32954:88;33061:4;33058:1;33051:15;33085:4;33082:1;33075:15;33102:180;33150:77;33147:1;33140:88;33247:4;33244:1;33237:15;33271:4;33268:1;33261:15;33288:180;33336:77;33333:1;33326:88;33433:4;33430:1;33423:15;33457:4;33454:1;33447:15;33474:117;33583:1;33580;33573:12;33597:117;33706:1;33703;33696:12;33720:117;33829:1;33826;33819:12;33843:117;33952:1;33949;33942:12;33966:117;34075:1;34072;34065:12;34089:102;34130:6;34181:2;34177:7;34172:2;34165:5;34161:14;34157:28;34147:38;;34137:54;;;:::o;34197:230::-;34337:34;34333:1;34325:6;34321:14;34314:58;34406:13;34401:2;34393:6;34389:15;34382:38;34303:124;:::o;34433:170::-;34573:22;34569:1;34561:6;34557:14;34550:46;34539:64;:::o;34609:237::-;34749:34;34745:1;34737:6;34733:14;34726:58;34818:20;34813:2;34805:6;34801:15;34794:45;34715:131;:::o;34852:225::-;34992:34;34988:1;34980:6;34976:14;34969:58;35061:8;35056:2;35048:6;35044:15;35037:33;34958:119;:::o;35083:178::-;35223:30;35219:1;35211:6;35207:14;35200:54;35189:72;:::o;35267:223::-;35407:34;35403:1;35395:6;35391:14;35384:58;35476:6;35471:2;35463:6;35459:15;35452:31;35373:117;:::o;35496:175::-;35636:27;35632:1;35624:6;35620:14;35613:51;35602:69;:::o;35677:231::-;35817:34;35813:1;35805:6;35801:14;35794:58;35886:14;35881:2;35873:6;35869:15;35862:39;35783:125;:::o;35914:166::-;36054:18;36050:1;36042:6;36038:14;36031:42;36020:60;:::o;36086:243::-;36226:34;36222:1;36214:6;36210:14;36203:58;36295:26;36290:2;36282:6;36278:15;36271:51;36192:137;:::o;36335:229::-;36475:34;36471:1;36463:6;36459:14;36452:58;36544:12;36539:2;36531:6;36527:15;36520:37;36441:123;:::o;36570:228::-;36710:34;36706:1;36698:6;36694:14;36687:58;36779:11;36774:2;36766:6;36762:15;36755:36;36676:122;:::o;36804:182::-;36944:34;36940:1;36932:6;36928:14;36921:58;36910:76;:::o;36992:231::-;37132:34;37128:1;37120:6;37116:14;37109:58;37201:14;37196:2;37188:6;37184:15;37177:39;37098:125;:::o;37229:182::-;37369:34;37365:1;37357:6;37353:14;37346:58;37335:76;:::o;37417:228::-;37557:34;37553:1;37545:6;37541:14;37534:58;37626:11;37621:2;37613:6;37609:15;37602:36;37523:122;:::o;37651:234::-;37791:34;37787:1;37779:6;37775:14;37768:58;37860:17;37855:2;37847:6;37843:15;37836:42;37757:128;:::o;37891:220::-;38031:34;38027:1;38019:6;38015:14;38008:58;38100:3;38095:2;38087:6;38083:15;38076:28;37997:114;:::o;38117:236::-;38257:34;38253:1;38245:6;38241:14;38234:58;38326:19;38321:2;38313:6;38309:15;38302:44;38223:130;:::o;38359:122::-;38432:24;38450:5;38432:24;:::i;:::-;38425:5;38422:35;38412:2;;38471:1;38468;38461:12;38412:2;38402:79;:::o;38487:116::-;38557:21;38572:5;38557:21;:::i;:::-;38550:5;38547:32;38537:2;;38593:1;38590;38583:12;38537:2;38527:76;:::o;38609:120::-;38681:23;38698:5;38681:23;:::i;:::-;38674:5;38671:34;38661:2;;38719:1;38716;38709:12;38661:2;38651:78;:::o;38735:122::-;38808:24;38826:5;38808:24;:::i;:::-;38801:5;38798:35;38788:2;;38847:1;38844;38837:12;38788:2;38778:79;:::o

Swarm Source

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