ETH Price: $3,299.01 (-3.70%)
Gas: 8 Gwei

Token

BLOCKRUNRS_NFT (RUNR)
 

Overview

Max Total Supply

385 RUNR

Holders

189

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
catnipog.eth
Balance
1 RUNR
0xc7bee8b29ed83c5fb355ab65eb04d7901f85ba4c
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:
BLOCKRUNRS_NFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-25
*/

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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

abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

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

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

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

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

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.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 {}
}

abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface IVersion {
    /**
     * @dev Returns version based on semantic versioning format.
     */
    function version() external pure returns (string memory);
}

contract FlexPaymentDivider is Ownable, IVersion {
    using Address for address payable;

    uint256 private _recipientCount;
    mapping(uint256 => address payable) private _recipientsById;
    mapping(address => uint256) private _percentagesByRecipient;
    mapping(address => uint256) private _balancesByRecipient;
    mapping(address => uint256) private _changeByRecipient;
    // 0 = false, 1 = true
    mapping(address => uint8) private _isWithdrawingByAccount;

    /**
     * @notice Sets recipients and the percentage of each deposit sent to them.
     * @dev {_setupRecipients} is only used once--here, upon deployment.
     * @param recipients_ Accounts to receive percentage of deposits.
     * @param percentages_ Percentage of deposit each account should receive.
     * Order matters.
     */
    constructor(
        address payable[] memory recipients_,
        uint256[] memory percentages_
    ) {
        _setupRecipients(recipients_, percentages_);
    }

    function version() external pure override returns (string memory) {
        return "1.0.0";
    }

    /**
     * @notice Returns the number of recipients each deposit is divided by.
     * @return Number of recipients.
     */
    function recipientCount() public view returns (uint256) {
        return _recipientCount;
    }

    /**
     * @notice Returns recipient with the given id.
     * @param id Integer.
     * @return Ethereum account address.
     */
    function recipientById(uint256 id) public view returns (address) {
        return _recipientsById[id];
    }

    /**
     * @notice Returns the percentage of each deposit the recipient receives.
     * @param recipient Ethereum account address.
     * @return Amount of 100.
     */
    function percentage(address recipient) public view returns (uint256) {
        return _percentagesByRecipient[recipient];
    }

    /**
     * @notice Returns the balance the recipient has accumulated.
     * @param recipient Ethereum account address.
     * @return Amount of wei.
     */
    function accumulatedBalance(address recipient) public view returns (uint256) {
        return _balancesByRecipient[recipient];
    }

    /**
     * @notice Returns the amount of change the recipient has accumulated.
     * @param recipient Ethereum account address.
     * @return Fraction of wei as an amount out of 100.
     */
    function accumulatedChange(address recipient) public view returns (uint256) {
        return _changeByRecipient[recipient];
    }

    /**
     * @notice Increases balance for each recipient by their designated
     * percenatage of the Ether sent with this call.
     * @custom:require Caller must be owner.
     * @custom:require Message value must be greater than 0.
     * @dev Solidity rounds towards zero so we accumulate change here that is
     * transferred once it exceeds a fractional amount of wei.
     *
     * @custom:warning
     * ===============
     * Forwarding all gas opens the door to reentrancy vulnerabilities. Make
     * sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     */
    function deposit() public payable onlyOwner {
        require(
            msg.value > 0,
            "FlexPaymentDivider: Insufficient message value"
        );
        for (uint256 i = 0; i < _recipientCount; i++) {
            address payable recipient = _recipientsById[i];
            uint256 change = (msg.value * _percentagesByRecipient[recipient]) % 100;
            uint256 amount = (msg.value * _percentagesByRecipient[recipient]) / 100;
            uint256 totalChange = _changeByRecipient[recipient] + change;
            _changeByRecipient[recipient] = totalChange;
            if (totalChange >= 100) {
                _changeByRecipient[recipient] = totalChange % 100;
                amount += (totalChange / 100);
            }
            _balancesByRecipient[recipient] += amount;
        }
    }

    /**
     * @notice Transfers to each recipient their designated percenatage of the
     * Ether held by this contract.
     * @custom:require Caller must be owner.
     *
     * @custom:warning
     * ===============
     * A denial of service attack is possible if any of the recipients revert.
     * The {withdraw} method can be used in the event of this attack.
     *
     * @custom:warning
     * ===============
     * Forwarding all gas opens the door to reentrancy vulnerabilities. Make
     * sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     */
    function disperse() public onlyOwner {
        for (uint256 i = 0; i < _recipientCount; i++) {
            address payable recipient = _recipientsById[i];
            withdraw(recipient);
        }
    }

    /**
     * @notice Transfers to recipient their designated percentage of the Ether
     * held in this contract.
     * @custom:require Caller must not already be withdrawing.
     * @custom:require Balance to withdraw must be above 0.
     *
     * @custom:warning
     * ===============
     * Forwarding all gas opens the door to reentrancy vulnerabilities. Make
     * sure you trust the recipient, or are either following the
     * checks-effects-interactions pattern or using {ReentrancyGuard}.
     */
    function withdraw(address payable recipient) public {
        require(
            !isWithdrawing(_msgSender()),
            "FlexPaymentDivider: Can not reenter"
        );
        _isWithdrawingByAccount[_msgSender()] = 1;

        uint256 amount = _balancesByRecipient[recipient];
        // IMPORTANT: Do not revert here so `disperse` can not have DoS when a
        // recipient does not yet have a balance to withdraw.
        if (amount > 0) {
            _balancesByRecipient[recipient] = 0;
            recipient.sendValue(amount);
        }

        _isWithdrawingByAccount[_msgSender()] = 0;
    }

    /* INTERNAL */

    /**
     * @dev Sets mappings for recipients and respective percentages.
     * This method is only used once in the constructor. Recipients and
     * percentages can not be modified after deployment.
     * @custom:require Input lengths must be equal. Order matters.
     * @custom:require Each percentage must be above 0 and below 100.
     * @custom:require The sum of all percentages must be 100.
     * @param recipients_ Account addresses receiving a percentage of deposited
     * funds.
     * @param percentages_ Amounts for accounts at the same index in the
     * {recipients} parameter to allocate from deposited funds.
     *
     * @custom:warning
     * ===============
     * Recipient accounts should be trusted.
     */
    function _setupRecipients(
        address payable[] memory recipients_,
        uint256[] memory percentages_
    ) internal {
        require(
            recipients_.length == percentages_.length,
            "FlexPaymentDivider: Unequal input lengths"
        );
        uint256 sum = 0;
        for (uint256 i = 0; i < recipients_.length; i++) {
            require(
                percentages_[i] > 0,
                "FlexPaymentDivider: Percentage must exceed 0"
            );
            require(
                percentages_[i] <= 100,
                "FlexPaymentDivider: Percentage must not exceed 100"
            );
            sum += percentages_[i];
            _recipientCount += 1;
            _recipientsById[i] = recipients_[i];
            _percentagesByRecipient[_recipientsById[i]] = percentages_[i];
        }
        require(sum == 100, "FlexPaymentDivider: Percentages must sum to 100");
    }

    function isWithdrawing(address account) internal view returns (bool) {
        return _isWithdrawingByAccount[account] == 1;
    }
}

/**
 * @notice Token IDs are positive integers starting at 1.
 */
contract BLOCKRUNRS_NFT is ERC721Enumerable, Ownable {
    using Address for address;
    using Strings for uint256;

    uint256 public constant MAX_TOTAL_SUPPLY = 9_999;
    uint256 public constant MAX_ROLLING_SUPPLY = 9_899; // Includes max presale supply
    uint256 public constant MAX_PRESALE_SUPPLY = 6_250;
    uint256 public constant MAX_PRIVATE_SUPPLY = 100;

    uint256 public constant ROLLING_PURCHASE_LIMIT = 20;
    uint256 public constant PRESALE_PURCHASE_LIMIT = 5;

    bool public rollingPurchasesEnabled = false;
    bool public presale1PurchasesEnabled = false;
    bool public presale2PurchasesEnabled = false;

    address private _manager;

    uint256 private _rollingSupply;
    uint256 private _presaleSupply;
    uint256 private _privateSupply;

    string private _tokenBaseURI;

    mapping(address => uint256) private _presalePurchasesByAccount;
    mapping(address => uint256) private _rollingPurchasesByAccount;

    // 0 = false, 1 = true
    mapping(address => uint8) private _isPresale1Account;
    mapping(address => uint8) private _isPresale2Account;
    mapping(address => uint8) private _isPurchasing;

    FlexPaymentDivider private immutable _paymentHandler;

    constructor(
        string memory name,
        string memory symbol,
        string memory tokenBaseURI_,
        address payable[] memory payoutAccounts_,
        uint256[] memory payoutPercentages_
    ) ERC721(name, symbol) {
        _tokenBaseURI = tokenBaseURI_;
        _paymentHandler = new FlexPaymentDivider(payoutAccounts_, payoutPercentages_);
    }

    /* MODIFIERS */

    /**
     * @dev Throws if called by any account that is not the owner or manager.
     */
    modifier onlyAuthorized() {
        require(isAuthorized(_msgSender()));
        _;
    }

    /* GETTERS */

    function manager() external view returns (address) {
        return _manager;
    }

    function paymentHandler() external view returns (address) {
        return address(_paymentHandler);
    }

    function rollingSupplyAvailable() public view returns (uint256) {
        uint256 available = MAX_ROLLING_SUPPLY - _presaleSupply - _rollingSupply;
        if (available < 0) {
            return 0;
        }
        return available;
    }

    function presaleSupplyAvailable() public view returns (uint256) {
        if (_presaleSupply > MAX_PRESALE_SUPPLY) {
            return 0;
        }
        return MAX_PRESALE_SUPPLY - _presaleSupply;
    }

    function privateSupplyAvailable() public view returns (uint256) {
        if (_privateSupply > MAX_PRIVATE_SUPPLY) {
            return 0;
        }
        return MAX_PRIVATE_SUPPLY - _privateSupply;
    }

    function isPresale1Account(address account) public view returns (bool) {
        return _isPresale1Account[account] == 1;
    }

    function isPresale2Account(address account) public view returns (bool) {
        return _isPresale2Account[account] == 1;
    }

    function isAuthorized(address account) public view returns (bool) {
        return account == owner() || account == _manager;
    }

    /* PAYABLE */

    function purchasePresale(
        uint256 amount,
        uint8 safeMode,
        uint8 presaleType
    ) external payable {
        require(amount > 0);
        require(
            !isPurchasing(_msgSender())
        );
        require(
            totalSupply() < MAX_TOTAL_SUPPLY
        );
        require(
            amount <= presaleSupplyAvailable()
        );
        require(
            _presalePurchasesByAccount[_msgSender()] + amount <= PRESALE_PURCHASE_LIMIT
        );

        if (presaleType == 2) {
            require(
                presale2PurchasesEnabled
            );
            require(
                isPresale2Account(_msgSender())
            );
            require(
                msg.value >= 0.04 ether * amount
            );
        } else {
            require(
                presale1PurchasesEnabled
            );
            require(
                isPresale1Account(_msgSender())
            );
            require(
                msg.value >= 0.05 ether * amount
            );
        }

        _isPurchasing[_msgSender()] = 1;

        _handleDeposit(msg.value, safeMode);

        for (uint256 i = 0; i < amount; i++) {
            uint256 tokenId = 1 + totalSupply();
            _presaleSupply += 1;
            _presalePurchasesByAccount[_msgSender()] += 1;
            _safeMint(_msgSender(), tokenId);
        }

        _isPurchasing[_msgSender()] = 0;
    }

    function purchase(uint256 amount, uint8 safeMode) external payable {
        require(amount > 0);
        require(
            !isPurchasing(_msgSender())
        );
        require(
            totalSupply() < MAX_TOTAL_SUPPLY
        );
        require(
            amount <= rollingSupplyAvailable()
        );
        require(
            _rollingPurchasesByAccount[_msgSender()] + amount <= ROLLING_PURCHASE_LIMIT
        );
        require(rollingPurchasesEnabled);
        require(
            msg.value >= 0.05 ether * amount,
            "BLOCKRUNRS: Not enough Ether provided"
        );

        _isPurchasing[_msgSender()] = 1;

        _handleDeposit(msg.value, safeMode);

        for (uint256 i = 0; i < amount; i++) {
            uint256 tokenId = 1 + totalSupply();
            _rollingSupply += 1;
            _rollingPurchasesByAccount[_msgSender()] += 1;
            _safeMint(_msgSender(), tokenId);
        }

        _isPurchasing[_msgSender()] = 0;
    }

    /* PRIVILEGED */

    function gift(
        address[] calldata recipients,
        uint256[] calldata amounts
    ) external onlyAuthorized {
        require(
            recipients.length == amounts.length,
            "BLOCKRUNRS: Input lengths must match"
        );
        require(
            totalSupply() < MAX_TOTAL_SUPPLY,
            "BLOCKRUNRS: Maximum supply reached"
        );

        uint256 _privateSupplyAvailable = privateSupplyAvailable();
        uint256 totalAmount;

        for (uint256 i = 0; i < recipients.length; i++) {
            address recipient = recipients[i];
            uint256 amount = amounts[i];
            for (uint256 j = 0; j < amount; j++) {
                uint256 tokenId = 1 + totalSupply();
                _privateSupply += 1;
                _safeMint(recipient, tokenId);
            }
        }

        require(
            totalAmount <= _privateSupplyAvailable,
            "BLOCKRUNRS: Amounts exceed supply available"
        );
    }

    function startPresale1() external onlyAuthorized {
        presale1PurchasesEnabled = true;
    }

    function stopPresale1() external onlyAuthorized {
        presale1PurchasesEnabled = false;
    }

    function startPresale2() external onlyAuthorized {
        presale2PurchasesEnabled = true;
    }

    function stopPresale2() external onlyAuthorized {
        presale2PurchasesEnabled = false;
    }

    function startRollingSale() external onlyAuthorized {
        rollingPurchasesEnabled = true;
    }

    function stopRollingSale() external onlyAuthorized {
        rollingPurchasesEnabled = false;
    }

    function addPresaleAccounts(
        address[] calldata accounts,
        uint8 presaleType
    ) external onlyAuthorized {
        if (presaleType == 2) {
            for (uint256 i = 0; i < accounts.length; i++) {
                require(
                    accounts[i] != address(0),
                    "BLOCKRUNRS: Address 0 not allowed"
                );
                _isPresale2Account[accounts[i]] = 1;
            }
        } else {
            for (uint256 i = 0; i < accounts.length; i++) {
                require(
                    accounts[i] != address(0),
                    "BLOCKRUNRS: Address 0 not allowed"
                );
                _isPresale1Account[accounts[i]] = 1;
            }
        }
    }

    function removePresaleAccounts(
        address[] calldata accounts,
        uint8 presaleType
    ) external onlyAuthorized {
        if (presaleType == 2) {
            for (uint256 i = 0; i < accounts.length; i++) {
                require(
                    isPresale2Account(accounts[i]),
                    "BLOCKRUNRS: One of the accounts is not a presale 2 account"
                );
                _isPresale2Account[accounts[i]] = 0;
            }
        } else {
            for (uint256 i = 0; i < accounts.length; i++) {
                require(
                    isPresale1Account(accounts[i]),
                    "BLOCKRUNRS: One of the accounts is not a presale 1 account"
                );
                _isPresale1Account[accounts[i]] = 0;
            }
        }
    }

    function setTokenBaseURI(string calldata URI) external onlyAuthorized {
        _tokenBaseURI = URI;
    }

    /**
     * @dev Set to the 0 address to revoke the current manager's authorization.
     */
    function setManager(address manager_) external onlyOwner {
        _manager = manager_;
    }

    /* INTERNAL */

    /**
     * @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 override returns (string memory) {
        return _tokenBaseURI;
    }

    /* PRIVATE */

    function _handleDeposit(uint256 value, uint8 safeMode) private {
        if (safeMode > 0) { // >0 == true, 0 == false
            _depositAsPull(value);
        } else {
            _depositAsPush(value);
        }
    }

    function _depositAsPush(uint256 value) private {
        _paymentHandler.deposit{value: value}();
        _paymentHandler.disperse();
    }

    function _depositAsPull(uint256 value) private {
        _paymentHandler.deposit{value: value}();
    }

    function isPurchasing(address account) private view returns (bool) {
        return _isPurchasing[account] == 1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"tokenBaseURI_","type":"string"},{"internalType":"address payable[]","name":"payoutAccounts_","type":"address[]"},{"internalType":"uint256[]","name":"payoutPercentages_","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PRESALE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PRIVATE_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_ROLLING_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRESALE_PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROLLING_PURCHASE_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint8","name":"presaleType","type":"uint8"}],"name":"addPresaleAccounts","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":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"account","type":"address"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPresale1Account","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isPresale2Account","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentHandler","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale1PurchasesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale2PurchasesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleSupplyAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSupplyAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"safeMode","type":"uint8"}],"name":"purchase","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"safeMode","type":"uint8"},{"internalType":"uint8","name":"presaleType","type":"uint8"}],"name":"purchasePresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint8","name":"presaleType","type":"uint8"}],"name":"removePresaleAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rollingPurchasesEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rollingSupplyAvailable","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":"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":"address","name":"manager_","type":"address"}],"name":"setManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setTokenBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startPresale2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startRollingSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPresale1","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopPresale2","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stopRollingSale","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":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526000600a60146101000a81548160ff0219169083151502179055506000600a60156101000a81548160ff0219169083151502179055506000600a60166101000a81548160ff0219169083151502179055503480156200006257600080fd5b506040516200806d3803806200806d833981810160405281019062000088919062000507565b84848160009080519060200190620000a292919062000241565b508060019080519060200190620000bb92919062000241565b505050620000de620000d26200017360201b60201c565b6200017b60201b60201c565b82600f9080519060200190620000f692919062000241565b5081816040516200010790620002d2565b6200011492919062000754565b604051809103906000f08015801562000131573d6000803e3d6000fd5b5073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b81525050505050505062000a5a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024f9062000932565b90600052602060002090601f016020900481019282620002735760008555620002bf565b82601f106200028e57805160ff1916838001178555620002bf565b82800160010185558215620002bf579182015b82811115620002be578251825591602001919060010190620002a1565b5b509050620002ce9190620002e0565b5090565b6120948062005fd983390190565b5b80821115620002fb576000816000905550600101620002e1565b5090565b6000620003166200031084620007b8565b6200078f565b905080838252602082019050828560208602820111156200033c576200033b62000a01565b5b60005b8581101562000370578162000355888262000440565b8452602084019350602083019250506001810190506200033f565b5050509392505050565b6000620003916200038b84620007e7565b6200078f565b90508083825260208201905082856020860282011115620003b757620003b662000a01565b5b60005b85811015620003eb5781620003d08882620004f0565b845260208401935060208301925050600181019050620003ba565b5050509392505050565b60006200040c620004068462000816565b6200078f565b9050828152602081018484840111156200042b576200042a62000a06565b5b62000438848285620008fc565b509392505050565b600081519050620004518162000a26565b92915050565b600082601f8301126200046f576200046e620009fc565b5b815162000481848260208601620002ff565b91505092915050565b600082601f830112620004a257620004a1620009fc565b5b8151620004b48482602086016200037a565b91505092915050565b600082601f830112620004d557620004d4620009fc565b5b8151620004e7848260208601620003f5565b91505092915050565b600081519050620005018162000a40565b92915050565b600080600080600060a0868803121562000526576200052562000a10565b5b600086015167ffffffffffffffff81111562000547576200054662000a0b565b5b6200055588828901620004bd565b955050602086015167ffffffffffffffff81111562000579576200057862000a0b565b5b6200058788828901620004bd565b945050604086015167ffffffffffffffff811115620005ab57620005aa62000a0b565b5b620005b988828901620004bd565b935050606086015167ffffffffffffffff811115620005dd57620005dc62000a0b565b5b620005eb8882890162000457565b925050608086015167ffffffffffffffff8111156200060f576200060e62000a0b565b5b6200061d888289016200048a565b9150509295509295909350565b60006200063883836200065e565b60208301905092915050565b600062000652838362000743565b60208301905092915050565b6200066981620008be565b82525050565b60006200067c826200086c565b6200068881856200089c565b935062000695836200084c565b8060005b83811015620006cc578151620006b088826200062a565b9750620006bd8362000882565b92505060018101905062000699565b5085935050505092915050565b6000620006e68262000877565b620006f28185620008ad565b9350620006ff836200085c565b8060005b83811015620007365781516200071a888262000644565b975062000727836200088f565b92505060018101905062000703565b5085935050505092915050565b6200074e81620008f2565b82525050565b600060408201905081810360008301526200077081856200066f565b90508181036020830152620007868184620006d9565b90509392505050565b60006200079b620007ae565b9050620007a9828262000968565b919050565b6000604051905090565b600067ffffffffffffffff821115620007d657620007d5620009cd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620008055762000804620009cd565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620008345762000833620009cd565b5b6200083f8262000a15565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620008cb82620008d2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200091c578082015181840152602081019050620008ff565b838111156200092c576000848401525b50505050565b600060028204905060018216806200094b57607f821691505b602082108114156200096257620009616200099e565b5b50919050565b620009738262000a15565b810181811067ffffffffffffffff82111715620009955762000994620009cd565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b62000a3181620008be565b811462000a3d57600080fd5b50565b62000a4b81620008f2565b811462000a5757600080fd5b50565b60805160601c61554b62000a8e60003960008181611bcf015281816131ac0152818161323001526132b1015261554b6000f3fe6080604052600436106102ae5760003560e01c806370a0823111610175578063c807c39c116100dc578063d299602811610095578063e985e9c51161006f578063e985e9c514610a28578063ea1932db14610a65578063f2fde38b14610a8e578063fe9fbb8014610ab7576102ae565b8063d2996028146109b8578063dc1dc44e146109e1578063e61ef07914610a0c576102ae565b8063c807c39c14610882578063c87b56dd146108ad578063c9c77692146108ea578063cdd5bd2114610927578063cdef15cc14610952578063d0ebdbe71461098f576102ae565b80638ef79e911161012e5780638ef79e911461079a57806395d89b41146107c35780639a204a54146107ee578063a22cb46514610819578063ad86ace614610842578063b88d4fde14610859576102ae565b806370a08231146106bf578063715018a6146106fc57806372009407146107135780637705f9b51461072f5780637a7cce98146107585780638da5cb5b1461076f576102ae565b806333039d3d116102195780634f6ccce7116101d25780634f6ccce7146105ad57806359aed391146105ea57806362d0f657146106155780636352211e146106405780636b8dc3551461067d5780636c5c397b146106a8576102ae565b806333039d3d146104d5578063352567a21461050057806336a6aada1461052b57806342842e0e1461054257806343aa36de1461056b578063481c6a7514610582576102ae565b806318160ddd1161026b57806318160ddd146103d75780631c881fe0146104025780631d8c13bf1461042d57806323b872dd146104445780632f745c591461046d5780633166b465146104aa576102ae565b806301ffc9a7146102b35780630652a979146102f057806306fdde031461031b578063081812fc14610346578063095ea7b3146103835780630c06711d146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613f47565b610af4565b6040516102e79190614574565b60405180910390f35b3480156102fc57600080fd5b50610305610b6e565b6040516103129190614574565b60405180910390f35b34801561032757600080fd5b50610330610b81565b60405161033d919061458f565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613fee565b610c13565b60405161037a919061450d565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613e26565b610c98565b005b3480156103b857600080fd5b506103c1610db0565b6040516103ce91906148d1565b60405180910390f35b3480156103e357600080fd5b506103ec610ddb565b6040516103f991906148d1565b60405180910390f35b34801561040e57600080fd5b50610417610de8565b60405161042491906148d1565b60405180910390f35b34801561043957600080fd5b50610442610dee565b005b34801561045057600080fd5b5061046b60048036038101906104669190613d10565b610e24565b005b34801561047957600080fd5b50610494600480360381019061048f9190613e26565b610e84565b6040516104a191906148d1565b60405180910390f35b3480156104b657600080fd5b506104bf610f29565b6040516104cc91906148d1565b60405180910390f35b3480156104e157600080fd5b506104ea610f56565b6040516104f791906148d1565b60405180910390f35b34801561050c57600080fd5b50610515610f5c565b60405161052291906148d1565b60405180910390f35b34801561053757600080fd5b50610540610f61565b005b34801561054e57600080fd5b5061056960048036038101906105649190613d10565b610f97565b005b34801561057757600080fd5b50610580610fb7565b005b34801561058e57600080fd5b50610597610fed565b6040516105a4919061450d565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf9190613fee565b611017565b6040516105e191906148d1565b60405180910390f35b3480156105f657600080fd5b506105ff611088565b60405161060c91906148d1565b60405180910390f35b34801561062157600080fd5b5061062a6110c5565b60405161063791906148d1565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190613fee565b6110ca565b604051610674919061450d565b60405180910390f35b34801561068957600080fd5b5061069261117c565b60405161069f91906148d1565b60405180910390f35b3480156106b457600080fd5b506106bd611182565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190613ca3565b6111b8565b6040516106f391906148d1565b60405180910390f35b34801561070857600080fd5b50610711611270565b005b61072d6004803603810190610728919061401b565b6112f8565b005b34801561073b57600080fd5b5061075660048036038101906107519190613e66565b6115a4565b005b34801561076457600080fd5b5061076d611776565b005b34801561077b57600080fd5b506107846117ac565b604051610791919061450d565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613fa1565b6117d6565b005b3480156107cf57600080fd5b506107d8611805565b6040516107e5919061458f565b60405180910390f35b3480156107fa57600080fd5b50610803611897565b60405161081091906148d1565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190613de6565b61189c565b005b34801561084e57600080fd5b50610857611a1d565b005b34801561086557600080fd5b50610880600480360381019061087b9190613d63565b611a53565b005b34801561088e57600080fd5b50610897611ab5565b6040516108a49190614574565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf9190613fee565b611ac8565b6040516108e1919061458f565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190613ca3565b611b6f565b60405161091e9190614574565b60405180910390f35b34801561093357600080fd5b5061093c611bcb565b604051610949919061450d565b60405180910390f35b34801561095e57600080fd5b5061097960048036038101906109749190613ca3565b611bf3565b6040516109869190614574565b60405180910390f35b34801561099b57600080fd5b506109b660048036038101906109b19190613ca3565b611c4f565b005b3480156109c457600080fd5b506109df60048036038101906109da9190613ee7565b611d0f565b005b3480156109ed57600080fd5b506109f6611fb1565b604051610a039190614574565b60405180910390f35b610a266004803603810190610a21919061405b565b611fc4565b005b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190613cd0565b6122b7565b604051610a5c9190614574565b60405180910390f35b348015610a7157600080fd5b50610a8c6004803603810190610a879190613ee7565b61234b565b005b348015610a9a57600080fd5b50610ab56004803603810190610ab09190613ca3565b61259d565b005b348015610ac357600080fd5b50610ade6004803603810190610ad99190613ca3565b612695565b604051610aeb9190614574565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b675750610b668261272c565b5b9050919050565b600a60159054906101000a900460ff1681565b606060008054610b9090614b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbc90614b5d565b8015610c095780601f10610bde57610100808354040283529160200191610c09565b820191906000526020600020905b815481529060010190602001808311610bec57829003601f168201915b5050505050905090565b6000610c1e8261280e565b610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490614791565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ca3826110ca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b90614831565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3361287a565b73ffffffffffffffffffffffffffffffffffffffff161480610d625750610d6181610d5c61287a565b6122b7565b5b610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d98906146f1565b60405180910390fd5b610dab8383612882565b505050565b60006064600e541115610dc65760009050610dd8565b600e546064610dd59190614a66565b90505b90565b6000600880549050905090565b6126ab81565b610dfe610df961287a565b612695565b610e0757600080fd5b6001600a60166101000a81548160ff021916908315150217905550565b610e35610e2f61287a565b8261293b565b610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90614851565b60405180910390fd5b610e7f838383612a19565b505050565b6000610e8f836111b8565b8210610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec7906145b1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600061186a600d541115610f405760009050610f53565b600d5461186a610f509190614a66565b90505b90565b61270f81565b606481565b610f71610f6c61287a565b612695565b610f7a57600080fd5b6001600a60156101000a81548160ff021916908315150217905550565b610fb283838360405180602001604052806000815250611a53565b505050565b610fc7610fc261287a565b612695565b610fd057600080fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611021610ddb565b8210611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990614871565b60405180910390fd5b6008828154811061107657611075614cf6565b5b90600052602060002001549050919050565b600080600c54600d546126ab61109e9190614a66565b6110a89190614a66565b905060008110156110bd5760009150506110c2565b809150505b90565b600581565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614731565b60405180910390fd5b80915050919050565b61186a81565b61119261118d61287a565b612695565b61119b57600080fd5b6000600a60146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614711565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61127861287a565b73ffffffffffffffffffffffffffffffffffffffff166112966117ac565b73ffffffffffffffffffffffffffffffffffffffff16146112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906147b1565b60405180910390fd5b6112f66000612c75565b565b6000821161130557600080fd5b61131561131061287a565b612d3b565b1561131f57600080fd5b61270f61132a610ddb565b1061133457600080fd5b61133c611088565b82111561134857600080fd5b6014826011600061135761287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461139c9190614985565b11156113a757600080fd5b600a60149054906101000a900460ff166113c057600080fd5b8166b1a2bc2ec500006113d39190614a0c565b341015611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614771565b60405180910390fd5b60016014600061142361287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555061147f3482612d97565b60005b8281101561153f576000611494610ddb565b60016114a09190614985565b90506001600c60008282546114b59190614985565b925050819055506001601160006114ca61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115139190614985565b9250508190555061152b61152561287a565b82612dbf565b50808061153790614bc0565b915050611482565b5060006014600061154e61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6115b46115af61287a565b612695565b6115bd57600080fd5b818190508484905014611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90614631565b60405180910390fd5b61270f611610610ddb565b10611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790614811565b60405180910390fd5b600061165a610db0565b9050600080600090505b8686905081101561172a57600087878381811061168457611683614cf6565b5b90506020020160208101906116999190613ca3565b905060008686848181106116b0576116af614cf6565b5b90506020020135905060005b818110156117145760006116ce610ddb565b60016116da9190614985565b90506001600e60008282546116ef9190614985565b925050819055506117008482612dbf565b50808061170c90614bc0565b9150506116bc565b505050808061172290614bc0565b915050611664565b508181111561176e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611765906148b1565b60405180910390fd5b505050505050565b61178661178161287a565b612695565b61178f57600080fd5b6000600a60156101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117e66117e161287a565b612695565b6117ef57600080fd5b8181600f9190611800929190613a10565b505050565b60606001805461181490614b5d565b80601f016020809104026020016040519081016040528092919081815260200182805461184090614b5d565b801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b5050505050905090565b601481565b6118a461287a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190990614671565b60405180910390fd5b806005600061191f61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119cc61287a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a119190614574565b60405180910390a35050565b611a2d611a2861287a565b612695565b611a3657600080fd5b6000600a60166101000a81548160ff021916908315150217905550565b611a64611a5e61287a565b8361293b565b611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90614851565b60405180910390fd5b611aaf84848484612ddd565b50505050565b600a60149054906101000a900460ff1681565b6060611ad38261280e565b611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906147f1565b60405180910390fd5b6000611b1c612e39565b90506000815111611b3c5760405180602001604052806000815250611b67565b80611b4684612ecb565b604051602001611b579291906144e9565b6040516020818303038152906040525b915050919050565b60006001601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16149050919050565b60007f0000000000000000000000000000000000000000000000000000000000000000905090565b60006001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16149050919050565b611c5761287a565b73ffffffffffffffffffffffffffffffffffffffff16611c756117ac565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc2906147b1565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d1f611d1a61287a565b612695565b611d2857600080fd5b60028160ff161415611e725760005b83839050811015611e6c57600073ffffffffffffffffffffffffffffffffffffffff16848483818110611d6d57611d6c614cf6565b5b9050602002016020810190611d829190613ca3565b73ffffffffffffffffffffffffffffffffffffffff161415611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd0906146d1565b60405180910390fd5b600160136000868685818110611df257611df1614cf6565b5b9050602002016020810190611e079190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611e6490614bc0565b915050611d37565b50611fac565b60005b83839050811015611faa57600073ffffffffffffffffffffffffffffffffffffffff16848483818110611eab57611eaa614cf6565b5b9050602002016020810190611ec09190613ca3565b73ffffffffffffffffffffffffffffffffffffffff161415611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e906146d1565b60405180910390fd5b600160126000868685818110611f3057611f2f614cf6565b5b9050602002016020810190611f459190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611fa290614bc0565b915050611e75565b505b505050565b600a60169054906101000a900460ff1681565b60008311611fd157600080fd5b611fe1611fdc61287a565b612d3b565b15611feb57600080fd5b61270f611ff6610ddb565b1061200057600080fd5b612008610f29565b83111561201457600080fd5b6005836010600061202361287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120689190614985565b111561207357600080fd5b60028160ff1614156120d557600a60169054906101000a900460ff1661209857600080fd5b6120a86120a361287a565b611b6f565b6120b157600080fd5b82668e1bc9bf0400006120c49190614a0c565b3410156120d057600080fd5b612127565b600a60159054906101000a900460ff166120ee57600080fd5b6120fe6120f961287a565b611bf3565b61210757600080fd5b8266b1a2bc2ec5000061211a9190614a0c565b34101561212657600080fd5b5b60016014600061213561287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506121913483612d97565b60005b838110156122515760006121a6610ddb565b60016121b29190614985565b90506001600d60008282546121c79190614985565b925050819055506001601060006121dc61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122259190614985565b9250508190555061223d61223761287a565b82612dbf565b50808061224990614bc0565b915050612194565b5060006014600061226061287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61235b61235661287a565b612695565b61236457600080fd5b60028160ff1614156124865760005b83839050811015612480576123ae84848381811061239457612393614cf6565b5b90506020020160208101906123a99190613ca3565b611b6f565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614691565b60405180910390fd5b60006013600086868581811061240657612405614cf6565b5b905060200201602081019061241b9190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061247890614bc0565b915050612373565b50612598565b60005b83839050811015612596576124c48484838181106124aa576124a9614cf6565b5b90506020020160208101906124bf9190613ca3565b611bf3565b612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fa90614891565b60405180910390fd5b60006012600086868581811061251c5761251b614cf6565b5b90506020020160208101906125319190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061258e90614bc0565b915050612489565b505b505050565b6125a561287a565b73ffffffffffffffffffffffffffffffffffffffff166125c36117ac565b73ffffffffffffffffffffffffffffffffffffffff1614612619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612610906147b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612680906145f1565b60405180910390fd5b61269281612c75565b50565b600061269f6117ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806127255750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127f757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061280757506128068261302c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128f5836110ca565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129468261280e565b612985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297c906146b1565b60405180910390fd5b6000612990836110ca565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129ff57508373ffffffffffffffffffffffffffffffffffffffff166129e784610c13565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a105750612a0f81856122b7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a39826110ca565b73ffffffffffffffffffffffffffffffffffffffff1614612a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a86906147d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af690614651565b60405180910390fd5b612b0a838383613096565b612b15600082612882565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b659190614a66565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bbc9190614985565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16149050919050565b60008160ff161115612db157612dac826131aa565b612dbb565b612dba8261322e565b5b5050565b612dd9828260405180602001604052806000815250613332565b5050565b612de8848484612a19565b612df48484848461338d565b612e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2a906145d1565b60405180910390fd5b50505050565b6060600f8054612e4890614b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054612e7490614b5d565b8015612ec15780601f10612e9657610100808354040283529160200191612ec1565b820191906000526020600020905b815481529060010190602001808311612ea457829003601f168201915b5050505050905090565b60606000821415612f13576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613027565b600082905060005b60008214612f45578080612f2e90614bc0565b915050600a82612f3e91906149db565b9150612f1b565b60008167ffffffffffffffff811115612f6157612f60614d25565b5b6040519080825280601f01601f191660200182016040528015612f935781602001600182028036833780820191505090505b5090505b6000851461302057600182612fac9190614a66565b9150600a85612fbb9190614c09565b6030612fc79190614985565b60f81b818381518110612fdd57612fdc614cf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561301991906149db565b9450612f97565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130a1838383613524565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130e4576130df81613529565b613123565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613122576131218382613572565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316657613161816136df565b6131a5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131a4576131a382826137b0565b5b5b505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561321257600080fd5b505af1158015613226573d6000803e3d6000fd5b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561329657600080fd5b505af11580156132aa573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166388b6ff9c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561331757600080fd5b505af115801561332b573d6000803e3d6000fd5b5050505050565b61333c838361382f565b613349600084848461338d565b613388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337f906145d1565b60405180910390fd5b505050565b60006133ae8473ffffffffffffffffffffffffffffffffffffffff166139fd565b15613517578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133d761287a565b8786866040518563ffffffff1660e01b81526004016133f99493929190614528565b602060405180830381600087803b15801561341357600080fd5b505af192505050801561344457506040513d601f19601f820116820180604052508101906134419190613f74565b60015b6134c7573d8060008114613474576040519150601f19603f3d011682016040523d82523d6000602084013e613479565b606091505b506000815114156134bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b6906145d1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061351c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161357f846111b8565b6135899190614a66565b905060006007600084815260200190815260200160002054905081811461366e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136f39190614a66565b905060006009600084815260200190815260200160002054905060006008838154811061372357613722614cf6565b5b90600052602060002001549050806008838154811061374557613744614cf6565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061379457613793614cc7565b5b6001900381819060005260206000200160009055905550505050565b60006137bb836111b8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561389f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389690614751565b60405180910390fd5b6138a88161280e565b156138e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138df90614611565b60405180910390fd5b6138f460008383613096565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139449190614985565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613a1c90614b5d565b90600052602060002090601f016020900481019282613a3e5760008555613a85565b82601f10613a5757803560ff1916838001178555613a85565b82800160010185558215613a85579182015b82811115613a84578235825591602001919060010190613a69565b5b509050613a929190613a96565b5090565b5b80821115613aaf576000816000905550600101613a97565b5090565b6000613ac6613ac184614911565b6148ec565b905082815260208101848484011115613ae257613ae1614d63565b5b613aed848285614b1b565b509392505050565b600081359050613b04816154a2565b92915050565b60008083601f840112613b2057613b1f614d59565b5b8235905067ffffffffffffffff811115613b3d57613b3c614d54565b5b602083019150836020820283011115613b5957613b58614d5e565b5b9250929050565b60008083601f840112613b7657613b75614d59565b5b8235905067ffffffffffffffff811115613b9357613b92614d54565b5b602083019150836020820283011115613baf57613bae614d5e565b5b9250929050565b600081359050613bc5816154b9565b92915050565b600081359050613bda816154d0565b92915050565b600081519050613bef816154d0565b92915050565b600082601f830112613c0a57613c09614d59565b5b8135613c1a848260208601613ab3565b91505092915050565b60008083601f840112613c3957613c38614d59565b5b8235905067ffffffffffffffff811115613c5657613c55614d54565b5b602083019150836001820283011115613c7257613c71614d5e565b5b9250929050565b600081359050613c88816154e7565b92915050565b600081359050613c9d816154fe565b92915050565b600060208284031215613cb957613cb8614d6d565b5b6000613cc784828501613af5565b91505092915050565b60008060408385031215613ce757613ce6614d6d565b5b6000613cf585828601613af5565b9250506020613d0685828601613af5565b9150509250929050565b600080600060608486031215613d2957613d28614d6d565b5b6000613d3786828701613af5565b9350506020613d4886828701613af5565b9250506040613d5986828701613c79565b9150509250925092565b60008060008060808587031215613d7d57613d7c614d6d565b5b6000613d8b87828801613af5565b9450506020613d9c87828801613af5565b9350506040613dad87828801613c79565b925050606085013567ffffffffffffffff811115613dce57613dcd614d68565b5b613dda87828801613bf5565b91505092959194509250565b60008060408385031215613dfd57613dfc614d6d565b5b6000613e0b85828601613af5565b9250506020613e1c85828601613bb6565b9150509250929050565b60008060408385031215613e3d57613e3c614d6d565b5b6000613e4b85828601613af5565b9250506020613e5c85828601613c79565b9150509250929050565b60008060008060408587031215613e8057613e7f614d6d565b5b600085013567ffffffffffffffff811115613e9e57613e9d614d68565b5b613eaa87828801613b0a565b9450945050602085013567ffffffffffffffff811115613ecd57613ecc614d68565b5b613ed987828801613b60565b925092505092959194509250565b600080600060408486031215613f0057613eff614d6d565b5b600084013567ffffffffffffffff811115613f1e57613f1d614d68565b5b613f2a86828701613b0a565b93509350506020613f3d86828701613c8e565b9150509250925092565b600060208284031215613f5d57613f5c614d6d565b5b6000613f6b84828501613bcb565b91505092915050565b600060208284031215613f8a57613f89614d6d565b5b6000613f9884828501613be0565b91505092915050565b60008060208385031215613fb857613fb7614d6d565b5b600083013567ffffffffffffffff811115613fd657613fd5614d68565b5b613fe285828601613c23565b92509250509250929050565b60006020828403121561400457614003614d6d565b5b600061401284828501613c79565b91505092915050565b6000806040838503121561403257614031614d6d565b5b600061404085828601613c79565b925050602061405185828601613c8e565b9150509250929050565b60008060006060848603121561407457614073614d6d565b5b600061408286828701613c79565b935050602061409386828701613c8e565b92505060406140a486828701613c8e565b9150509250925092565b6140b781614a9a565b82525050565b6140c681614aac565b82525050565b60006140d782614942565b6140e18185614958565b93506140f1818560208601614b2a565b6140fa81614d72565b840191505092915050565b60006141108261494d565b61411a8185614969565b935061412a818560208601614b2a565b61413381614d72565b840191505092915050565b60006141498261494d565b614153818561497a565b9350614163818560208601614b2a565b80840191505092915050565b600061417c602b83614969565b915061418782614d83565b604082019050919050565b600061419f603283614969565b91506141aa82614dd2565b604082019050919050565b60006141c2602683614969565b91506141cd82614e21565b604082019050919050565b60006141e5601c83614969565b91506141f082614e70565b602082019050919050565b6000614208602483614969565b915061421382614e99565b604082019050919050565b600061422b602483614969565b915061423682614ee8565b604082019050919050565b600061424e601983614969565b915061425982614f37565b602082019050919050565b6000614271603a83614969565b915061427c82614f60565b604082019050919050565b6000614294602c83614969565b915061429f82614faf565b604082019050919050565b60006142b7602183614969565b91506142c282614ffe565b604082019050919050565b60006142da603883614969565b91506142e58261504d565b604082019050919050565b60006142fd602a83614969565b91506143088261509c565b604082019050919050565b6000614320602983614969565b915061432b826150eb565b604082019050919050565b6000614343602083614969565b915061434e8261513a565b602082019050919050565b6000614366602583614969565b915061437182615163565b604082019050919050565b6000614389602c83614969565b9150614394826151b2565b604082019050919050565b60006143ac602083614969565b91506143b782615201565b602082019050919050565b60006143cf602983614969565b91506143da8261522a565b604082019050919050565b60006143f2602f83614969565b91506143fd82615279565b604082019050919050565b6000614415602283614969565b9150614420826152c8565b604082019050919050565b6000614438602183614969565b915061444382615317565b604082019050919050565b600061445b603183614969565b915061446682615366565b604082019050919050565b600061447e602c83614969565b9150614489826153b5565b604082019050919050565b60006144a1603a83614969565b91506144ac82615404565b604082019050919050565b60006144c4602b83614969565b91506144cf82615453565b604082019050919050565b6144e381614b04565b82525050565b60006144f5828561413e565b9150614501828461413e565b91508190509392505050565b600060208201905061452260008301846140ae565b92915050565b600060808201905061453d60008301876140ae565b61454a60208301866140ae565b61455760408301856144da565b818103606083015261456981846140cc565b905095945050505050565b600060208201905061458960008301846140bd565b92915050565b600060208201905081810360008301526145a98184614105565b905092915050565b600060208201905081810360008301526145ca8161416f565b9050919050565b600060208201905081810360008301526145ea81614192565b9050919050565b6000602082019050818103600083015261460a816141b5565b9050919050565b6000602082019050818103600083015261462a816141d8565b9050919050565b6000602082019050818103600083015261464a816141fb565b9050919050565b6000602082019050818103600083015261466a8161421e565b9050919050565b6000602082019050818103600083015261468a81614241565b9050919050565b600060208201905081810360008301526146aa81614264565b9050919050565b600060208201905081810360008301526146ca81614287565b9050919050565b600060208201905081810360008301526146ea816142aa565b9050919050565b6000602082019050818103600083015261470a816142cd565b9050919050565b6000602082019050818103600083015261472a816142f0565b9050919050565b6000602082019050818103600083015261474a81614313565b9050919050565b6000602082019050818103600083015261476a81614336565b9050919050565b6000602082019050818103600083015261478a81614359565b9050919050565b600060208201905081810360008301526147aa8161437c565b9050919050565b600060208201905081810360008301526147ca8161439f565b9050919050565b600060208201905081810360008301526147ea816143c2565b9050919050565b6000602082019050818103600083015261480a816143e5565b9050919050565b6000602082019050818103600083015261482a81614408565b9050919050565b6000602082019050818103600083015261484a8161442b565b9050919050565b6000602082019050818103600083015261486a8161444e565b9050919050565b6000602082019050818103600083015261488a81614471565b9050919050565b600060208201905081810360008301526148aa81614494565b9050919050565b600060208201905081810360008301526148ca816144b7565b9050919050565b60006020820190506148e660008301846144da565b92915050565b60006148f6614907565b90506149028282614b8f565b919050565b6000604051905090565b600067ffffffffffffffff82111561492c5761492b614d25565b5b61493582614d72565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061499082614b04565b915061499b83614b04565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149d0576149cf614c3a565b5b828201905092915050565b60006149e682614b04565b91506149f183614b04565b925082614a0157614a00614c69565b5b828204905092915050565b6000614a1782614b04565b9150614a2283614b04565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a5b57614a5a614c3a565b5b828202905092915050565b6000614a7182614b04565b9150614a7c83614b04565b925082821015614a8f57614a8e614c3a565b5b828203905092915050565b6000614aa582614ae4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b48578082015181840152602081019050614b2d565b83811115614b57576000848401525b50505050565b60006002820490506001821680614b7557607f821691505b60208210811415614b8957614b88614c98565b5b50919050565b614b9882614d72565b810181811067ffffffffffffffff82111715614bb757614bb6614d25565b5b80604052505050565b6000614bcb82614b04565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bfe57614bfd614c3a565b5b600182019050919050565b6000614c1482614b04565b9150614c1f83614b04565b925082614c2f57614c2e614c69565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f424c4f434b52554e52533a20496e707574206c656e67746873206d757374206d60008201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f424c4f434b52554e52533a204f6e65206f6620746865206163636f756e74732060008201527f6973206e6f7420612070726573616c652032206163636f756e74000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f424c4f434b52554e52533a20416464726573732030206e6f7420616c6c6f776560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f424c4f434b52554e52533a204e6f7420656e6f7567682045746865722070726f60008201527f7669646564000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f424c4f434b52554e52533a204d6178696d756d20737570706c7920726561636860008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f424c4f434b52554e52533a204f6e65206f6620746865206163636f756e74732060008201527f6973206e6f7420612070726573616c652031206163636f756e74000000000000602082015250565b7f424c4f434b52554e52533a20416d6f756e74732065786365656420737570706c60008201527f7920617661696c61626c65000000000000000000000000000000000000000000602082015250565b6154ab81614a9a565b81146154b657600080fd5b50565b6154c281614aac565b81146154cd57600080fd5b50565b6154d981614ab8565b81146154e457600080fd5b50565b6154f081614b04565b81146154fb57600080fd5b50565b61550781614b0e565b811461551257600080fd5b5056fea26469706673582212208210d17610ad615afe1c47ae94f2ada8df44326910266a1dc78691c55b9c2ce564736f6c6343000807003360806040523480156200001157600080fd5b506040516200209438038062002094833981810160405281019062000037919062000590565b620000576200004b6200007160201b60201c565b6200007960201b60201c565b6200006982826200013d60201b60201c565b505062000b12565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b805182511462000184576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200017b90620006d3565b60405180910390fd5b6000805b8351811015620003ba576000838281518110620001aa57620001a96200091f565b5b602002602001015111620001f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001ec90620006b1565b60405180910390fd5b60648382815181106200020d576200020c6200091f565b5b6020026020010151111562000259576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002509062000717565b60405180910390fd5b8281815181106200026f576200026e6200091f565b5b602002602001015182620002849190620007d1565b915060018060008282546200029a9190620007d1565b92505081905550838181518110620002b757620002b66200091f565b5b60200260200101516002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508281815181106200032657620003256200091f565b5b6020026020010151600360006002600085815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508080620003b190620008a2565b91505062000188565b506064811462000401576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003f890620006f5565b60405180910390fd5b505050565b60006200041d620004178462000762565b62000739565b9050808382526020820190508285602086028201111562000443576200044262000982565b5b60005b858110156200047757816200045c8882620004fc565b84526020840193506020830192505060018101905062000446565b5050509392505050565b600062000498620004928462000791565b62000739565b90508083825260208201905082856020860282011115620004be57620004bd62000982565b5b60005b85811015620004f25781620004d7888262000579565b845260208401935060208301925050600181019050620004c1565b5050509392505050565b6000815190506200050d8162000ade565b92915050565b600082601f8301126200052b576200052a6200097d565b5b81516200053d84826020860162000406565b91505092915050565b600082601f8301126200055e576200055d6200097d565b5b81516200057084826020860162000481565b91505092915050565b6000815190506200058a8162000af8565b92915050565b60008060408385031215620005aa57620005a96200098c565b5b600083015167ffffffffffffffff811115620005cb57620005ca62000987565b5b620005d98582860162000513565b925050602083015167ffffffffffffffff811115620005fd57620005fc62000987565b5b6200060b8582860162000546565b9150509250929050565b600062000624602c83620007c0565b91506200063182620009a2565b604082019050919050565b60006200064b602983620007c0565b91506200065882620009f1565b604082019050919050565b600062000672602f83620007c0565b91506200067f8262000a40565b604082019050919050565b600062000699603283620007c0565b9150620006a68262000a8f565b604082019050919050565b60006020820190508181036000830152620006cc8162000615565b9050919050565b60006020820190508181036000830152620006ee816200063c565b9050919050565b60006020820190508181036000830152620007108162000663565b9050919050565b6000602082019050818103600083015262000732816200068a565b9050919050565b60006200074562000758565b90506200075382826200086c565b919050565b6000604051905090565b600067ffffffffffffffff82111562000780576200077f6200094e565b5b602082029050602081019050919050565b600067ffffffffffffffff821115620007af57620007ae6200094e565b5b602082029050602081019050919050565b600082825260208201905092915050565b6000620007de8262000862565b9150620007eb8362000862565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620008235762000822620008f0565b5b828201905092915050565b60006200083b8262000842565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b620008778262000991565b810181811067ffffffffffffffff821117156200089957620008986200094e565b5b80604052505050565b6000620008af8262000862565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620008e557620008e4620008f0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f466c65785061796d656e74446976696465723a2050657263656e74616765206d60008201527f7573742065786365656420300000000000000000000000000000000000000000602082015250565b7f466c65785061796d656e74446976696465723a20556e657175616c20696e707560008201527f74206c656e677468730000000000000000000000000000000000000000000000602082015250565b7f466c65785061796d656e74446976696465723a2050657263656e74616765732060008201527f6d7573742073756d20746f203130300000000000000000000000000000000000602082015250565b7f466c65785061796d656e74446976696465723a2050657263656e74616765206d60008201527f757374206e6f7420657863656564203130300000000000000000000000000000602082015250565b62000ae9816200082e565b811462000af557600080fd5b50565b62000b038162000862565b811462000b0f57600080fd5b50565b6115728062000b226000396000f3fe6080604052600436106100a75760003560e01c80638da5cb5b116100645780638da5cb5b14610196578063a7b7b087146101c1578063d0e30db0146101fe578063e8478d4414610208578063f2fde38b14610245578063f3bdbc521461026e576100a7565b806322eabb8e146100ac5780632eb7cdb2146100d757806351cff8d91461011457806354fd4d501461013d578063715018a61461016857806388b6ff9c1461017f575b600080fd5b3480156100b857600080fd5b506100c16102ab565b6040516100ce91906110d4565b60405180910390f35b3480156100e357600080fd5b506100fe60048036038101906100f99190610def565b6102b5565b60405161010b91906110d4565b60405180910390f35b34801561012057600080fd5b5061013b60048036038101906101369190610e1c565b6102fe565b005b34801561014957600080fd5b506101526104ce565b60405161015f9190610ff2565b60405180910390f35b34801561017457600080fd5b5061017d61050b565b005b34801561018b57600080fd5b50610194610593565b005b3480156101a257600080fd5b506101ab610674565b6040516101b89190610fd7565b60405180910390f35b3480156101cd57600080fd5b506101e860048036038101906101e39190610def565b61069d565b6040516101f591906110d4565b60405180910390f35b6102066106e6565b005b34801561021457600080fd5b5061022f600480360381019061022a9190610def565b610a16565b60405161023c91906110d4565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190610def565b610a5f565b005b34801561027a57600080fd5b5061029560048036038101906102909190610e49565b610b57565b6040516102a29190610fd7565b60405180910390f35b6000600154905090565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61030e610309610b94565b610b9c565b1561034e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161034590611014565b60405180910390fd5b60016006600061035c610b94565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600081111561046a576000600460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610469818373ffffffffffffffffffffffffffffffffffffffff16610bf890919063ffffffff16565b5b600060066000610478610b94565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b60606040518060400160405280600581526020017f312e302e30000000000000000000000000000000000000000000000000000000815250905090565b610513610b94565b73ffffffffffffffffffffffffffffffffffffffff16610531610674565b73ffffffffffffffffffffffffffffffffffffffff1614610587576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057e906110b4565b60405180910390fd5b6105916000610cec565b565b61059b610b94565b73ffffffffffffffffffffffffffffffffffffffff166105b9610674565b73ffffffffffffffffffffffffffffffffffffffff161461060f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610606906110b4565b60405180910390fd5b60005b6001548110156106715760006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905061065d816102fe565b50808061066990611278565b915050610612565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6106ee610b94565b73ffffffffffffffffffffffffffffffffffffffff1661070c610674565b73ffffffffffffffffffffffffffffffffffffffff1614610762576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610759906110b4565b60405180910390fd5b600034116107a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079c90611094565b60405180910390fd5b60005b600154811015610a135760006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060006064600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205434610839919061119d565b61084391906112c1565b905060006064600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205434610894919061119d565b61089e919061116c565b9050600082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546108ed9190611116565b905080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550606481106109a65760648161094891906112c1565b600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550606481610998919061116c565b826109a39190611116565b91505b81600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109f59190611116565b92505081905550505050508080610a0b90611278565b9150506107a8565b50565b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610a67610b94565b73ffffffffffffffffffffffffffffffffffffffff16610a85610674565b73ffffffffffffffffffffffffffffffffffffffff1614610adb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad2906110b4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4290611034565b60405180910390fd5b610b5481610cec565b50565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600033905090565b60006001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16149050919050565b80471015610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3290611074565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff1682604051610c6190610fc2565b60006040518083038185875af1925050503d8060008114610c9e576040519150601f19603f3d011682016040523d82523d6000602084013e610ca3565b606091505b5050905080610ce7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cde90611054565b60405180910390fd5b505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081359050610dbf816114f7565b92915050565b600081359050610dd48161150e565b92915050565b600081359050610de981611525565b92915050565b600060208284031215610e0557610e04611350565b5b6000610e1384828501610db0565b91505092915050565b600060208284031215610e3257610e31611350565b5b6000610e4084828501610dc5565b91505092915050565b600060208284031215610e5f57610e5e611350565b5b6000610e6d84828501610dda565b91505092915050565b610e7f816111f7565b82525050565b6000610e90826110ef565b610e9a8185611105565b9350610eaa818560208601611245565b610eb381611355565b840191505092915050565b6000610ecb602383611105565b9150610ed682611366565b604082019050919050565b6000610eee602683611105565b9150610ef9826113b5565b604082019050919050565b6000610f11603a83611105565b9150610f1c82611404565b604082019050919050565b6000610f34601d83611105565b9150610f3f82611453565b602082019050919050565b6000610f57602e83611105565b9150610f628261147c565b604082019050919050565b6000610f7a602083611105565b9150610f85826114cb565b602082019050919050565b6000610f9d6000836110fa565b9150610fa8826114f4565b600082019050919050565b610fbc8161123b565b82525050565b6000610fcd82610f90565b9150819050919050565b6000602082019050610fec6000830184610e76565b92915050565b6000602082019050818103600083015261100c8184610e85565b905092915050565b6000602082019050818103600083015261102d81610ebe565b9050919050565b6000602082019050818103600083015261104d81610ee1565b9050919050565b6000602082019050818103600083015261106d81610f04565b9050919050565b6000602082019050818103600083015261108d81610f27565b9050919050565b600060208201905081810360008301526110ad81610f4a565b9050919050565b600060208201905081810360008301526110cd81610f6d565b9050919050565b60006020820190506110e96000830184610fb3565b92915050565b600081519050919050565b600081905092915050565b600082825260208201905092915050565b60006111218261123b565b915061112c8361123b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115611161576111606112f2565b5b828201905092915050565b60006111778261123b565b91506111828361123b565b92508261119257611191611321565b5b828204905092915050565b60006111a88261123b565b91506111b38361123b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156111ec576111eb6112f2565b5b828202905092915050565b60006112028261121b565b9050919050565b60006112148261121b565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015611263578082015181840152602081019050611248565b83811115611272576000848401525b50505050565b60006112838261123b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156112b6576112b56112f2565b5b600182019050919050565b60006112cc8261123b565b91506112d78361123b565b9250826112e7576112e6611321565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f466c65785061796d656e74446976696465723a2043616e206e6f74207265656e60008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f466c65785061796d656e74446976696465723a20496e73756666696369656e7460008201527f206d6573736167652076616c7565000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b611500816111f7565b811461150b57600080fd5b50565b61151781611209565b811461152257600080fd5b50565b61152e8161123b565b811461153957600080fd5b5056fea2646970667358221220f266f3fe04b0d61f6ea4386db0d3e2aa8bdf2a84f3d25fe034a0b53b397a8b4b64736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000e424c4f434b52554e52535f4e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000452554e5200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f67616c6c6572792e7765747061696e742e73747564696f2f52554e522f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f8f3b85602dd8b4effd5868c881305ec305c590c00000000000000000000000037df9c15af093878a22fda7a4d0a2b721838bdf30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000000a

Deployed Bytecode

0x6080604052600436106102ae5760003560e01c806370a0823111610175578063c807c39c116100dc578063d299602811610095578063e985e9c51161006f578063e985e9c514610a28578063ea1932db14610a65578063f2fde38b14610a8e578063fe9fbb8014610ab7576102ae565b8063d2996028146109b8578063dc1dc44e146109e1578063e61ef07914610a0c576102ae565b8063c807c39c14610882578063c87b56dd146108ad578063c9c77692146108ea578063cdd5bd2114610927578063cdef15cc14610952578063d0ebdbe71461098f576102ae565b80638ef79e911161012e5780638ef79e911461079a57806395d89b41146107c35780639a204a54146107ee578063a22cb46514610819578063ad86ace614610842578063b88d4fde14610859576102ae565b806370a08231146106bf578063715018a6146106fc57806372009407146107135780637705f9b51461072f5780637a7cce98146107585780638da5cb5b1461076f576102ae565b806333039d3d116102195780634f6ccce7116101d25780634f6ccce7146105ad57806359aed391146105ea57806362d0f657146106155780636352211e146106405780636b8dc3551461067d5780636c5c397b146106a8576102ae565b806333039d3d146104d5578063352567a21461050057806336a6aada1461052b57806342842e0e1461054257806343aa36de1461056b578063481c6a7514610582576102ae565b806318160ddd1161026b57806318160ddd146103d75780631c881fe0146104025780631d8c13bf1461042d57806323b872dd146104445780632f745c591461046d5780633166b465146104aa576102ae565b806301ffc9a7146102b35780630652a979146102f057806306fdde031461031b578063081812fc14610346578063095ea7b3146103835780630c06711d146103ac575b600080fd5b3480156102bf57600080fd5b506102da60048036038101906102d59190613f47565b610af4565b6040516102e79190614574565b60405180910390f35b3480156102fc57600080fd5b50610305610b6e565b6040516103129190614574565b60405180910390f35b34801561032757600080fd5b50610330610b81565b60405161033d919061458f565b60405180910390f35b34801561035257600080fd5b5061036d60048036038101906103689190613fee565b610c13565b60405161037a919061450d565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190613e26565b610c98565b005b3480156103b857600080fd5b506103c1610db0565b6040516103ce91906148d1565b60405180910390f35b3480156103e357600080fd5b506103ec610ddb565b6040516103f991906148d1565b60405180910390f35b34801561040e57600080fd5b50610417610de8565b60405161042491906148d1565b60405180910390f35b34801561043957600080fd5b50610442610dee565b005b34801561045057600080fd5b5061046b60048036038101906104669190613d10565b610e24565b005b34801561047957600080fd5b50610494600480360381019061048f9190613e26565b610e84565b6040516104a191906148d1565b60405180910390f35b3480156104b657600080fd5b506104bf610f29565b6040516104cc91906148d1565b60405180910390f35b3480156104e157600080fd5b506104ea610f56565b6040516104f791906148d1565b60405180910390f35b34801561050c57600080fd5b50610515610f5c565b60405161052291906148d1565b60405180910390f35b34801561053757600080fd5b50610540610f61565b005b34801561054e57600080fd5b5061056960048036038101906105649190613d10565b610f97565b005b34801561057757600080fd5b50610580610fb7565b005b34801561058e57600080fd5b50610597610fed565b6040516105a4919061450d565b60405180910390f35b3480156105b957600080fd5b506105d460048036038101906105cf9190613fee565b611017565b6040516105e191906148d1565b60405180910390f35b3480156105f657600080fd5b506105ff611088565b60405161060c91906148d1565b60405180910390f35b34801561062157600080fd5b5061062a6110c5565b60405161063791906148d1565b60405180910390f35b34801561064c57600080fd5b5061066760048036038101906106629190613fee565b6110ca565b604051610674919061450d565b60405180910390f35b34801561068957600080fd5b5061069261117c565b60405161069f91906148d1565b60405180910390f35b3480156106b457600080fd5b506106bd611182565b005b3480156106cb57600080fd5b506106e660048036038101906106e19190613ca3565b6111b8565b6040516106f391906148d1565b60405180910390f35b34801561070857600080fd5b50610711611270565b005b61072d6004803603810190610728919061401b565b6112f8565b005b34801561073b57600080fd5b5061075660048036038101906107519190613e66565b6115a4565b005b34801561076457600080fd5b5061076d611776565b005b34801561077b57600080fd5b506107846117ac565b604051610791919061450d565b60405180910390f35b3480156107a657600080fd5b506107c160048036038101906107bc9190613fa1565b6117d6565b005b3480156107cf57600080fd5b506107d8611805565b6040516107e5919061458f565b60405180910390f35b3480156107fa57600080fd5b50610803611897565b60405161081091906148d1565b60405180910390f35b34801561082557600080fd5b50610840600480360381019061083b9190613de6565b61189c565b005b34801561084e57600080fd5b50610857611a1d565b005b34801561086557600080fd5b50610880600480360381019061087b9190613d63565b611a53565b005b34801561088e57600080fd5b50610897611ab5565b6040516108a49190614574565b60405180910390f35b3480156108b957600080fd5b506108d460048036038101906108cf9190613fee565b611ac8565b6040516108e1919061458f565b60405180910390f35b3480156108f657600080fd5b50610911600480360381019061090c9190613ca3565b611b6f565b60405161091e9190614574565b60405180910390f35b34801561093357600080fd5b5061093c611bcb565b604051610949919061450d565b60405180910390f35b34801561095e57600080fd5b5061097960048036038101906109749190613ca3565b611bf3565b6040516109869190614574565b60405180910390f35b34801561099b57600080fd5b506109b660048036038101906109b19190613ca3565b611c4f565b005b3480156109c457600080fd5b506109df60048036038101906109da9190613ee7565b611d0f565b005b3480156109ed57600080fd5b506109f6611fb1565b604051610a039190614574565b60405180910390f35b610a266004803603810190610a21919061405b565b611fc4565b005b348015610a3457600080fd5b50610a4f6004803603810190610a4a9190613cd0565b6122b7565b604051610a5c9190614574565b60405180910390f35b348015610a7157600080fd5b50610a8c6004803603810190610a879190613ee7565b61234b565b005b348015610a9a57600080fd5b50610ab56004803603810190610ab09190613ca3565b61259d565b005b348015610ac357600080fd5b50610ade6004803603810190610ad99190613ca3565b612695565b604051610aeb9190614574565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b675750610b668261272c565b5b9050919050565b600a60159054906101000a900460ff1681565b606060008054610b9090614b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbc90614b5d565b8015610c095780601f10610bde57610100808354040283529160200191610c09565b820191906000526020600020905b815481529060010190602001808311610bec57829003601f168201915b5050505050905090565b6000610c1e8261280e565b610c5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5490614791565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610ca3826110ca565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b90614831565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d3361287a565b73ffffffffffffffffffffffffffffffffffffffff161480610d625750610d6181610d5c61287a565b6122b7565b5b610da1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d98906146f1565b60405180910390fd5b610dab8383612882565b505050565b60006064600e541115610dc65760009050610dd8565b600e546064610dd59190614a66565b90505b90565b6000600880549050905090565b6126ab81565b610dfe610df961287a565b612695565b610e0757600080fd5b6001600a60166101000a81548160ff021916908315150217905550565b610e35610e2f61287a565b8261293b565b610e74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6b90614851565b60405180910390fd5b610e7f838383612a19565b505050565b6000610e8f836111b8565b8210610ed0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec7906145b1565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600061186a600d541115610f405760009050610f53565b600d5461186a610f509190614a66565b90505b90565b61270f81565b606481565b610f71610f6c61287a565b612695565b610f7a57600080fd5b6001600a60156101000a81548160ff021916908315150217905550565b610fb283838360405180602001604052806000815250611a53565b505050565b610fc7610fc261287a565b612695565b610fd057600080fd5b6001600a60146101000a81548160ff021916908315150217905550565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000611021610ddb565b8210611062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105990614871565b60405180910390fd5b6008828154811061107657611075614cf6565b5b90600052602060002001549050919050565b600080600c54600d546126ab61109e9190614a66565b6110a89190614a66565b905060008110156110bd5760009150506110c2565b809150505b90565b600581565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116a90614731565b60405180910390fd5b80915050919050565b61186a81565b61119261118d61287a565b612695565b61119b57600080fd5b6000600a60146101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122090614711565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61127861287a565b73ffffffffffffffffffffffffffffffffffffffff166112966117ac565b73ffffffffffffffffffffffffffffffffffffffff16146112ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112e3906147b1565b60405180910390fd5b6112f66000612c75565b565b6000821161130557600080fd5b61131561131061287a565b612d3b565b1561131f57600080fd5b61270f61132a610ddb565b1061133457600080fd5b61133c611088565b82111561134857600080fd5b6014826011600061135761287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461139c9190614985565b11156113a757600080fd5b600a60149054906101000a900460ff166113c057600080fd5b8166b1a2bc2ec500006113d39190614a0c565b341015611415576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140c90614771565b60405180910390fd5b60016014600061142361287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff16021790555061147f3482612d97565b60005b8281101561153f576000611494610ddb565b60016114a09190614985565b90506001600c60008282546114b59190614985565b925050819055506001601160006114ca61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115139190614985565b9250508190555061152b61152561287a565b82612dbf565b50808061153790614bc0565b915050611482565b5060006014600061154e61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505050565b6115b46115af61287a565b612695565b6115bd57600080fd5b818190508484905014611605576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fc90614631565b60405180910390fd5b61270f611610610ddb565b10611650576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164790614811565b60405180910390fd5b600061165a610db0565b9050600080600090505b8686905081101561172a57600087878381811061168457611683614cf6565b5b90506020020160208101906116999190613ca3565b905060008686848181106116b0576116af614cf6565b5b90506020020135905060005b818110156117145760006116ce610ddb565b60016116da9190614985565b90506001600e60008282546116ef9190614985565b925050819055506117008482612dbf565b50808061170c90614bc0565b9150506116bc565b505050808061172290614bc0565b915050611664565b508181111561176e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611765906148b1565b60405180910390fd5b505050505050565b61178661178161287a565b612695565b61178f57600080fd5b6000600a60156101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6117e66117e161287a565b612695565b6117ef57600080fd5b8181600f9190611800929190613a10565b505050565b60606001805461181490614b5d565b80601f016020809104026020016040519081016040528092919081815260200182805461184090614b5d565b801561188d5780601f106118625761010080835404028352916020019161188d565b820191906000526020600020905b81548152906001019060200180831161187057829003601f168201915b5050505050905090565b601481565b6118a461287a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611912576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190990614671565b60405180910390fd5b806005600061191f61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119cc61287a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a119190614574565b60405180910390a35050565b611a2d611a2861287a565b612695565b611a3657600080fd5b6000600a60166101000a81548160ff021916908315150217905550565b611a64611a5e61287a565b8361293b565b611aa3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9a90614851565b60405180910390fd5b611aaf84848484612ddd565b50505050565b600a60149054906101000a900460ff1681565b6060611ad38261280e565b611b12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b09906147f1565b60405180910390fd5b6000611b1c612e39565b90506000815111611b3c5760405180602001604052806000815250611b67565b80611b4684612ecb565b604051602001611b579291906144e9565b6040516020818303038152906040525b915050919050565b60006001601360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16149050919050565b60007f00000000000000000000000041e29ee7f23284369c1011c22863db18ec1307d0905090565b60006001601260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16149050919050565b611c5761287a565b73ffffffffffffffffffffffffffffffffffffffff16611c756117ac565b73ffffffffffffffffffffffffffffffffffffffff1614611ccb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cc2906147b1565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611d1f611d1a61287a565b612695565b611d2857600080fd5b60028160ff161415611e725760005b83839050811015611e6c57600073ffffffffffffffffffffffffffffffffffffffff16848483818110611d6d57611d6c614cf6565b5b9050602002016020810190611d829190613ca3565b73ffffffffffffffffffffffffffffffffffffffff161415611dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd0906146d1565b60405180910390fd5b600160136000868685818110611df257611df1614cf6565b5b9050602002016020810190611e079190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611e6490614bc0565b915050611d37565b50611fac565b60005b83839050811015611faa57600073ffffffffffffffffffffffffffffffffffffffff16848483818110611eab57611eaa614cf6565b5b9050602002016020810190611ec09190613ca3565b73ffffffffffffffffffffffffffffffffffffffff161415611f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f0e906146d1565b60405180910390fd5b600160126000868685818110611f3057611f2f614cf6565b5b9050602002016020810190611f459190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080611fa290614bc0565b915050611e75565b505b505050565b600a60169054906101000a900460ff1681565b60008311611fd157600080fd5b611fe1611fdc61287a565b612d3b565b15611feb57600080fd5b61270f611ff6610ddb565b1061200057600080fd5b612008610f29565b83111561201457600080fd5b6005836010600061202361287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546120689190614985565b111561207357600080fd5b60028160ff1614156120d557600a60169054906101000a900460ff1661209857600080fd5b6120a86120a361287a565b611b6f565b6120b157600080fd5b82668e1bc9bf0400006120c49190614a0c565b3410156120d057600080fd5b612127565b600a60159054906101000a900460ff166120ee57600080fd5b6120fe6120f961287a565b611bf3565b61210757600080fd5b8266b1a2bc2ec5000061211a9190614a0c565b34101561212657600080fd5b5b60016014600061213561287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506121913483612d97565b60005b838110156122515760006121a6610ddb565b60016121b29190614985565b90506001600d60008282546121c79190614985565b925050819055506001601060006121dc61287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122259190614985565b9250508190555061223d61223761287a565b82612dbf565b50808061224990614bc0565b915050612194565b5060006014600061226061287a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61235b61235661287a565b612695565b61236457600080fd5b60028160ff1614156124865760005b83839050811015612480576123ae84848381811061239457612393614cf6565b5b90506020020160208101906123a99190613ca3565b611b6f565b6123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e490614691565b60405180910390fd5b60006013600086868581811061240657612405614cf6565b5b905060200201602081019061241b9190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061247890614bc0565b915050612373565b50612598565b60005b83839050811015612596576124c48484838181106124aa576124a9614cf6565b5b90506020020160208101906124bf9190613ca3565b611bf3565b612503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124fa90614891565b60405180910390fd5b60006012600086868581811061251c5761251b614cf6565b5b90506020020160208101906125319190613ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff160217905550808061258e90614bc0565b915050612489565b505b505050565b6125a561287a565b73ffffffffffffffffffffffffffffffffffffffff166125c36117ac565b73ffffffffffffffffffffffffffffffffffffffff1614612619576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612610906147b1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612689576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612680906145f1565b60405180910390fd5b61269281612c75565b50565b600061269f6117ac565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614806127255750600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127f757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061280757506128068261302c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166128f5836110ca565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006129468261280e565b612985576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297c906146b1565b60405180910390fd5b6000612990836110ca565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806129ff57508373ffffffffffffffffffffffffffffffffffffffff166129e784610c13565b73ffffffffffffffffffffffffffffffffffffffff16145b80612a105750612a0f81856122b7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612a39826110ca565b73ffffffffffffffffffffffffffffffffffffffff1614612a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a86906147d1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aff576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612af690614651565b60405180910390fd5b612b0a838383613096565b612b15600082612882565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b659190614a66565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bbc9190614985565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001601460008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1660ff16149050919050565b60008160ff161115612db157612dac826131aa565b612dbb565b612dba8261322e565b5b5050565b612dd9828260405180602001604052806000815250613332565b5050565b612de8848484612a19565b612df48484848461338d565b612e33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e2a906145d1565b60405180910390fd5b50505050565b6060600f8054612e4890614b5d565b80601f0160208091040260200160405190810160405280929190818152602001828054612e7490614b5d565b8015612ec15780601f10612e9657610100808354040283529160200191612ec1565b820191906000526020600020905b815481529060010190602001808311612ea457829003601f168201915b5050505050905090565b60606000821415612f13576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613027565b600082905060005b60008214612f45578080612f2e90614bc0565b915050600a82612f3e91906149db565b9150612f1b565b60008167ffffffffffffffff811115612f6157612f60614d25565b5b6040519080825280601f01601f191660200182016040528015612f935781602001600182028036833780820191505090505b5090505b6000851461302057600182612fac9190614a66565b9150600a85612fbb9190614c09565b6030612fc79190614985565b60f81b818381518110612fdd57612fdc614cf6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561301991906149db565b9450612f97565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6130a1838383613524565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130e4576130df81613529565b613123565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614613122576131218382613572565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561316657613161816136df565b6131a5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131a4576131a382826137b0565b5b5b505050565b7f00000000000000000000000041e29ee7f23284369c1011c22863db18ec1307d073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561321257600080fd5b505af1158015613226573d6000803e3d6000fd5b505050505050565b7f00000000000000000000000041e29ee7f23284369c1011c22863db18ec1307d073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561329657600080fd5b505af11580156132aa573d6000803e3d6000fd5b50505050507f00000000000000000000000041e29ee7f23284369c1011c22863db18ec1307d073ffffffffffffffffffffffffffffffffffffffff166388b6ff9c6040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561331757600080fd5b505af115801561332b573d6000803e3d6000fd5b5050505050565b61333c838361382f565b613349600084848461338d565b613388576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337f906145d1565b60405180910390fd5b505050565b60006133ae8473ffffffffffffffffffffffffffffffffffffffff166139fd565b15613517578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026133d761287a565b8786866040518563ffffffff1660e01b81526004016133f99493929190614528565b602060405180830381600087803b15801561341357600080fd5b505af192505050801561344457506040513d601f19601f820116820180604052508101906134419190613f74565b60015b6134c7573d8060008114613474576040519150601f19603f3d011682016040523d82523d6000602084013e613479565b606091505b506000815114156134bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134b6906145d1565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061351c565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161357f846111b8565b6135899190614a66565b905060006007600084815260200190815260200160002054905081811461366e576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506136f39190614a66565b905060006009600084815260200190815260200160002054905060006008838154811061372357613722614cf6565b5b90600052602060002001549050806008838154811061374557613744614cf6565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061379457613793614cc7565b5b6001900381819060005260206000200160009055905550505050565b60006137bb836111b8565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561389f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161389690614751565b60405180910390fd5b6138a88161280e565b156138e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016138df90614611565b60405180910390fd5b6138f460008383613096565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546139449190614985565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613a1c90614b5d565b90600052602060002090601f016020900481019282613a3e5760008555613a85565b82601f10613a5757803560ff1916838001178555613a85565b82800160010185558215613a85579182015b82811115613a84578235825591602001919060010190613a69565b5b509050613a929190613a96565b5090565b5b80821115613aaf576000816000905550600101613a97565b5090565b6000613ac6613ac184614911565b6148ec565b905082815260208101848484011115613ae257613ae1614d63565b5b613aed848285614b1b565b509392505050565b600081359050613b04816154a2565b92915050565b60008083601f840112613b2057613b1f614d59565b5b8235905067ffffffffffffffff811115613b3d57613b3c614d54565b5b602083019150836020820283011115613b5957613b58614d5e565b5b9250929050565b60008083601f840112613b7657613b75614d59565b5b8235905067ffffffffffffffff811115613b9357613b92614d54565b5b602083019150836020820283011115613baf57613bae614d5e565b5b9250929050565b600081359050613bc5816154b9565b92915050565b600081359050613bda816154d0565b92915050565b600081519050613bef816154d0565b92915050565b600082601f830112613c0a57613c09614d59565b5b8135613c1a848260208601613ab3565b91505092915050565b60008083601f840112613c3957613c38614d59565b5b8235905067ffffffffffffffff811115613c5657613c55614d54565b5b602083019150836001820283011115613c7257613c71614d5e565b5b9250929050565b600081359050613c88816154e7565b92915050565b600081359050613c9d816154fe565b92915050565b600060208284031215613cb957613cb8614d6d565b5b6000613cc784828501613af5565b91505092915050565b60008060408385031215613ce757613ce6614d6d565b5b6000613cf585828601613af5565b9250506020613d0685828601613af5565b9150509250929050565b600080600060608486031215613d2957613d28614d6d565b5b6000613d3786828701613af5565b9350506020613d4886828701613af5565b9250506040613d5986828701613c79565b9150509250925092565b60008060008060808587031215613d7d57613d7c614d6d565b5b6000613d8b87828801613af5565b9450506020613d9c87828801613af5565b9350506040613dad87828801613c79565b925050606085013567ffffffffffffffff811115613dce57613dcd614d68565b5b613dda87828801613bf5565b91505092959194509250565b60008060408385031215613dfd57613dfc614d6d565b5b6000613e0b85828601613af5565b9250506020613e1c85828601613bb6565b9150509250929050565b60008060408385031215613e3d57613e3c614d6d565b5b6000613e4b85828601613af5565b9250506020613e5c85828601613c79565b9150509250929050565b60008060008060408587031215613e8057613e7f614d6d565b5b600085013567ffffffffffffffff811115613e9e57613e9d614d68565b5b613eaa87828801613b0a565b9450945050602085013567ffffffffffffffff811115613ecd57613ecc614d68565b5b613ed987828801613b60565b925092505092959194509250565b600080600060408486031215613f0057613eff614d6d565b5b600084013567ffffffffffffffff811115613f1e57613f1d614d68565b5b613f2a86828701613b0a565b93509350506020613f3d86828701613c8e565b9150509250925092565b600060208284031215613f5d57613f5c614d6d565b5b6000613f6b84828501613bcb565b91505092915050565b600060208284031215613f8a57613f89614d6d565b5b6000613f9884828501613be0565b91505092915050565b60008060208385031215613fb857613fb7614d6d565b5b600083013567ffffffffffffffff811115613fd657613fd5614d68565b5b613fe285828601613c23565b92509250509250929050565b60006020828403121561400457614003614d6d565b5b600061401284828501613c79565b91505092915050565b6000806040838503121561403257614031614d6d565b5b600061404085828601613c79565b925050602061405185828601613c8e565b9150509250929050565b60008060006060848603121561407457614073614d6d565b5b600061408286828701613c79565b935050602061409386828701613c8e565b92505060406140a486828701613c8e565b9150509250925092565b6140b781614a9a565b82525050565b6140c681614aac565b82525050565b60006140d782614942565b6140e18185614958565b93506140f1818560208601614b2a565b6140fa81614d72565b840191505092915050565b60006141108261494d565b61411a8185614969565b935061412a818560208601614b2a565b61413381614d72565b840191505092915050565b60006141498261494d565b614153818561497a565b9350614163818560208601614b2a565b80840191505092915050565b600061417c602b83614969565b915061418782614d83565b604082019050919050565b600061419f603283614969565b91506141aa82614dd2565b604082019050919050565b60006141c2602683614969565b91506141cd82614e21565b604082019050919050565b60006141e5601c83614969565b91506141f082614e70565b602082019050919050565b6000614208602483614969565b915061421382614e99565b604082019050919050565b600061422b602483614969565b915061423682614ee8565b604082019050919050565b600061424e601983614969565b915061425982614f37565b602082019050919050565b6000614271603a83614969565b915061427c82614f60565b604082019050919050565b6000614294602c83614969565b915061429f82614faf565b604082019050919050565b60006142b7602183614969565b91506142c282614ffe565b604082019050919050565b60006142da603883614969565b91506142e58261504d565b604082019050919050565b60006142fd602a83614969565b91506143088261509c565b604082019050919050565b6000614320602983614969565b915061432b826150eb565b604082019050919050565b6000614343602083614969565b915061434e8261513a565b602082019050919050565b6000614366602583614969565b915061437182615163565b604082019050919050565b6000614389602c83614969565b9150614394826151b2565b604082019050919050565b60006143ac602083614969565b91506143b782615201565b602082019050919050565b60006143cf602983614969565b91506143da8261522a565b604082019050919050565b60006143f2602f83614969565b91506143fd82615279565b604082019050919050565b6000614415602283614969565b9150614420826152c8565b604082019050919050565b6000614438602183614969565b915061444382615317565b604082019050919050565b600061445b603183614969565b915061446682615366565b604082019050919050565b600061447e602c83614969565b9150614489826153b5565b604082019050919050565b60006144a1603a83614969565b91506144ac82615404565b604082019050919050565b60006144c4602b83614969565b91506144cf82615453565b604082019050919050565b6144e381614b04565b82525050565b60006144f5828561413e565b9150614501828461413e565b91508190509392505050565b600060208201905061452260008301846140ae565b92915050565b600060808201905061453d60008301876140ae565b61454a60208301866140ae565b61455760408301856144da565b818103606083015261456981846140cc565b905095945050505050565b600060208201905061458960008301846140bd565b92915050565b600060208201905081810360008301526145a98184614105565b905092915050565b600060208201905081810360008301526145ca8161416f565b9050919050565b600060208201905081810360008301526145ea81614192565b9050919050565b6000602082019050818103600083015261460a816141b5565b9050919050565b6000602082019050818103600083015261462a816141d8565b9050919050565b6000602082019050818103600083015261464a816141fb565b9050919050565b6000602082019050818103600083015261466a8161421e565b9050919050565b6000602082019050818103600083015261468a81614241565b9050919050565b600060208201905081810360008301526146aa81614264565b9050919050565b600060208201905081810360008301526146ca81614287565b9050919050565b600060208201905081810360008301526146ea816142aa565b9050919050565b6000602082019050818103600083015261470a816142cd565b9050919050565b6000602082019050818103600083015261472a816142f0565b9050919050565b6000602082019050818103600083015261474a81614313565b9050919050565b6000602082019050818103600083015261476a81614336565b9050919050565b6000602082019050818103600083015261478a81614359565b9050919050565b600060208201905081810360008301526147aa8161437c565b9050919050565b600060208201905081810360008301526147ca8161439f565b9050919050565b600060208201905081810360008301526147ea816143c2565b9050919050565b6000602082019050818103600083015261480a816143e5565b9050919050565b6000602082019050818103600083015261482a81614408565b9050919050565b6000602082019050818103600083015261484a8161442b565b9050919050565b6000602082019050818103600083015261486a8161444e565b9050919050565b6000602082019050818103600083015261488a81614471565b9050919050565b600060208201905081810360008301526148aa81614494565b9050919050565b600060208201905081810360008301526148ca816144b7565b9050919050565b60006020820190506148e660008301846144da565b92915050565b60006148f6614907565b90506149028282614b8f565b919050565b6000604051905090565b600067ffffffffffffffff82111561492c5761492b614d25565b5b61493582614d72565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061499082614b04565b915061499b83614b04565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156149d0576149cf614c3a565b5b828201905092915050565b60006149e682614b04565b91506149f183614b04565b925082614a0157614a00614c69565b5b828204905092915050565b6000614a1782614b04565b9150614a2283614b04565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614a5b57614a5a614c3a565b5b828202905092915050565b6000614a7182614b04565b9150614a7c83614b04565b925082821015614a8f57614a8e614c3a565b5b828203905092915050565b6000614aa582614ae4565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614b48578082015181840152602081019050614b2d565b83811115614b57576000848401525b50505050565b60006002820490506001821680614b7557607f821691505b60208210811415614b8957614b88614c98565b5b50919050565b614b9882614d72565b810181811067ffffffffffffffff82111715614bb757614bb6614d25565b5b80604052505050565b6000614bcb82614b04565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614bfe57614bfd614c3a565b5b600182019050919050565b6000614c1482614b04565b9150614c1f83614b04565b925082614c2f57614c2e614c69565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f424c4f434b52554e52533a20496e707574206c656e67746873206d757374206d60008201527f6174636800000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f424c4f434b52554e52533a204f6e65206f6620746865206163636f756e74732060008201527f6973206e6f7420612070726573616c652032206163636f756e74000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f424c4f434b52554e52533a20416464726573732030206e6f7420616c6c6f776560008201527f6400000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f424c4f434b52554e52533a204e6f7420656e6f7567682045746865722070726f60008201527f7669646564000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f424c4f434b52554e52533a204d6178696d756d20737570706c7920726561636860008201527f6564000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f424c4f434b52554e52533a204f6e65206f6620746865206163636f756e74732060008201527f6973206e6f7420612070726573616c652031206163636f756e74000000000000602082015250565b7f424c4f434b52554e52533a20416d6f756e74732065786365656420737570706c60008201527f7920617661696c61626c65000000000000000000000000000000000000000000602082015250565b6154ab81614a9a565b81146154b657600080fd5b50565b6154c281614aac565b81146154cd57600080fd5b50565b6154d981614ab8565b81146154e457600080fd5b50565b6154f081614b04565b81146154fb57600080fd5b50565b61550781614b0e565b811461551257600080fd5b5056fea26469706673582212208210d17610ad615afe1c47ae94f2ada8df44326910266a1dc78691c55b9c2ce564736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000001e0000000000000000000000000000000000000000000000000000000000000000e424c4f434b52554e52535f4e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000452554e5200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f67616c6c6572792e7765747061696e742e73747564696f2f52554e522f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000f8f3b85602dd8b4effd5868c881305ec305c590c00000000000000000000000037df9c15af093878a22fda7a4d0a2b721838bdf30000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000005a000000000000000000000000000000000000000000000000000000000000000a

-----Decoded View---------------
Arg [0] : name (string): BLOCKRUNRS_NFT
Arg [1] : symbol (string): RUNR
Arg [2] : tokenBaseURI_ (string): https://gallery.wetpaint.studio/RUNR/
Arg [3] : payoutAccounts_ (address[]): 0xf8f3B85602DD8b4EFFd5868c881305eC305C590c,0x37Df9c15af093878A22FDa7A4d0a2B721838BDf3
Arg [4] : payoutPercentages_ (uint256[]): 90,10

-----Encoded View---------------
18 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000180
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001e0
Arg [5] : 000000000000000000000000000000000000000000000000000000000000000e
Arg [6] : 424c4f434b52554e52535f4e4654000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 52554e5200000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000025
Arg [10] : 68747470733a2f2f67616c6c6572792e7765747061696e742e73747564696f2f
Arg [11] : 52554e522f000000000000000000000000000000000000000000000000000000
Arg [12] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [13] : 000000000000000000000000f8f3b85602dd8b4effd5868c881305ec305c590c
Arg [14] : 00000000000000000000000037df9c15af093878a22fda7a4d0a2b721838bdf3
Arg [15] : 0000000000000000000000000000000000000000000000000000000000000002
Arg [16] : 000000000000000000000000000000000000000000000000000000000000005a
Arg [17] : 000000000000000000000000000000000000000000000000000000000000000a


Deployed Bytecode Sourcemap

47224:10304:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31158:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47774:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19371:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20930:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20453:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49766:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31798:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47405:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54167:99;;;;;;;;;;;;;:::i;:::-;;21820:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31466:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49547:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47350:48;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47550;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53953:99;;;;;;;;;;;;;:::i;:::-;;22230:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54381:101;;;;;;;;;;;;;:::i;:::-;;49084:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31988:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49293:246;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47665:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19065:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47493:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54490:101;;;;;;;;;;;;;:::i;:::-;;18795:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38360:94;;;;;;;;;;;;;:::i;:::-;;51900:1010;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52942:1003;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54060:99;;;;;;;;;;;;;:::i;:::-;;37709:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56192:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19540:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47607:51;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21223:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54274:99;;;;;;;;;;;;;:::i;:::-;;22486:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47724:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19715:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50122:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49177:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49985:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56407:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54599:757;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47825:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50421:1471;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21589:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55364:820;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38609:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50259:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31158:224;31260:4;31299:35;31284:50;;;:11;:50;;;;:90;;;;31338:36;31362:11;31338:23;:36::i;:::-;31284:90;31277:97;;31158:224;;;:::o;47774:44::-;;;;;;;;;;;;;:::o;19371:100::-;19425:13;19458:5;19451:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19371:100;:::o;20930:221::-;21006:7;21034:16;21042:7;21034;:16::i;:::-;21026:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21119:15;:24;21135:7;21119:24;;;;;;;;;;;;;;;;;;;;;21112:31;;20930:221;;;:::o;20453:411::-;20534:13;20550:23;20565:7;20550:14;:23::i;:::-;20534:39;;20598:5;20592:11;;:2;:11;;;;20584:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;20692:5;20676:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;20701:37;20718:5;20725:12;:10;:12::i;:::-;20701:16;:37::i;:::-;20676:62;20654:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;20835:21;20844:2;20848:7;20835:8;:21::i;:::-;20523:341;20453:411;;:::o;49766:211::-;49821:7;47595:3;49845:14;;:35;49841:76;;;49904:1;49897:8;;;;49841:76;49955:14;;47595:3;49934:35;;;;:::i;:::-;49927:42;;49766:211;;:::o;31798:113::-;31859:7;31886:10;:17;;;;31879:24;;31798:113;:::o;47405:50::-;47450:5;47405:50;:::o;54167:99::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;54254:4:::1;54227:24;;:31;;;;;;;;;;;;;;;;;;54167:99::o:0;21820:339::-;22015:41;22034:12;:10;:12::i;:::-;22048:7;22015:18;:41::i;:::-;22007:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22123:28;22133:4;22139:2;22143:7;22123:9;:28::i;:::-;21820:339;;;:::o;31466:256::-;31563:7;31599:23;31616:5;31599:16;:23::i;:::-;31591:5;:31;31583:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;31688:12;:19;31701:5;31688:19;;;;;;;;;;;;;;;:26;31708:5;31688:26;;;;;;;;;;;;31681:33;;31466:256;;;;:::o;49547:211::-;49602:7;47538:5;49626:14;;:35;49622:76;;;49685:1;49678:8;;;;49622:76;49736:14;;47538:5;49715:35;;;;:::i;:::-;49708:42;;49547:211;;:::o;47350:48::-;47393:5;47350:48;:::o;47550:::-;47595:3;47550:48;:::o;53953:99::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;54040:4:::1;54013:24;;:31;;;;;;;;;;;;;;;;;;53953:99::o:0;22230:185::-;22368:39;22385:4;22391:2;22395:7;22368:39;;;;;;;;;;;;:16;:39::i;:::-;22230:185;;;:::o;54381:101::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;54470:4:::1;54444:23;;:30;;;;;;;;;;;;;;;;;;54381:101::o:0;49084:85::-;49126:7;49153:8;;;;;;;;;;;49146:15;;49084:85;:::o;31988:233::-;32063:7;32099:30;:28;:30::i;:::-;32091:5;:38;32083:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;32196:10;32207:5;32196:17;;;;;;;;:::i;:::-;;;;;;;;;;32189:24;;31988:233;;;:::o;49293:246::-;49348:7;49368:17;49426:14;;49409;;47450:5;49388:35;;;;:::i;:::-;:52;;;;:::i;:::-;49368:72;;49467:1;49455:9;:13;49451:54;;;49492:1;49485:8;;;;;49451:54;49522:9;49515:16;;;49293:246;;:::o;47665:50::-;47714:1;47665:50;:::o;19065:239::-;19137:7;19157:13;19173:7;:16;19181:7;19173:16;;;;;;;;;;;;;;;;;;;;;19157:32;;19225:1;19208:19;;:5;:19;;;;19200:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19291:5;19284:12;;;19065:239;;;:::o;47493:50::-;47538:5;47493:50;:::o;54490:101::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;54578:5:::1;54552:23;;:31;;;;;;;;;;;;;;;;;;54490:101::o:0;18795:208::-;18867:7;18912:1;18895:19;;:5;:19;;;;18887:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;18979:9;:16;18989:5;18979:16;;;;;;;;;;;;;;;;18972:23;;18795:208;;;:::o;38360:94::-;37940:12;:10;:12::i;:::-;37929:23;;:7;:5;:7::i;:::-;:23;;;37921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38425:21:::1;38443:1;38425:9;:21::i;:::-;38360:94::o:0;51900:1010::-;51995:1;51986:6;:10;51978:19;;;;;;52031:26;52044:12;:10;:12::i;:::-;52031;:26::i;:::-;52030:27;52008:60;;;;;;47393:5;52101:13;:11;:13::i;:::-;:32;52079:65;;;;;;52187:24;:22;:24::i;:::-;52177:6;:34;;52155:67;;;;;;47656:2;52298:6;52255:26;:40;52282:12;:10;:12::i;:::-;52255:40;;;;;;;;;;;;;;;;:49;;;;:::i;:::-;:75;;52233:108;;;;;;52360:23;;;;;;;;;;;52352:32;;;;;;52443:6;52430:10;:19;;;;:::i;:::-;52417:9;:32;;52395:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;52557:1;52527:13;:27;52541:12;:10;:12::i;:::-;52527:27;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;52571:35;52586:9;52597:8;52571:14;:35::i;:::-;52624:9;52619:240;52643:6;52639:1;:10;52619:240;;;52671:15;52693:13;:11;:13::i;:::-;52689:1;:17;;;;:::i;:::-;52671:35;;52739:1;52721:14;;:19;;;;;;;:::i;:::-;;;;;;;;52799:1;52755:26;:40;52782:12;:10;:12::i;:::-;52755:40;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;52815:32;52825:12;:10;:12::i;:::-;52839:7;52815:9;:32::i;:::-;52656:203;52651:3;;;;;:::i;:::-;;;;52619:240;;;;52901:1;52871:13;:27;52885:12;:10;:12::i;:::-;52871:27;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;51900:1010;;:::o;52942:1003::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;53118:7:::1;;:14;;53097:10;;:17;;:35;53075:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;47393:5;53229:13;:11;:13::i;:::-;:32;53207:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;53336:31;53370:24;:22;:24::i;:::-;53336:58;;53405:19;53442:9:::0;53454:1:::1;53442:13;;53437:357;53461:10;;:17;;53457:1;:21;53437:357;;;53500:17;53520:10;;53531:1;53520:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;53500:33;;53548:14;53565:7;;53573:1;53565:10;;;;;;;:::i;:::-;;;;;;;;53548:27;;53595:9;53590:193;53614:6;53610:1;:10;53590:193;;;53646:15;53668:13;:11;:13::i;:::-;53664:1;:17;;;;:::i;:::-;53646:35;;53718:1;53700:14;;:19;;;;;;;:::i;:::-;;;;;;;;53738:29;53748:9;53759:7;53738:9;:29::i;:::-;53627:156;53622:3;;;;;:::i;:::-;;;;53590:193;;;;53485:309;;53480:3;;;;;:::i;:::-;;;;53437:357;;;;53843:23;53828:11;:38;;53806:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;53064:881;;52942:1003:::0;;;;:::o;54060:99::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;54146:5:::1;54119:24;;:32;;;;;;;;;;;;;;;;;;54060:99::o:0;37709:87::-;37755:7;37782:6;;;;;;;;;;;37775:13;;37709:87;:::o;56192:108::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;56289:3:::1;;56273:13;:19;;;;;;;:::i;:::-;;56192:108:::0;;:::o;19540:104::-;19596:13;19629:7;19622:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19540:104;:::o;47607:51::-;47656:2;47607:51;:::o;21223:295::-;21338:12;:10;:12::i;:::-;21326:24;;:8;:24;;;;21318:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;21438:8;21393:18;:32;21412:12;:10;:12::i;:::-;21393:32;;;;;;;;;;;;;;;:42;21426:8;21393:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;21491:8;21462:48;;21477:12;:10;:12::i;:::-;21462:48;;;21501:8;21462:48;;;;;;:::i;:::-;;;;;;;;21223:295;;:::o;54274:99::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;54360:5:::1;54333:24;;:32;;;;;;;;;;;;;;;;;;54274:99::o:0;22486:328::-;22661:41;22680:12;:10;:12::i;:::-;22694:7;22661:18;:41::i;:::-;22653:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;22767:39;22781:4;22787:2;22791:7;22800:5;22767:13;:39::i;:::-;22486:328;;;;:::o;47724:43::-;;;;;;;;;;;;;:::o;19715:334::-;19788:13;19822:16;19830:7;19822;:16::i;:::-;19814:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;19903:21;19927:10;:8;:10::i;:::-;19903:34;;19979:1;19961:7;19955:21;:25;:86;;;;;;;;;;;;;;;;;20007:7;20016:18;:7;:16;:18::i;:::-;19990:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19955:86;19948:93;;;19715:334;;;:::o;50122:129::-;50187:4;50242:1;50211:18;:27;50230:7;50211:27;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;50204:39;;50122:129;;;:::o;49177:108::-;49226:7;49261:15;49246:31;;49177:108;:::o;49985:129::-;50050:4;50105:1;50074:18;:27;50093:7;50074:27;;;;;;;;;;;;;;;;;;;;;;;;;:32;;;50067:39;;49985:129;;;:::o;56407:95::-;37940:12;:10;:12::i;:::-;37929:23;;:7;:5;:7::i;:::-;:23;;;37921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56486:8:::1;56475;;:19;;;;;;;;;;;;;;;;;;56407:95:::0;:::o;54599:757::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;54754:1:::1;54739:11;:16;;;54735:614;;;54777:9;54772:267;54796:8;;:15;;54792:1;:19;54772:267;;;54890:1;54867:25;;:8;;54876:1;54867:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:25;;;;54837:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;55022:1;54988:18;:31;55007:8;;55016:1;55007:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;54988:31;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;54813:3;;;;;:::i;:::-;;;;54772:267;;;;54735:614;;;55076:9;55071:267;55095:8;;:15;;55091:1;:19;55071:267;;;55189:1;55166:25;;:8;;55175:1;55166:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:25;;;;55136:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;55321:1;55287:18;:31;55306:8;;55315:1;55306:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55287:31;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;55112:3;;;;;:::i;:::-;;;;55071:267;;;;54735:614;54599:757:::0;;;:::o;47825:44::-;;;;;;;;;;;;;:::o;50421:1471::-;50576:1;50567:6;:10;50559:19;;;;;;50612:26;50625:12;:10;:12::i;:::-;50612;:26::i;:::-;50611:27;50589:60;;;;;;47393:5;50682:13;:11;:13::i;:::-;:32;50660:65;;;;;;50768:24;:22;:24::i;:::-;50758:6;:34;;50736:67;;;;;;47714:1;50879:6;50836:26;:40;50863:12;:10;:12::i;:::-;50836:40;;;;;;;;;;;;;;;;:49;;;;:::i;:::-;:75;;50814:108;;;;;;50954:1;50939:11;:16;;;50935:562;;;50998:24;;;;;;;;;;;50972:65;;;;;;51078:31;51096:12;:10;:12::i;:::-;51078:17;:31::i;:::-;51052:72;;;;;;51191:6;51178:10;:19;;;;:::i;:::-;51165:9;:32;;51139:73;;;;;;50935:562;;;51271:24;;;;;;;;;;;51245:65;;;;;;51351:31;51369:12;:10;:12::i;:::-;51351:17;:31::i;:::-;51325:72;;;;;;51464:6;51451:10;:19;;;;:::i;:::-;51438:9;:32;;51412:73;;;;;;50935:562;51539:1;51509:13;:27;51523:12;:10;:12::i;:::-;51509:27;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;51553:35;51568:9;51579:8;51553:14;:35::i;:::-;51606:9;51601:240;51625:6;51621:1;:10;51601:240;;;51653:15;51675:13;:11;:13::i;:::-;51671:1;:17;;;;:::i;:::-;51653:35;;51721:1;51703:14;;:19;;;;;;;:::i;:::-;;;;;;;;51781:1;51737:26;:40;51764:12;:10;:12::i;:::-;51737:40;;;;;;;;;;;;;;;;:45;;;;;;;:::i;:::-;;;;;;;;51797:32;51807:12;:10;:12::i;:::-;51821:7;51797:9;:32::i;:::-;51638:203;51633:3;;;;;:::i;:::-;;;;51601:240;;;;51883:1;51853:13;:27;51867:12;:10;:12::i;:::-;51853:27;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;50421:1471;;;:::o;21589:164::-;21686:4;21710:18;:25;21729:5;21710:25;;;;;;;;;;;;;;;:35;21736:8;21710:35;;;;;;;;;;;;;;;;;;;;;;;;;21703:42;;21589:164;;;;:::o;55364:820::-;49008:26;49021:12;:10;:12::i;:::-;49008;:26::i;:::-;49000:35;;;;;;55522:1:::1;55507:11;:16;;;55503:674;;;55545:9;55540:297;55564:8;;:15;;55560:1;:19;55540:297;;;55635:30;55653:8;;55662:1;55653:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55635:17;:30::i;:::-;55605:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;55820:1;55786:18;:31;55805:8;;55814:1;55805:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55786:31;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;55581:3;;;;;:::i;:::-;;;;55540:297;;;;55503:674;;;55874:9;55869:297;55893:8;;:15;;55889:1;:19;55869:297;;;55964:30;55982:8;;55991:1;55982:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;55964:17;:30::i;:::-;55934:162;;;;;;;;;;;;:::i;:::-;;;;;;;;;56149:1;56115:18;:31;56134:8;;56143:1;56134:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;56115:31;;;;;;;;;;;;;;;;:35;;;;;;;;;;;;;;;;;;55910:3;;;;;:::i;:::-;;;;55869:297;;;;55503:674;55364:820:::0;;;:::o;38609:192::-;37940:12;:10;:12::i;:::-;37929:23;;:7;:5;:7::i;:::-;:23;;;37921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;38718:1:::1;38698:22;;:8;:22;;;;38690:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;38774:19;38784:8;38774:9;:19::i;:::-;38609:192:::0;:::o;50259:133::-;50319:4;50354:7;:5;:7::i;:::-;50343:18;;:7;:18;;;:41;;;;50376:8;;;;;;;;;;;50365:19;;:7;:19;;;50343:41;50336:48;;50259:133;;;:::o;18426:305::-;18528:4;18580:25;18565:40;;;:11;:40;;;;:105;;;;18637:33;18622:48;;;:11;:48;;;;18565:105;:158;;;;18687:36;18711:11;18687:23;:36::i;:::-;18565:158;18545:178;;18426:305;;;:::o;24324:127::-;24389:4;24441:1;24413:30;;:7;:16;24421:7;24413:16;;;;;;;;;;;;;;;;;;;;;:30;;;;24406:37;;24324:127;;;:::o;10652:98::-;10705:7;10732:10;10725:17;;10652:98;:::o;28306:174::-;28408:2;28381:15;:24;28397:7;28381:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;28464:7;28460:2;28426:46;;28435:23;28450:7;28435:14;:23::i;:::-;28426:46;;;;;;;;;;;;28306:174;;:::o;24618:348::-;24711:4;24736:16;24744:7;24736;:16::i;:::-;24728:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24812:13;24828:23;24843:7;24828:14;:23::i;:::-;24812:39;;24881:5;24870:16;;:7;:16;;;:51;;;;24914:7;24890:31;;:20;24902:7;24890:11;:20::i;:::-;:31;;;24870:51;:87;;;;24925:32;24942:5;24949:7;24925:16;:32::i;:::-;24870:87;24862:96;;;24618:348;;;;:::o;27610:578::-;27769:4;27742:31;;:23;27757:7;27742:14;:23::i;:::-;:31;;;27734:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;27852:1;27838:16;;:2;:16;;;;27830:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;27908:39;27929:4;27935:2;27939:7;27908:20;:39::i;:::-;28012:29;28029:1;28033:7;28012:8;:29::i;:::-;28073:1;28054:9;:15;28064:4;28054:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;28102:1;28085:9;:13;28095:2;28085:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28133:2;28114:7;:16;28122:7;28114:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28172:7;28168:2;28153:27;;28162:4;28153:27;;;;;;;;;;;;27610:578;;;:::o;38809:173::-;38865:16;38884:6;;;;;;;;;;;38865:25;;38910:8;38901:6;;:17;;;;;;;;;;;;;;;;;;38965:8;38934:40;;38955:8;38934:40;;;;;;;;;;;;38854:128;38809:173;:::o;57405:120::-;57466:4;57516:1;57490:13;:22;57504:7;57490:22;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;57483:34;;57405:120;;;:::o;56907:227::-;56996:1;56985:8;:12;;;56981:146;;;57040:21;57055:5;57040:14;:21::i;:::-;56981:146;;;57094:21;57109:5;57094:14;:21::i;:::-;56981:146;56907:227;;:::o;25308:110::-;25384:26;25394:2;25398:7;25384:26;;;;;;;;;;;;:9;:26::i;:::-;25308:110;;:::o;23696:315::-;23853:28;23863:4;23869:2;23873:7;23853:9;:28::i;:::-;23900:48;23923:4;23929:2;23933:7;23942:5;23900:22;:48::i;:::-;23892:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;23696:315;;;;:::o;56772:106::-;56824:13;56857;56850:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56772:106;:::o;215:723::-;271:13;501:1;492:5;:10;488:53;;;519:10;;;;;;;;;;;;;;;;;;;;;488:53;551:12;566:5;551:20;;582:14;607:78;622:1;614:4;:9;607:78;;640:8;;;;;:::i;:::-;;;;671:2;663:10;;;;;:::i;:::-;;;607:78;;;695:19;727:6;717:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;695:39;;745:154;761:1;752:5;:10;745:154;;789:1;779:11;;;;;:::i;:::-;;;856:2;848:5;:10;;;;:::i;:::-;835:2;:24;;;;:::i;:::-;822:39;;805:6;812;805:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;885:2;876:11;;;;;:::i;:::-;;;745:154;;;923:6;909:21;;;;;215:723;;;;:::o;11434:157::-;11519:4;11558:25;11543:40;;;:11;:40;;;;11536:47;;11434:157;;;:::o;32834:589::-;32978:45;33005:4;33011:2;33015:7;32978:26;:45::i;:::-;33056:1;33040:18;;:4;:18;;;33036:187;;;33075:40;33107:7;33075:31;:40::i;:::-;33036:187;;;33145:2;33137:10;;:4;:10;;;33133:90;;33164:47;33197:4;33203:7;33164:32;:47::i;:::-;33133:90;33036:187;33251:1;33237:16;;:2;:16;;;33233:183;;;33270:45;33307:7;33270:36;:45::i;:::-;33233:183;;;33343:4;33337:10;;:2;:10;;;33333:83;;33364:40;33392:2;33396:7;33364:27;:40::i;:::-;33333:83;33233:183;32834:589;;;:::o;57292:105::-;57350:15;:23;;;57381:5;57350:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57292:105;:::o;57142:142::-;57200:15;:23;;;57231:5;57200:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57250:15;:24;;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57142:142;:::o;25645:321::-;25775:18;25781:2;25785:7;25775:5;:18::i;:::-;25826:54;25857:1;25861:2;25865:7;25874:5;25826:22;:54::i;:::-;25804:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;25645:321;;;:::o;29045:799::-;29200:4;29221:15;:2;:13;;;:15::i;:::-;29217:620;;;29273:2;29257:36;;;29294:12;:10;:12::i;:::-;29308:4;29314:7;29323:5;29257:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;29253:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29516:1;29499:6;:13;:18;29495:272;;;29542:60;;;;;;;;;;:::i;:::-;;;;;;;;29495:272;29717:6;29711:13;29702:6;29698:2;29694:15;29687:38;29253:529;29390:41;;;29380:51;;;:6;:51;;;;29373:58;;;;;29217:620;29821:4;29814:11;;29045:799;;;;;;;:::o;30416:126::-;;;;:::o;34146:164::-;34250:10;:17;;;;34223:15;:24;34239:7;34223:24;;;;;;;;;;;:44;;;;34278:10;34294:7;34278:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34146:164;:::o;34937:988::-;35203:22;35253:1;35228:22;35245:4;35228:16;:22::i;:::-;:26;;;;:::i;:::-;35203:51;;35265:18;35286:17;:26;35304:7;35286:26;;;;;;;;;;;;35265:47;;35433:14;35419:10;:28;35415:328;;35464:19;35486:12;:18;35499:4;35486:18;;;;;;;;;;;;;;;:34;35505:14;35486:34;;;;;;;;;;;;35464:56;;35570:11;35537:12;:18;35550:4;35537:18;;;;;;;;;;;;;;;:30;35556:10;35537:30;;;;;;;;;;;:44;;;;35687:10;35654:17;:30;35672:11;35654:30;;;;;;;;;;;:43;;;;35449:294;35415:328;35839:17;:26;35857:7;35839:26;;;;;;;;;;;35832:33;;;35883:12;:18;35896:4;35883:18;;;;;;;;;;;;;;;:34;35902:14;35883:34;;;;;;;;;;;35876:41;;;35018:907;;34937:988;;:::o;36220:1079::-;36473:22;36518:1;36498:10;:17;;;;:21;;;;:::i;:::-;36473:46;;36530:18;36551:15;:24;36567:7;36551:24;;;;;;;;;;;;36530:45;;36902:19;36924:10;36935:14;36924:26;;;;;;;;:::i;:::-;;;;;;;;;;36902:48;;36988:11;36963:10;36974;36963:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;37099:10;37068:15;:28;37084:11;37068:28;;;;;;;;;;;:41;;;;37240:15;:24;37256:7;37240:24;;;;;;;;;;;37233:31;;;37275:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36291:1008;;;36220:1079;:::o;33724:221::-;33809:14;33826:20;33843:2;33826:16;:20::i;:::-;33809:37;;33884:7;33857:12;:16;33870:2;33857:16;;;;;;;;;;;;;;;:24;33874:6;33857:24;;;;;;;;;;;:34;;;;33931:6;33902:17;:26;33920:7;33902:26;;;;;;;;;;;:35;;;;33798:147;33724:221;;:::o;26302:382::-;26396:1;26382:16;;:2;:16;;;;26374:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;26455:16;26463:7;26455;:16::i;:::-;26454:17;26446:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;26517:45;26546:1;26550:2;26554:7;26517:20;:45::i;:::-;26592:1;26575:9;:13;26585:2;26575:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;26623:2;26604:7;:16;26612:7;26604:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;26668:7;26664:2;26643:33;;26660:1;26643:33;;;;;;;;;;;;26302:382;;:::o;2584:387::-;2644:4;2852:12;2919:7;2907:20;2899:28;;2962:1;2955:4;:8;2948:15;;;2584:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;585:568::-;658:8;668:6;718:3;711:4;703:6;699:17;695:27;685:122;;726:79;;:::i;:::-;685:122;839:6;826:20;816:30;;869:18;861:6;858:30;855:117;;;891:79;;:::i;:::-;855:117;1005:4;997:6;993:17;981:29;;1059:3;1051:4;1043:6;1039:17;1029:8;1025:32;1022:41;1019:128;;;1066:79;;:::i;:::-;1019:128;585:568;;;;;:::o;1176:::-;1249:8;1259:6;1309:3;1302:4;1294:6;1290:17;1286:27;1276:122;;1317:79;;:::i;:::-;1276:122;1430:6;1417:20;1407:30;;1460:18;1452:6;1449:30;1446:117;;;1482:79;;:::i;:::-;1446:117;1596:4;1588:6;1584:17;1572:29;;1650:3;1642:4;1634:6;1630:17;1620:8;1616:32;1613:41;1610:128;;;1657:79;;:::i;:::-;1610:128;1176:568;;;;;:::o;1750:133::-;1793:5;1831:6;1818:20;1809:29;;1847:30;1871:5;1847:30;:::i;:::-;1750:133;;;;:::o;1889:137::-;1934:5;1972:6;1959:20;1950:29;;1988:32;2014:5;1988:32;:::i;:::-;1889:137;;;;:::o;2032:141::-;2088:5;2119:6;2113:13;2104:22;;2135:32;2161:5;2135:32;:::i;:::-;2032:141;;;;:::o;2192:338::-;2247:5;2296:3;2289:4;2281:6;2277:17;2273:27;2263:122;;2304:79;;:::i;:::-;2263:122;2421:6;2408:20;2446:78;2520:3;2512:6;2505:4;2497:6;2493:17;2446:78;:::i;:::-;2437:87;;2253:277;2192:338;;;;:::o;2550:553::-;2608:8;2618:6;2668:3;2661:4;2653:6;2649:17;2645:27;2635:122;;2676:79;;:::i;:::-;2635:122;2789:6;2776:20;2766:30;;2819:18;2811:6;2808:30;2805:117;;;2841:79;;:::i;:::-;2805:117;2955:4;2947:6;2943:17;2931:29;;3009:3;3001:4;2993:6;2989:17;2979:8;2975:32;2972:41;2969:128;;;3016:79;;:::i;:::-;2969:128;2550:553;;;;;:::o;3109:139::-;3155:5;3193:6;3180:20;3171:29;;3209:33;3236:5;3209:33;:::i;:::-;3109:139;;;;:::o;3254:135::-;3298:5;3336:6;3323:20;3314:29;;3352:31;3377:5;3352:31;:::i;:::-;3254:135;;;;:::o;3395:329::-;3454:6;3503:2;3491:9;3482:7;3478:23;3474:32;3471:119;;;3509:79;;:::i;:::-;3471:119;3629:1;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3600:117;3395:329;;;;:::o;3730:474::-;3798:6;3806;3855:2;3843:9;3834:7;3830:23;3826:32;3823:119;;;3861:79;;:::i;:::-;3823:119;3981:1;4006:53;4051:7;4042:6;4031:9;4027:22;4006:53;:::i;:::-;3996:63;;3952:117;4108:2;4134:53;4179:7;4170:6;4159:9;4155:22;4134:53;:::i;:::-;4124:63;;4079:118;3730:474;;;;;:::o;4210:619::-;4287:6;4295;4303;4352:2;4340:9;4331:7;4327:23;4323:32;4320:119;;;4358:79;;:::i;:::-;4320:119;4478:1;4503:53;4548:7;4539:6;4528:9;4524:22;4503:53;:::i;:::-;4493:63;;4449:117;4605:2;4631:53;4676:7;4667:6;4656:9;4652:22;4631:53;:::i;:::-;4621:63;;4576:118;4733:2;4759:53;4804:7;4795:6;4784:9;4780:22;4759:53;:::i;:::-;4749:63;;4704:118;4210:619;;;;;:::o;4835:943::-;4930:6;4938;4946;4954;5003:3;4991:9;4982:7;4978:23;4974:33;4971:120;;;5010:79;;:::i;:::-;4971:120;5130:1;5155:53;5200:7;5191:6;5180:9;5176:22;5155:53;:::i;:::-;5145:63;;5101:117;5257:2;5283:53;5328:7;5319:6;5308:9;5304:22;5283:53;:::i;:::-;5273:63;;5228:118;5385:2;5411:53;5456:7;5447:6;5436:9;5432:22;5411:53;:::i;:::-;5401:63;;5356:118;5541:2;5530:9;5526:18;5513:32;5572:18;5564:6;5561:30;5558:117;;;5594:79;;:::i;:::-;5558:117;5699:62;5753:7;5744:6;5733:9;5729:22;5699:62;:::i;:::-;5689:72;;5484:287;4835:943;;;;;;;:::o;5784:468::-;5849:6;5857;5906:2;5894:9;5885:7;5881:23;5877:32;5874:119;;;5912:79;;:::i;:::-;5874:119;6032:1;6057:53;6102:7;6093:6;6082:9;6078:22;6057:53;:::i;:::-;6047:63;;6003:117;6159:2;6185:50;6227:7;6218:6;6207:9;6203:22;6185:50;:::i;:::-;6175:60;;6130:115;5784:468;;;;;:::o;6258:474::-;6326:6;6334;6383:2;6371:9;6362:7;6358:23;6354:32;6351:119;;;6389:79;;:::i;:::-;6351:119;6509:1;6534:53;6579:7;6570:6;6559:9;6555:22;6534:53;:::i;:::-;6524:63;;6480:117;6636:2;6662:53;6707:7;6698:6;6687:9;6683:22;6662:53;:::i;:::-;6652:63;;6607:118;6258:474;;;;;:::o;6738:934::-;6860:6;6868;6876;6884;6933:2;6921:9;6912:7;6908:23;6904:32;6901:119;;;6939:79;;:::i;:::-;6901:119;7087:1;7076:9;7072:17;7059:31;7117:18;7109:6;7106:30;7103:117;;;7139:79;;:::i;:::-;7103:117;7252:80;7324:7;7315:6;7304:9;7300:22;7252:80;:::i;:::-;7234:98;;;;7030:312;7409:2;7398:9;7394:18;7381:32;7440:18;7432:6;7429:30;7426:117;;;7462:79;;:::i;:::-;7426:117;7575:80;7647:7;7638:6;7627:9;7623:22;7575:80;:::i;:::-;7557:98;;;;7352:313;6738:934;;;;;;;:::o;7678:700::-;7771:6;7779;7787;7836:2;7824:9;7815:7;7811:23;7807:32;7804:119;;;7842:79;;:::i;:::-;7804:119;7990:1;7979:9;7975:17;7962:31;8020:18;8012:6;8009:30;8006:117;;;8042:79;;:::i;:::-;8006:117;8155:80;8227:7;8218:6;8207:9;8203:22;8155:80;:::i;:::-;8137:98;;;;7933:312;8284:2;8310:51;8353:7;8344:6;8333:9;8329:22;8310:51;:::i;:::-;8300:61;;8255:116;7678:700;;;;;:::o;8384:327::-;8442:6;8491:2;8479:9;8470:7;8466:23;8462:32;8459:119;;;8497:79;;:::i;:::-;8459:119;8617:1;8642:52;8686:7;8677:6;8666:9;8662:22;8642:52;:::i;:::-;8632:62;;8588:116;8384:327;;;;:::o;8717:349::-;8786:6;8835:2;8823:9;8814:7;8810:23;8806:32;8803:119;;;8841:79;;:::i;:::-;8803:119;8961:1;8986:63;9041:7;9032:6;9021:9;9017:22;8986:63;:::i;:::-;8976:73;;8932:127;8717:349;;;;:::o;9072:529::-;9143:6;9151;9200:2;9188:9;9179:7;9175:23;9171:32;9168:119;;;9206:79;;:::i;:::-;9168:119;9354:1;9343:9;9339:17;9326:31;9384:18;9376:6;9373:30;9370:117;;;9406:79;;:::i;:::-;9370:117;9519:65;9576:7;9567:6;9556:9;9552:22;9519:65;:::i;:::-;9501:83;;;;9297:297;9072:529;;;;;:::o;9607:329::-;9666:6;9715:2;9703:9;9694:7;9690:23;9686:32;9683:119;;;9721:79;;:::i;:::-;9683:119;9841:1;9866:53;9911:7;9902:6;9891:9;9887:22;9866:53;:::i;:::-;9856:63;;9812:117;9607:329;;;;:::o;9942:470::-;10008:6;10016;10065:2;10053:9;10044:7;10040:23;10036:32;10033:119;;;10071:79;;:::i;:::-;10033:119;10191:1;10216:53;10261:7;10252:6;10241:9;10237:22;10216:53;:::i;:::-;10206:63;;10162:117;10318:2;10344:51;10387:7;10378:6;10367:9;10363:22;10344:51;:::i;:::-;10334:61;;10289:116;9942:470;;;;;:::o;10418:611::-;10491:6;10499;10507;10556:2;10544:9;10535:7;10531:23;10527:32;10524:119;;;10562:79;;:::i;:::-;10524:119;10682:1;10707:53;10752:7;10743:6;10732:9;10728:22;10707:53;:::i;:::-;10697:63;;10653:117;10809:2;10835:51;10878:7;10869:6;10858:9;10854:22;10835:51;:::i;:::-;10825:61;;10780:116;10935:2;10961:51;11004:7;10995:6;10984:9;10980:22;10961:51;:::i;:::-;10951:61;;10906:116;10418:611;;;;;:::o;11035:118::-;11122:24;11140:5;11122:24;:::i;:::-;11117:3;11110:37;11035:118;;:::o;11159:109::-;11240:21;11255:5;11240:21;:::i;:::-;11235:3;11228:34;11159:109;;:::o;11274:360::-;11360:3;11388:38;11420:5;11388:38;:::i;:::-;11442:70;11505:6;11500:3;11442:70;:::i;:::-;11435:77;;11521:52;11566:6;11561:3;11554:4;11547:5;11543:16;11521:52;:::i;:::-;11598:29;11620:6;11598:29;:::i;:::-;11593:3;11589:39;11582:46;;11364:270;11274:360;;;;:::o;11640:364::-;11728:3;11756:39;11789:5;11756:39;:::i;:::-;11811:71;11875:6;11870:3;11811:71;:::i;:::-;11804:78;;11891:52;11936:6;11931:3;11924:4;11917:5;11913:16;11891:52;:::i;:::-;11968:29;11990:6;11968:29;:::i;:::-;11963:3;11959:39;11952:46;;11732:272;11640:364;;;;:::o;12010:377::-;12116:3;12144:39;12177:5;12144:39;:::i;:::-;12199:89;12281:6;12276:3;12199:89;:::i;:::-;12192:96;;12297:52;12342:6;12337:3;12330:4;12323:5;12319:16;12297:52;:::i;:::-;12374:6;12369:3;12365:16;12358:23;;12120:267;12010:377;;;;:::o;12393:366::-;12535:3;12556:67;12620:2;12615:3;12556:67;:::i;:::-;12549:74;;12632:93;12721:3;12632:93;:::i;:::-;12750:2;12745:3;12741:12;12734:19;;12393:366;;;:::o;12765:::-;12907:3;12928:67;12992:2;12987:3;12928:67;:::i;:::-;12921:74;;13004:93;13093:3;13004:93;:::i;:::-;13122:2;13117:3;13113:12;13106:19;;12765:366;;;:::o;13137:::-;13279:3;13300:67;13364:2;13359:3;13300:67;:::i;:::-;13293:74;;13376:93;13465:3;13376:93;:::i;:::-;13494:2;13489:3;13485:12;13478:19;;13137:366;;;:::o;13509:::-;13651:3;13672:67;13736:2;13731:3;13672:67;:::i;:::-;13665:74;;13748:93;13837:3;13748:93;:::i;:::-;13866:2;13861:3;13857:12;13850:19;;13509:366;;;:::o;13881:::-;14023:3;14044:67;14108:2;14103:3;14044:67;:::i;:::-;14037:74;;14120:93;14209:3;14120:93;:::i;:::-;14238:2;14233:3;14229:12;14222:19;;13881:366;;;:::o;14253:::-;14395:3;14416:67;14480:2;14475:3;14416:67;:::i;:::-;14409:74;;14492:93;14581:3;14492:93;:::i;:::-;14610:2;14605:3;14601:12;14594:19;;14253:366;;;:::o;14625:::-;14767:3;14788:67;14852:2;14847:3;14788:67;:::i;:::-;14781:74;;14864:93;14953:3;14864:93;:::i;:::-;14982:2;14977:3;14973:12;14966:19;;14625:366;;;:::o;14997:::-;15139:3;15160:67;15224:2;15219:3;15160:67;:::i;:::-;15153:74;;15236:93;15325:3;15236:93;:::i;:::-;15354:2;15349:3;15345:12;15338:19;;14997:366;;;:::o;15369:::-;15511:3;15532:67;15596:2;15591:3;15532:67;:::i;:::-;15525:74;;15608:93;15697:3;15608:93;:::i;:::-;15726:2;15721:3;15717:12;15710:19;;15369:366;;;:::o;15741:::-;15883:3;15904:67;15968:2;15963:3;15904:67;:::i;:::-;15897:74;;15980:93;16069:3;15980:93;:::i;:::-;16098:2;16093:3;16089:12;16082:19;;15741:366;;;:::o;16113:::-;16255:3;16276:67;16340:2;16335:3;16276:67;:::i;:::-;16269:74;;16352:93;16441:3;16352:93;:::i;:::-;16470:2;16465:3;16461:12;16454:19;;16113:366;;;:::o;16485:::-;16627:3;16648:67;16712:2;16707:3;16648:67;:::i;:::-;16641:74;;16724:93;16813:3;16724:93;:::i;:::-;16842:2;16837:3;16833:12;16826:19;;16485:366;;;:::o;16857:::-;16999:3;17020:67;17084:2;17079:3;17020:67;:::i;:::-;17013:74;;17096:93;17185:3;17096:93;:::i;:::-;17214:2;17209:3;17205:12;17198:19;;16857:366;;;:::o;17229:::-;17371:3;17392:67;17456:2;17451:3;17392:67;:::i;:::-;17385:74;;17468:93;17557:3;17468:93;:::i;:::-;17586:2;17581:3;17577:12;17570:19;;17229:366;;;:::o;17601:::-;17743:3;17764:67;17828:2;17823:3;17764:67;:::i;:::-;17757:74;;17840:93;17929:3;17840:93;:::i;:::-;17958:2;17953:3;17949:12;17942:19;;17601:366;;;:::o;17973:::-;18115:3;18136:67;18200:2;18195:3;18136:67;:::i;:::-;18129:74;;18212:93;18301:3;18212:93;:::i;:::-;18330:2;18325:3;18321:12;18314:19;;17973:366;;;:::o;18345:::-;18487:3;18508:67;18572:2;18567:3;18508:67;:::i;:::-;18501:74;;18584:93;18673:3;18584:93;:::i;:::-;18702:2;18697:3;18693:12;18686:19;;18345:366;;;:::o;18717:::-;18859:3;18880:67;18944:2;18939:3;18880:67;:::i;:::-;18873:74;;18956:93;19045:3;18956:93;:::i;:::-;19074:2;19069:3;19065:12;19058:19;;18717:366;;;:::o;19089:::-;19231:3;19252:67;19316:2;19311:3;19252:67;:::i;:::-;19245:74;;19328:93;19417:3;19328:93;:::i;:::-;19446:2;19441:3;19437:12;19430:19;;19089:366;;;:::o;19461:::-;19603:3;19624:67;19688:2;19683:3;19624:67;:::i;:::-;19617:74;;19700:93;19789:3;19700:93;:::i;:::-;19818:2;19813:3;19809:12;19802:19;;19461:366;;;:::o;19833:::-;19975:3;19996:67;20060:2;20055:3;19996:67;:::i;:::-;19989:74;;20072:93;20161:3;20072:93;:::i;:::-;20190:2;20185:3;20181:12;20174:19;;19833:366;;;:::o;20205:::-;20347:3;20368:67;20432:2;20427:3;20368:67;:::i;:::-;20361:74;;20444:93;20533:3;20444:93;:::i;:::-;20562:2;20557:3;20553:12;20546:19;;20205:366;;;:::o;20577:::-;20719:3;20740:67;20804:2;20799:3;20740:67;:::i;:::-;20733:74;;20816:93;20905:3;20816:93;:::i;:::-;20934:2;20929:3;20925:12;20918:19;;20577:366;;;:::o;20949:::-;21091:3;21112:67;21176:2;21171:3;21112:67;:::i;:::-;21105:74;;21188:93;21277:3;21188:93;:::i;:::-;21306:2;21301:3;21297:12;21290:19;;20949:366;;;:::o;21321:::-;21463:3;21484:67;21548:2;21543:3;21484:67;:::i;:::-;21477:74;;21560:93;21649:3;21560:93;:::i;:::-;21678:2;21673:3;21669:12;21662:19;;21321:366;;;:::o;21693:118::-;21780:24;21798:5;21780:24;:::i;:::-;21775:3;21768:37;21693:118;;:::o;21817:435::-;21997:3;22019:95;22110:3;22101:6;22019:95;:::i;:::-;22012:102;;22131:95;22222:3;22213:6;22131:95;:::i;:::-;22124:102;;22243:3;22236:10;;21817:435;;;;;:::o;22258:222::-;22351:4;22389:2;22378:9;22374:18;22366:26;;22402:71;22470:1;22459:9;22455:17;22446:6;22402:71;:::i;:::-;22258:222;;;;:::o;22486:640::-;22681:4;22719:3;22708:9;22704:19;22696:27;;22733:71;22801:1;22790:9;22786:17;22777:6;22733:71;:::i;:::-;22814:72;22882:2;22871:9;22867:18;22858:6;22814:72;:::i;:::-;22896;22964:2;22953:9;22949:18;22940:6;22896:72;:::i;:::-;23015:9;23009:4;23005:20;23000:2;22989:9;22985:18;22978:48;23043:76;23114:4;23105:6;23043:76;:::i;:::-;23035:84;;22486:640;;;;;;;:::o;23132:210::-;23219:4;23257:2;23246:9;23242:18;23234:26;;23270:65;23332:1;23321:9;23317:17;23308:6;23270:65;:::i;:::-;23132:210;;;;:::o;23348:313::-;23461:4;23499:2;23488:9;23484:18;23476:26;;23548:9;23542:4;23538:20;23534:1;23523:9;23519:17;23512:47;23576:78;23649:4;23640:6;23576:78;:::i;:::-;23568:86;;23348:313;;;;:::o;23667:419::-;23833:4;23871:2;23860:9;23856:18;23848:26;;23920:9;23914:4;23910:20;23906:1;23895:9;23891:17;23884:47;23948:131;24074:4;23948:131;:::i;:::-;23940:139;;23667:419;;;:::o;24092:::-;24258:4;24296:2;24285:9;24281:18;24273:26;;24345:9;24339:4;24335:20;24331:1;24320:9;24316:17;24309:47;24373:131;24499:4;24373:131;:::i;:::-;24365:139;;24092:419;;;:::o;24517:::-;24683:4;24721:2;24710:9;24706:18;24698:26;;24770:9;24764:4;24760:20;24756:1;24745:9;24741:17;24734:47;24798:131;24924:4;24798:131;:::i;:::-;24790:139;;24517:419;;;:::o;24942:::-;25108:4;25146:2;25135:9;25131:18;25123:26;;25195:9;25189:4;25185:20;25181:1;25170:9;25166:17;25159:47;25223:131;25349:4;25223:131;:::i;:::-;25215:139;;24942:419;;;:::o;25367:::-;25533:4;25571:2;25560:9;25556:18;25548:26;;25620:9;25614:4;25610:20;25606:1;25595:9;25591:17;25584:47;25648:131;25774:4;25648:131;:::i;:::-;25640:139;;25367:419;;;:::o;25792:::-;25958:4;25996:2;25985:9;25981:18;25973:26;;26045:9;26039:4;26035:20;26031:1;26020:9;26016:17;26009:47;26073:131;26199:4;26073:131;:::i;:::-;26065:139;;25792:419;;;:::o;26217:::-;26383:4;26421:2;26410:9;26406:18;26398:26;;26470:9;26464:4;26460:20;26456:1;26445:9;26441:17;26434:47;26498:131;26624:4;26498:131;:::i;:::-;26490:139;;26217:419;;;:::o;26642:::-;26808:4;26846:2;26835:9;26831:18;26823:26;;26895:9;26889:4;26885:20;26881:1;26870:9;26866:17;26859:47;26923:131;27049:4;26923:131;:::i;:::-;26915:139;;26642:419;;;:::o;27067:::-;27233:4;27271:2;27260:9;27256:18;27248:26;;27320:9;27314:4;27310:20;27306:1;27295:9;27291:17;27284:47;27348:131;27474:4;27348:131;:::i;:::-;27340:139;;27067:419;;;:::o;27492:::-;27658:4;27696:2;27685:9;27681:18;27673:26;;27745:9;27739:4;27735:20;27731:1;27720:9;27716:17;27709:47;27773:131;27899:4;27773:131;:::i;:::-;27765:139;;27492:419;;;:::o;27917:::-;28083:4;28121:2;28110:9;28106:18;28098:26;;28170:9;28164:4;28160:20;28156:1;28145:9;28141:17;28134:47;28198:131;28324:4;28198:131;:::i;:::-;28190:139;;27917:419;;;:::o;28342:::-;28508:4;28546:2;28535:9;28531:18;28523:26;;28595:9;28589:4;28585:20;28581:1;28570:9;28566:17;28559:47;28623:131;28749:4;28623:131;:::i;:::-;28615:139;;28342:419;;;:::o;28767:::-;28933:4;28971:2;28960:9;28956:18;28948:26;;29020:9;29014:4;29010:20;29006:1;28995:9;28991:17;28984:47;29048:131;29174:4;29048:131;:::i;:::-;29040:139;;28767:419;;;:::o;29192:::-;29358:4;29396:2;29385:9;29381:18;29373:26;;29445:9;29439:4;29435:20;29431:1;29420:9;29416:17;29409:47;29473:131;29599:4;29473:131;:::i;:::-;29465:139;;29192:419;;;:::o;29617:::-;29783:4;29821:2;29810:9;29806:18;29798:26;;29870:9;29864:4;29860:20;29856:1;29845:9;29841:17;29834:47;29898:131;30024:4;29898:131;:::i;:::-;29890:139;;29617:419;;;:::o;30042:::-;30208:4;30246:2;30235:9;30231:18;30223:26;;30295:9;30289:4;30285:20;30281:1;30270:9;30266:17;30259:47;30323:131;30449:4;30323:131;:::i;:::-;30315:139;;30042:419;;;:::o;30467:::-;30633:4;30671:2;30660:9;30656:18;30648:26;;30720:9;30714:4;30710:20;30706:1;30695:9;30691:17;30684:47;30748:131;30874:4;30748:131;:::i;:::-;30740:139;;30467:419;;;:::o;30892:::-;31058:4;31096:2;31085:9;31081:18;31073:26;;31145:9;31139:4;31135:20;31131:1;31120:9;31116:17;31109:47;31173:131;31299:4;31173:131;:::i;:::-;31165:139;;30892:419;;;:::o;31317:::-;31483:4;31521:2;31510:9;31506:18;31498:26;;31570:9;31564:4;31560:20;31556:1;31545:9;31541:17;31534:47;31598:131;31724:4;31598:131;:::i;:::-;31590:139;;31317:419;;;:::o;31742:::-;31908:4;31946:2;31935:9;31931:18;31923:26;;31995:9;31989:4;31985:20;31981:1;31970:9;31966:17;31959:47;32023:131;32149:4;32023:131;:::i;:::-;32015:139;;31742:419;;;:::o;32167:::-;32333:4;32371:2;32360:9;32356:18;32348:26;;32420:9;32414:4;32410:20;32406:1;32395:9;32391:17;32384:47;32448:131;32574:4;32448:131;:::i;:::-;32440:139;;32167:419;;;:::o;32592:::-;32758:4;32796:2;32785:9;32781:18;32773:26;;32845:9;32839:4;32835:20;32831:1;32820:9;32816:17;32809:47;32873:131;32999:4;32873:131;:::i;:::-;32865:139;;32592:419;;;:::o;33017:::-;33183:4;33221:2;33210:9;33206:18;33198:26;;33270:9;33264:4;33260:20;33256:1;33245:9;33241:17;33234:47;33298:131;33424:4;33298:131;:::i;:::-;33290:139;;33017:419;;;:::o;33442:::-;33608:4;33646:2;33635:9;33631:18;33623:26;;33695:9;33689:4;33685:20;33681:1;33670:9;33666:17;33659:47;33723:131;33849:4;33723:131;:::i;:::-;33715:139;;33442:419;;;:::o;33867:::-;34033:4;34071:2;34060:9;34056:18;34048:26;;34120:9;34114:4;34110:20;34106:1;34095:9;34091:17;34084:47;34148:131;34274:4;34148:131;:::i;:::-;34140:139;;33867:419;;;:::o;34292:222::-;34385:4;34423:2;34412:9;34408:18;34400:26;;34436:71;34504:1;34493:9;34489:17;34480:6;34436:71;:::i;:::-;34292:222;;;;:::o;34520:129::-;34554:6;34581:20;;:::i;:::-;34571:30;;34610:33;34638:4;34630:6;34610:33;:::i;:::-;34520:129;;;:::o;34655:75::-;34688:6;34721:2;34715:9;34705:19;;34655:75;:::o;34736:307::-;34797:4;34887:18;34879:6;34876:30;34873:56;;;34909:18;;:::i;:::-;34873:56;34947:29;34969:6;34947:29;:::i;:::-;34939:37;;35031:4;35025;35021:15;35013:23;;34736:307;;;:::o;35049:98::-;35100:6;35134:5;35128:12;35118:22;;35049:98;;;:::o;35153:99::-;35205:6;35239:5;35233:12;35223:22;;35153:99;;;:::o;35258:168::-;35341:11;35375:6;35370:3;35363:19;35415:4;35410:3;35406:14;35391:29;;35258:168;;;;:::o;35432:169::-;35516:11;35550:6;35545:3;35538:19;35590:4;35585:3;35581:14;35566:29;;35432:169;;;;:::o;35607:148::-;35709:11;35746:3;35731:18;;35607:148;;;;:::o;35761:305::-;35801:3;35820:20;35838:1;35820:20;:::i;:::-;35815:25;;35854:20;35872:1;35854:20;:::i;:::-;35849:25;;36008:1;35940:66;35936:74;35933:1;35930:81;35927:107;;;36014:18;;:::i;:::-;35927:107;36058:1;36055;36051:9;36044:16;;35761:305;;;;:::o;36072:185::-;36112:1;36129:20;36147:1;36129:20;:::i;:::-;36124:25;;36163:20;36181:1;36163:20;:::i;:::-;36158:25;;36202:1;36192:35;;36207:18;;:::i;:::-;36192:35;36249:1;36246;36242:9;36237:14;;36072:185;;;;:::o;36263:348::-;36303:7;36326:20;36344:1;36326:20;:::i;:::-;36321:25;;36360:20;36378:1;36360:20;:::i;:::-;36355:25;;36548:1;36480:66;36476:74;36473:1;36470:81;36465:1;36458:9;36451:17;36447:105;36444:131;;;36555:18;;:::i;:::-;36444:131;36603:1;36600;36596:9;36585:20;;36263:348;;;;:::o;36617:191::-;36657:4;36677:20;36695:1;36677:20;:::i;:::-;36672:25;;36711:20;36729:1;36711:20;:::i;:::-;36706:25;;36750:1;36747;36744:8;36741:34;;;36755:18;;:::i;:::-;36741:34;36800:1;36797;36793:9;36785:17;;36617:191;;;;:::o;36814:96::-;36851:7;36880:24;36898:5;36880:24;:::i;:::-;36869:35;;36814:96;;;:::o;36916:90::-;36950:7;36993:5;36986:13;36979:21;36968:32;;36916:90;;;:::o;37012:149::-;37048:7;37088:66;37081:5;37077:78;37066:89;;37012:149;;;:::o;37167:126::-;37204:7;37244:42;37237:5;37233:54;37222:65;;37167:126;;;:::o;37299:77::-;37336:7;37365:5;37354:16;;37299:77;;;:::o;37382:86::-;37417:7;37457:4;37450:5;37446:16;37435:27;;37382:86;;;:::o;37474:154::-;37558:6;37553:3;37548;37535:30;37620:1;37611:6;37606:3;37602:16;37595:27;37474:154;;;:::o;37634:307::-;37702:1;37712:113;37726:6;37723:1;37720:13;37712:113;;;37811:1;37806:3;37802:11;37796:18;37792:1;37787:3;37783:11;37776:39;37748:2;37745:1;37741:10;37736:15;;37712:113;;;37843:6;37840:1;37837:13;37834:101;;;37923:1;37914:6;37909:3;37905:16;37898:27;37834:101;37683:258;37634:307;;;:::o;37947:320::-;37991:6;38028:1;38022:4;38018:12;38008:22;;38075:1;38069:4;38065:12;38096:18;38086:81;;38152:4;38144:6;38140:17;38130:27;;38086:81;38214:2;38206:6;38203:14;38183:18;38180:38;38177:84;;;38233:18;;:::i;:::-;38177:84;37998:269;37947:320;;;:::o;38273:281::-;38356:27;38378:4;38356:27;:::i;:::-;38348:6;38344:40;38486:6;38474:10;38471:22;38450:18;38438:10;38435:34;38432:62;38429:88;;;38497:18;;:::i;:::-;38429:88;38537:10;38533:2;38526:22;38316:238;38273:281;;:::o;38560:233::-;38599:3;38622:24;38640:5;38622:24;:::i;:::-;38613:33;;38668:66;38661:5;38658:77;38655:103;;;38738:18;;:::i;:::-;38655:103;38785:1;38778:5;38774:13;38767:20;;38560:233;;;:::o;38799:176::-;38831:1;38848:20;38866:1;38848:20;:::i;:::-;38843:25;;38882:20;38900:1;38882:20;:::i;:::-;38877:25;;38921:1;38911:35;;38926:18;;:::i;:::-;38911:35;38967:1;38964;38960:9;38955:14;;38799:176;;;;:::o;38981:180::-;39029:77;39026:1;39019:88;39126:4;39123:1;39116:15;39150:4;39147:1;39140:15;39167:180;39215:77;39212:1;39205:88;39312:4;39309:1;39302:15;39336:4;39333:1;39326:15;39353:180;39401:77;39398:1;39391:88;39498:4;39495:1;39488:15;39522:4;39519:1;39512:15;39539:180;39587:77;39584:1;39577:88;39684:4;39681:1;39674:15;39708:4;39705:1;39698:15;39725:180;39773:77;39770:1;39763:88;39870:4;39867:1;39860:15;39894:4;39891:1;39884:15;39911:180;39959:77;39956:1;39949:88;40056:4;40053:1;40046:15;40080:4;40077:1;40070:15;40097:117;40206:1;40203;40196:12;40220:117;40329:1;40326;40319:12;40343:117;40452:1;40449;40442:12;40466:117;40575:1;40572;40565:12;40589:117;40698:1;40695;40688:12;40712:117;40821:1;40818;40811:12;40835:102;40876:6;40927:2;40923:7;40918:2;40911:5;40907:14;40903:28;40893:38;;40835:102;;;:::o;40943:230::-;41083:34;41079:1;41071:6;41067:14;41060:58;41152:13;41147:2;41139:6;41135:15;41128:38;40943:230;:::o;41179:237::-;41319:34;41315:1;41307:6;41303:14;41296:58;41388:20;41383:2;41375:6;41371:15;41364:45;41179:237;:::o;41422:225::-;41562:34;41558:1;41550:6;41546:14;41539:58;41631:8;41626:2;41618:6;41614:15;41607:33;41422:225;:::o;41653:178::-;41793:30;41789:1;41781:6;41777:14;41770:54;41653:178;:::o;41837:223::-;41977:34;41973:1;41965:6;41961:14;41954:58;42046:6;42041:2;42033:6;42029:15;42022:31;41837:223;:::o;42066:::-;42206:34;42202:1;42194:6;42190:14;42183:58;42275:6;42270:2;42262:6;42258:15;42251:31;42066:223;:::o;42295:175::-;42435:27;42431:1;42423:6;42419:14;42412:51;42295:175;:::o;42476:245::-;42616:34;42612:1;42604:6;42600:14;42593:58;42685:28;42680:2;42672:6;42668:15;42661:53;42476:245;:::o;42727:231::-;42867:34;42863:1;42855:6;42851:14;42844:58;42936:14;42931:2;42923:6;42919:15;42912:39;42727:231;:::o;42964:220::-;43104:34;43100:1;43092:6;43088:14;43081:58;43173:3;43168:2;43160:6;43156:15;43149:28;42964:220;:::o;43190:243::-;43330:34;43326:1;43318:6;43314:14;43307:58;43399:26;43394:2;43386:6;43382:15;43375:51;43190:243;:::o;43439:229::-;43579:34;43575:1;43567:6;43563:14;43556:58;43648:12;43643:2;43635:6;43631:15;43624:37;43439:229;:::o;43674:228::-;43814:34;43810:1;43802:6;43798:14;43791:58;43883:11;43878:2;43870:6;43866:15;43859:36;43674:228;:::o;43908:182::-;44048:34;44044:1;44036:6;44032:14;44025:58;43908:182;:::o;44096:224::-;44236:34;44232:1;44224:6;44220:14;44213:58;44305:7;44300:2;44292:6;44288:15;44281:32;44096:224;:::o;44326:231::-;44466:34;44462:1;44454:6;44450:14;44443:58;44535:14;44530:2;44522:6;44518:15;44511:39;44326:231;:::o;44563:182::-;44703:34;44699:1;44691:6;44687:14;44680:58;44563:182;:::o;44751:228::-;44891:34;44887:1;44879:6;44875:14;44868:58;44960:11;44955:2;44947:6;44943:15;44936:36;44751:228;:::o;44985:234::-;45125:34;45121:1;45113:6;45109:14;45102:58;45194:17;45189:2;45181:6;45177:15;45170:42;44985:234;:::o;45225:221::-;45365:34;45361:1;45353:6;45349:14;45342:58;45434:4;45429:2;45421:6;45417:15;45410:29;45225:221;:::o;45452:220::-;45592:34;45588:1;45580:6;45576:14;45569:58;45661:3;45656:2;45648:6;45644:15;45637:28;45452:220;:::o;45678:236::-;45818:34;45814:1;45806:6;45802:14;45795:58;45887:19;45882:2;45874:6;45870:15;45863:44;45678:236;:::o;45920:231::-;46060:34;46056:1;46048:6;46044:14;46037:58;46129:14;46124:2;46116:6;46112:15;46105:39;45920:231;:::o;46157:245::-;46297:34;46293:1;46285:6;46281:14;46274:58;46366:28;46361:2;46353:6;46349:15;46342:53;46157:245;:::o;46408:230::-;46548:34;46544:1;46536:6;46532:14;46525:58;46617:13;46612:2;46604:6;46600:15;46593:38;46408:230;:::o;46644:122::-;46717:24;46735:5;46717:24;:::i;:::-;46710:5;46707:35;46697:63;;46756:1;46753;46746:12;46697:63;46644:122;:::o;46772:116::-;46842:21;46857:5;46842:21;:::i;:::-;46835:5;46832:32;46822:60;;46878:1;46875;46868:12;46822:60;46772:116;:::o;46894:120::-;46966:23;46983:5;46966:23;:::i;:::-;46959:5;46956:34;46946:62;;47004:1;47001;46994:12;46946:62;46894:120;:::o;47020:122::-;47093:24;47111:5;47093:24;:::i;:::-;47086:5;47083:35;47073:63;;47132:1;47129;47122:12;47073:63;47020:122;:::o;47148:118::-;47219:22;47235:5;47219:22;:::i;:::-;47212:5;47209:33;47199:61;;47256:1;47253;47246:12;47199:61;47148:118;:::o

Swarm Source

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