ETH Price: $3,445.86 (-0.91%)
Gas: 3 Gwei

Token

Baghodling Badgers (BHB)
 

Overview

Max Total Supply

999 BHB

Holders

444

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BHB
0xefc7f2139074292f1c0004e916f9ae30bce4df6c
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:
BAGHODLINGBADGERS

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-08
*/

/**
 *Submitted for verification at Etherscan.io on 2023-01-06
*/

// SPDX-License-Identifier: MIT




// File: @openzeppelin/contracts/utils/Strings.sol

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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


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

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

// File: contracts/new.sol




pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

abstract contract Ownable is Context {
    address private _owner;

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

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

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

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

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

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

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

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}
pragma solidity ^0.8.13;



abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(operatorFilterRegistry).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (
                !(
                    operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)
                        && operatorFilterRegistry.isOperatorAllowed(address(this), from)
                )
            ) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}
pragma solidity ^0.8.13;



abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}
    pragma solidity ^0.8.7;
    
    contract BAGHODLINGBADGERS is ERC721A,DefaultOperatorFilterer , Ownable {
    using Strings for uint256;


  string private uriPrefix ;
  string private uriSuffix = ".json";
  string public hiddenURL;

  
  

  uint256 public cost = 0.01 ether;
  uint256 public whiteListCost = 0 ;
  

  uint16 public maxSupply = 999;
  uint8 public maxMintAmountPerTx = 5;
  uint8 public maxMintAmountPerWallet = 5;
    uint8 public maxFreeMintAmountPerWallet = 2;
                                                             
  bool public WLpaused = true;
  bool public paused = true;
  bool public reveal =false;
  mapping (address => uint8) public NFTPerWLAddress;
   mapping (address => uint8) public NFTPerPublicAddress;
  mapping (address => bool) public isWhitelisted;
 
  
  
 
  

  constructor() ERC721A("Baghodling Badgers", "BHB") {
  }

 
  

  
 
  function Mint(uint8 _mintAmount) external payable  {
     uint16 totalSupply = uint16(totalSupply());
     uint8 nft = NFTPerPublicAddress[msg.sender];
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
    require(_mintAmount + nft <= maxMintAmountPerWallet, "Exceeds max per Wallet.");
    require(_mintAmount  <= maxMintAmountPerTx, "Exceeds max per Wallet.");

    require(!paused, "The contract is paused!");
    
      if(nft >= maxFreeMintAmountPerWallet)
    {
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= cost * costAmount, "Insufficient funds!");
       }
       
         
    }
    


    _safeMint(msg.sender , _mintAmount);

    NFTPerPublicAddress[msg.sender] = _mintAmount + nft;
     
     delete totalSupply;
     delete _mintAmount;
  }
  
  function Reserve(uint16 _mintAmount, address _receiver) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
    require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
     _safeMint(_receiver , _mintAmount);
     delete _mintAmount;
     delete _receiver;
     delete totalSupply;
  }

  function  Airdrop(uint8 _amountPerAddress, address[] calldata addresses) external onlyOwner {
     uint16 totalSupply = uint16(totalSupply());
     uint totalAmount =   _amountPerAddress * addresses.length;
    require(totalSupply + totalAmount <= maxSupply, "Exceees max supply.");
     for (uint256 i = 0; i < addresses.length; i++) {
            _safeMint(addresses[i], _amountPerAddress);
        }

     delete _amountPerAddress;
     delete totalSupply;
  }

 

  function setMaxSupply(uint16 _maxSupply) external onlyOwner {
      maxSupply = _maxSupply;
  }



   
  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );
    
  
if ( reveal == false)
{
    return hiddenURL;
}
    

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString() ,uriSuffix))
        : "";
  }
 
   function setWLPaused() external onlyOwner {
    WLpaused = !WLpaused;
  }
  function setWLCost(uint256 _cost) external onlyOwner {
    whiteListCost = _cost;
    delete _cost;
  }



 function setFreeMaxLimitPerAddress(uint8 _limit) external onlyOwner{
    maxFreeMintAmountPerWallet = _limit;
   delete _limit;

}

    
  function addToPresaleWhitelist(address[] calldata entries) external onlyOwner {
        for(uint8 i = 0; i < entries.length; i++) {
            isWhitelisted[entries[i]] = true;
        }   
    }

    function removeFromPresaleWhitelist(address[] calldata entries) external onlyOwner {
        for(uint8 i = 0; i < entries.length; i++) {
             isWhitelisted[entries[i]] = false;
        }
    }

function whitelistMint(uint8 _mintAmount) external payable {
        
    
        uint8 nft = NFTPerWLAddress[msg.sender];
        uint16 totalSupply = uint16(totalSupply());
       require(isWhitelisted[msg.sender],  "You are not whitelisted");
       require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");

       require (nft + _mintAmount <= maxMintAmountPerWallet, "Exceeds max  limit  per address");
        require (_mintAmount <= maxMintAmountPerTx, "Exceeds max  limit  per tx");
      


    require(!WLpaused, "Whitelist minting is over!");
         if(nft >= maxFreeMintAmountPerWallet)
    {
    require(msg.value >= whiteListCost * _mintAmount, "Insufficient funds!");
    }
    else {
         uint8 costAmount = _mintAmount + nft;
        if(costAmount > maxFreeMintAmountPerWallet)
       {
        costAmount = costAmount - maxFreeMintAmountPerWallet;
        require(msg.value >= whiteListCost * costAmount, "Insufficient funds!");
       }
       
         
    }
    
    

     _safeMint(msg.sender , _mintAmount);
      NFTPerWLAddress[msg.sender] =nft + _mintAmount;
     
      delete _mintAmount;
       delete nft;
    
    }

  function setUriPrefix(string memory _uriPrefix) external onlyOwner {
    uriPrefix = _uriPrefix;
  }
   function setHiddenUri(string memory _uriPrefix) external onlyOwner {
    hiddenURL = _uriPrefix;
  }


  function setPaused() external onlyOwner {
    paused = !paused;
    WLpaused = true;
  }

  function setCost(uint _cost) external onlyOwner{
      cost = _cost;

  }

 function setRevealed() external onlyOwner{
     reveal = !reveal;
 }

  function setMaxMintAmountPerTx(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerTx = _maxtx;

  }

  
  function setMaxMintAmountPerWallet(uint8 _maxtx) external onlyOwner{
      maxMintAmountPerWallet = _maxtx;

  }

 

  function withdraw() external onlyOwner {
  uint _balance = address(this).balance;
     payable(msg.sender).transfer(_balance ); 
       
  }


  function _baseURI() internal view  override returns (string memory) {
    return uriPrefix;
  }
   function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"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":[{"internalType":"uint8","name":"_amountPerAddress","type":"uint8"},{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerPublicAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"NFTPerWLAddress","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"Reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"WLpaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"addToPresaleWhitelist","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":[],"name":"cost","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":[],"name":"hiddenURL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerWallet","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"entries","type":"address[]"}],"name":"removeFromPresaleWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_limit","type":"uint8"}],"name":"setFreeMaxLimitPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setHiddenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_maxtx","type":"uint8"}],"name":"setMaxMintAmountPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_maxSupply","type":"uint16"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setWLCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setWLPaused","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":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_mintAmount","type":"uint8"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600a908051906020019062000051929190620004f1565b50662386f26fc10000600c556000600d556103e7600e60006101000a81548161ffff021916908361ffff1602179055506005600e60026101000a81548160ff021916908360ff1602179055506005600e60036101000a81548160ff021916908360ff1602179055506002600e60046101000a81548160ff021916908360ff1602179055506001600e60056101000a81548160ff0219169083151502179055506001600e60066101000a81548160ff0219169083151502179055506000600e60076101000a81548160ff0219169083151502179055503480156200013357600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280601281526020017f426167686f646c696e67204261646765727300000000000000000000000000008152506040518060400160405280600381526020017f42484200000000000000000000000000000000000000000000000000000000008152508160029080519060200190620001cf929190620004f1565b508060039080519060200190620001e8929190620004f1565b50620001f96200041e60201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003f6578015620002bc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b815260040162000282929190620005e6565b600060405180830381600087803b1580156200029d57600080fd5b505af1158015620002b2573d6000803e3d6000fd5b50505050620003f5565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000376576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200033c929190620005e6565b600060405180830381600087803b1580156200035757600080fd5b505af11580156200036c573d6000803e3d6000fd5b50505050620003f4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003bf919062000613565b600060405180830381600087803b158015620003da57600080fd5b505af1158015620003ef573d6000803e3d6000fd5b505050505b5b5b5050620004186200040c6200042360201b60201c565b6200042b60201b60201c565b62000694565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620004ff906200065f565b90600052602060002090601f0160209004810192826200052357600085556200056f565b82601f106200053e57805160ff19168380011785556200056f565b828001600101855582156200056f579182015b828111156200056e57825182559160200191906001019062000551565b5b5090506200057e919062000582565b5090565b5b808211156200059d57600081600090555060010162000583565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005ce82620005a1565b9050919050565b620005e081620005c1565b82525050565b6000604082019050620005fd6000830185620005d5565b6200060c6020830184620005d5565b9392505050565b60006020820190506200062a6000830184620005d5565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200067857607f821691505b6020821081036200068e576200068d62000630565b5b50919050565b6155bd80620006a46000396000f3fe6080604052600436106102935760003560e01c8063715018a61161015a578063aa062290116100c1578063d5abeb011161007a578063d5abeb0114610980578063e94053c7146109ab578063e985e9c5146109e8578063eef440af14610a25578063f2fde38b14610a50578063f8bf517214610a7957610293565b8063aa06229014610874578063b88d4fde1461089d578063bc951b91146108c6578063c87b56dd146108f1578063cffb6e201461092e578063d1d192131461095757610293565b80639257e044116101135780639257e0441461078357806394354fd0146107ae57806395d89b41146107d9578063a22cb46514610804578063a2522d2d1461082d578063a475b5dd1461084957610293565b8063715018a61461069b5780637ec4a659146106b25780637f6e9093146106db5780638da5cb5b146107065780638e07484c146107315780638f65fe0a1461075a57610293565b806337a66d85116101fe5780634d9c1848116101b75780634d9c18481461057457806359bf5dbb1461059d5780635c975abb146105da57806360e85cde146106055780636352211e1461062157806370a082311461065e57610293565b806337a66d85146104a05780633af32abf146104b75780633bd64968146104f45780633ccfd60b1461050b57806342842e0e1461052257806344a0d68a1461054b57610293565b80631067fcc7116102505780631067fcc7146103a657806313faede6146103cf57806318160ddd146103fa57806323b872dd1461042557806328b60d151461044e5780632f6f98e11461047757610293565b806301ffc9a71461029857806306421c2f146102d557806306fdde03146102fe578063081812fc14610329578063093cfa6314610366578063095ea7b31461037d575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906141e6565b610aa4565b6040516102cc919061422e565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190614283565b610b86565b005b34801561030a57600080fd5b50610313610c22565b6040516103209190614349565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906143a1565b610cb4565b60405161035d919061440f565b60405180910390f35b34801561037257600080fd5b5061037b610d30565b005b34801561038957600080fd5b506103a4600480360381019061039f9190614456565b610dd8565b005b3480156103b257600080fd5b506103cd60048036038101906103c891906145cb565b610ee2565b005b3480156103db57600080fd5b506103e4610f78565b6040516103f19190614623565b60405180910390f35b34801561040657600080fd5b5061040f610f7e565b60405161041c9190614623565b60405180910390f35b34801561043157600080fd5b5061044c6004803603810190610447919061463e565b610f95565b005b34801561045a57600080fd5b50610475600480360381019061047091906146ca565b611177565b005b34801561048357600080fd5b5061049e600480360381019061049991906146f7565b611211565b005b3480156104ac57600080fd5b506104b561131e565b005b3480156104c357600080fd5b506104de60048036038101906104d99190614737565b6113e1565b6040516104eb919061422e565b60405180910390f35b34801561050057600080fd5b50610509611401565b005b34801561051757600080fd5b506105206114a9565b005b34801561052e57600080fd5b506105496004803603810190610544919061463e565b611574565b005b34801561055757600080fd5b50610572600480360381019061056d91906143a1565b611756565b005b34801561058057600080fd5b5061059b600480360381019061059691906146ca565b6117dc565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190614737565b61187a565b6040516105d19190614773565b60405180910390f35b3480156105e657600080fd5b506105ef61189a565b6040516105fc919061422e565b60405180910390f35b61061f600480360381019061061a91906146ca565b6118ad565b005b34801561062d57600080fd5b50610648600480360381019061064391906143a1565b611c9b565b604051610655919061440f565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190614737565b611cb1565b6040516106929190614623565b60405180910390f35b3480156106a757600080fd5b506106b0611d80565b005b3480156106be57600080fd5b506106d960048036038101906106d491906145cb565b611e08565b005b3480156106e757600080fd5b506106f0611e9e565b6040516106fd919061422e565b60405180910390f35b34801561071257600080fd5b5061071b611eb1565b604051610728919061440f565b60405180910390f35b34801561073d57600080fd5b50610758600480360381019061075391906147ee565b611edb565b005b34801561076657600080fd5b50610781600480360381019061077c91906147ee565b612002565b005b34801561078f57600080fd5b50610798612129565b6040516107a59190614623565b60405180910390f35b3480156107ba57600080fd5b506107c361212f565b6040516107d09190614773565b60405180910390f35b3480156107e557600080fd5b506107ee612142565b6040516107fb9190614349565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190614867565b6121d4565b005b610847600480360381019061084291906146ca565b61234b565b005b34801561085557600080fd5b5061085e6126ad565b60405161086b919061422e565b60405180910390f35b34801561088057600080fd5b5061089b600480360381019061089691906146ca565b6126c0565b005b3480156108a957600080fd5b506108c460048036038101906108bf9190614948565b61275a565b005b3480156108d257600080fd5b506108db61293f565b6040516108e89190614773565b60405180910390f35b3480156108fd57600080fd5b50610918600480360381019061091391906143a1565b612952565b6040516109259190614349565b60405180910390f35b34801561093a57600080fd5b50610955600480360381019061095091906149cb565b612aaa565b005b34801561096357600080fd5b5061097e600480360381019061097991906143a1565b612c13565b005b34801561098c57600080fd5b50610995612c9d565b6040516109a29190614a3a565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd9190614737565b612cb1565b6040516109df9190614773565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190614a55565b612cd1565b604051610a1c919061422e565b60405180910390f35b348015610a3157600080fd5b50610a3a612d65565b604051610a479190614349565b60405180910390f35b348015610a5c57600080fd5b50610a776004803603810190610a729190614737565b612df3565b005b348015610a8557600080fd5b50610a8e612eea565b604051610a9b9190614773565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e82612efd565b5b9050919050565b610b8e612f67565b73ffffffffffffffffffffffffffffffffffffffff16610bac611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990614ae1565b60405180910390fd5b80600e60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610c3190614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5d90614b30565b8015610caa5780601f10610c7f57610100808354040283529160200191610caa565b820191906000526020600020905b815481529060010190602001808311610c8d57829003601f168201915b5050505050905090565b6000610cbf82612f6f565b610cf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610d38612f67565b73ffffffffffffffffffffffffffffffffffffffff16610d56611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390614ae1565b60405180910390fd5b600e60059054906101000a900460ff1615600e60056101000a81548160ff021916908315150217905550565b6000610de382611c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e4a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e69612f67565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e9b5750610e9981610e94612f67565b612cd1565b155b15610ed2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edd838383612fbd565b505050565b610eea612f67565b73ffffffffffffffffffffffffffffffffffffffff16610f08611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614ae1565b60405180910390fd5b80600b9080519060200190610f74929190614094565b5050565b600c5481565b6000610f8861306f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611165573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100757611002848484613074565b611171565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611050929190614b61565b602060405180830381865afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110919190614b9f565b801561112357506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110e1929190614b61565b602060405180830381865afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190614b9f565b5b61116457336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161115b919061440f565b60405180910390fd5b5b611170848484613074565b5b50505050565b61117f612f67565b73ffffffffffffffffffffffffffffffffffffffff1661119d611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90614ae1565b60405180910390fd5b80600e60036101000a81548160ff021916908360ff16021790555050565b611219612f67565b73ffffffffffffffffffffffffffffffffffffffff16611237611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614ae1565b60405180910390fd5b6000611297610f7e565b9050600e60009054906101000a900461ffff1661ffff1683826112ba9190614bfb565b61ffff1611156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614c7f565b60405180910390fd5b61130d828461ffff16613084565b600092506000915060009050505050565b611326612f67565b73ffffffffffffffffffffffffffffffffffffffff16611344611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614ae1565b60405180910390fd5b600e60069054906101000a900460ff1615600e60066101000a81548160ff0219169083151502179055506001600e60056101000a81548160ff021916908315150217905550565b60116020528060005260406000206000915054906101000a900460ff1681565b611409612f67565b73ffffffffffffffffffffffffffffffffffffffff16611427611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490614ae1565b60405180910390fd5b600e60079054906101000a900460ff1615600e60076101000a81548160ff021916908315150217905550565b6114b1612f67565b73ffffffffffffffffffffffffffffffffffffffff166114cf611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90614ae1565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611570573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611744573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115e6576115e18484846130a2565b611750565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161162f929190614b61565b602060405180830381865afa15801561164c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116709190614b9f565b801561170257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016116c0929190614b61565b602060405180830381865afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117019190614b9f565b5b61174357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161173a919061440f565b60405180910390fd5b5b61174f8484846130a2565b5b50505050565b61175e612f67565b73ffffffffffffffffffffffffffffffffffffffff1661177c611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990614ae1565b60405180910390fd5b80600c8190555050565b6117e4612f67565b73ffffffffffffffffffffffffffffffffffffffff16611802611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90614ae1565b60405180910390fd5b80600e60046101000a81548160ff021916908360ff1602179055506000905050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600e60069054906101000a900460ff1681565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000611908610f7e565b9050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614ceb565b60405180910390fd5b600e60009054906101000a900461ffff1661ffff168360ff16826119ba9190614bfb565b61ffff1611156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff168383611a1e9190614d0b565b60ff161115611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990614d8e565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff161115611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab190614dfa565b60405180910390fd5b600e60059054906101000a900460ff1615611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614e66565b60405180910390fd5b600e60049054906101000a900460ff1660ff168260ff1610611b7e578260ff16600d54611b379190614e86565b341015611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090614f2c565b60405180910390fd5b611c1e565b60008284611b8c9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff161115611c1c57600e60049054906101000a900460ff1681611bc69190614f4c565b90508060ff16600d54611bd99190614e86565b341015611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614f2c565b60405180910390fd5b5b505b611c2b338460ff16613084565b8282611c379190614d0b565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000925060009150505050565b6000611ca6826130c2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d18576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611d88612f67565b73ffffffffffffffffffffffffffffffffffffffff16611da6611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df390614ae1565b60405180910390fd5b611e066000613351565b565b611e10612f67565b73ffffffffffffffffffffffffffffffffffffffff16611e2e611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b90614ae1565b60405180910390fd5b8060099080519060200190611e9a929190614094565b5050565b600e60059054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee3612f67565b73ffffffffffffffffffffffffffffffffffffffff16611f01611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e90614ae1565b60405180910390fd5b60005b828290508160ff161015611ffd5760016011600085858560ff16818110611f8457611f83614f80565b5b9050602002016020810190611f999190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ff590614faf565b915050611f5a565b505050565b61200a612f67565b73ffffffffffffffffffffffffffffffffffffffff16612028611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614ae1565b60405180910390fd5b60005b828290508160ff1610156121245760006011600085858560ff168181106120ab576120aa614f80565b5b90506020020160208101906120c09190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061211c90614faf565b915050612081565b505050565b600d5481565b600e60029054906101000a900460ff1681565b60606003805461215190614b30565b80601f016020809104026020016040519081016040528092919081815260200182805461217d90614b30565b80156121ca5780601f1061219f576101008083540402835291602001916121ca565b820191906000526020600020905b8154815290600101906020018083116121ad57829003601f168201915b5050505050905090565b6121dc612f67565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612240576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061224d612f67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122fa612f67565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233f919061422e565b60405180910390a35050565b6000612355610f7e565b90506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600e60009054906101000a900461ffff1661ffff168360ff16836123cc9190614bfb565b61ffff161115612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff1681846124309190614d0b565b60ff161115612474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246b90615024565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff1611156124cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c390615024565b60405180910390fd5b600e60069054906101000a900460ff161561251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390615090565b60405180910390fd5b600e60049054906101000a900460ff1660ff168160ff1610612590578260ff16600c546125499190614e86565b34101561258b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258290614f2c565b60405180910390fd5b612630565b6000818461259e9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff16111561262e57600e60049054906101000a900460ff16816125d89190614f4c565b90508060ff16600c546125eb9190614e86565b34101561262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614f2c565b60405180910390fd5b5b505b61263d338460ff16613084565b80836126499190614d0b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b600e60079054906101000a900460ff1681565b6126c8612f67565b73ffffffffffffffffffffffffffffffffffffffff166126e6611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461273c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273390614ae1565b60405180910390fd5b80600e60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561292b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127cd576127c885858585613417565b612938565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612816929190614b61565b602060405180830381865afa158015612833573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128579190614b9f565b80156128e957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016128a7929190614b61565b602060405180830381865afa1580156128c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e89190614b9f565b5b61292a57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612921919061440f565b60405180910390fd5b5b61293785858585613417565b5b5050505050565b600e60039054906101000a900460ff1681565b606061295d82612f6f565b61299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390615122565b60405180910390fd5b60001515600e60079054906101000a900460ff16151503612a4957600b80546129c490614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546129f090614b30565b8015612a3d5780601f10612a1257610100808354040283529160200191612a3d565b820191906000526020600020905b815481529060010190602001808311612a2057829003601f168201915b50505050509050612aa5565b6000612a53613493565b90506000815111612a735760405180602001604052806000815250612aa1565b80612a7d84613525565b600a604051602001612a9193929190615212565b6040516020818303038152906040525b9150505b919050565b612ab2612f67565b73ffffffffffffffffffffffffffffffffffffffff16612ad0611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614ae1565b60405180910390fd5b6000612b30610f7e565b90506000838390508560ff16612b469190614e86565b9050600e60009054906101000a900461ffff1661ffff16818361ffff16612b6d9190615243565b1115612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba5906152e5565b60405180910390fd5b60005b84849050811015612c0357612bf0858583818110612bd257612bd1614f80565b5b9050602002016020810190612be79190614737565b8760ff16613084565b8080612bfb90615305565b915050612bb1565b5060009450600091505050505050565b612c1b612f67565b73ffffffffffffffffffffffffffffffffffffffff16612c39611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8690614ae1565b60405180910390fd5b80600d819055506000905050565b600e60009054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054612d7290614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9e90614b30565b8015612deb5780601f10612dc057610100808354040283529160200191612deb565b820191906000526020600020905b815481529060010190602001808311612dce57829003601f168201915b505050505081565b612dfb612f67565b73ffffffffffffffffffffffffffffffffffffffff16612e19611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6690614ae1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed5906153bf565b60405180910390fd5b612ee781613351565b50565b600e60049054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612f7a61306f565b11158015612f89575060005482105b8015612fb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61307f838383613685565b505050565b61309e828260405180602001604052806000815250613b39565b5050565b6130bd8383836040518060200160405280600081525061275a565b505050565b6130ca61411a565b6000829050806130d861306f565b111580156130e7575060005481105b1561331a576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161331857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131fc57809250505061334c565b5b60011561331757818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461331257809250505061334c565b6131fd565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613422848484613685565b6134418373ffffffffffffffffffffffffffffffffffffffff16613b4b565b8015613456575061345484848484613b6e565b155b1561348d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546134a290614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546134ce90614b30565b801561351b5780601f106134f05761010080835404028352916020019161351b565b820191906000526020600020905b8154815290600101906020018083116134fe57829003601f168201915b5050505050905090565b60606000820361356c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613680565b600082905060005b6000821461359e57808061358790615305565b915050600a82613597919061540e565b9150613574565b60008167ffffffffffffffff8111156135ba576135b96144a0565b5b6040519080825280601f01601f1916602001820160405280156135ec5781602001600182028036833780820191505090505b5090505b6000851461367957600182613605919061543f565b9150600a856136149190615473565b60306136209190615243565b60f81b81838151811061363657613635614f80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613672919061540e565b94506135f0565b8093505050505b919050565b6000613690826130c2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136fb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661371c612f67565b73ffffffffffffffffffffffffffffffffffffffff16148061374b575061374a85613745612f67565b612cd1565b5b806137905750613759612f67565b73ffffffffffffffffffffffffffffffffffffffff1661377884610cb4565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806137c9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361382f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61383c8585856001613cbe565b61384860008487612fbd565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613ac7576000548214613ac657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b328585856001613cc4565b5050505050565b613b468383836001613cca565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b94612f67565b8786866040518563ffffffff1660e01b8152600401613bb694939291906154f9565b6020604051808303816000875af1925050508015613bf257506040513d601f19601f82011682018060405250810190613bef919061555a565b60015b613c6b573d8060008114613c22576040519150601f19603f3d011682016040523d82523d6000602084013e613c27565b606091505b506000815103613c63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613d36576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613d70576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d7d6000868387613cbe565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613f475750613f468773ffffffffffffffffffffffffffffffffffffffff16613b4b565b5b1561400c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613fbc6000888480600101955088613b6e565b613ff2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613f4d57826000541461400757600080fd5b614077565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361400d575b81600081905550505061408d6000868387613cc4565b5050505050565b8280546140a090614b30565b90600052602060002090601f0160209004810192826140c25760008555614109565b82601f106140db57805160ff1916838001178555614109565b82800160010185558215614109579182015b828111156141085782518255916020019190600101906140ed565b5b509050614116919061415d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561417657600081600090555060010161415e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141c38161418e565b81146141ce57600080fd5b50565b6000813590506141e0816141ba565b92915050565b6000602082840312156141fc576141fb614184565b5b600061420a848285016141d1565b91505092915050565b60008115159050919050565b61422881614213565b82525050565b6000602082019050614243600083018461421f565b92915050565b600061ffff82169050919050565b61426081614249565b811461426b57600080fd5b50565b60008135905061427d81614257565b92915050565b60006020828403121561429957614298614184565b5b60006142a78482850161426e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ea5780820151818401526020810190506142cf565b838111156142f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061431b826142b0565b61432581856142bb565b93506143358185602086016142cc565b61433e816142ff565b840191505092915050565b600060208201905081810360008301526143638184614310565b905092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b6000602082840312156143b7576143b6614184565b5b60006143c58482850161438c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143f9826143ce565b9050919050565b614409816143ee565b82525050565b60006020820190506144246000830184614400565b92915050565b614433816143ee565b811461443e57600080fd5b50565b6000813590506144508161442a565b92915050565b6000806040838503121561446d5761446c614184565b5b600061447b85828601614441565b925050602061448c8582860161438c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144d8826142ff565b810181811067ffffffffffffffff821117156144f7576144f66144a0565b5b80604052505050565b600061450a61417a565b905061451682826144cf565b919050565b600067ffffffffffffffff821115614536576145356144a0565b5b61453f826142ff565b9050602081019050919050565b82818337600083830152505050565b600061456e6145698461451b565b614500565b90508281526020810184848401111561458a5761458961449b565b5b61459584828561454c565b509392505050565b600082601f8301126145b2576145b1614496565b5b81356145c284826020860161455b565b91505092915050565b6000602082840312156145e1576145e0614184565b5b600082013567ffffffffffffffff8111156145ff576145fe614189565b5b61460b8482850161459d565b91505092915050565b61461d8161436b565b82525050565b60006020820190506146386000830184614614565b92915050565b60008060006060848603121561465757614656614184565b5b600061466586828701614441565b935050602061467686828701614441565b92505060406146878682870161438c565b9150509250925092565b600060ff82169050919050565b6146a781614691565b81146146b257600080fd5b50565b6000813590506146c48161469e565b92915050565b6000602082840312156146e0576146df614184565b5b60006146ee848285016146b5565b91505092915050565b6000806040838503121561470e5761470d614184565b5b600061471c8582860161426e565b925050602061472d85828601614441565b9150509250929050565b60006020828403121561474d5761474c614184565b5b600061475b84828501614441565b91505092915050565b61476d81614691565b82525050565b60006020820190506147886000830184614764565b92915050565b600080fd5b600080fd5b60008083601f8401126147ae576147ad614496565b5b8235905067ffffffffffffffff8111156147cb576147ca61478e565b5b6020830191508360208202830111156147e7576147e6614793565b5b9250929050565b6000806020838503121561480557614804614184565b5b600083013567ffffffffffffffff81111561482357614822614189565b5b61482f85828601614798565b92509250509250929050565b61484481614213565b811461484f57600080fd5b50565b6000813590506148618161483b565b92915050565b6000806040838503121561487e5761487d614184565b5b600061488c85828601614441565b925050602061489d85828601614852565b9150509250929050565b600067ffffffffffffffff8211156148c2576148c16144a0565b5b6148cb826142ff565b9050602081019050919050565b60006148eb6148e6846148a7565b614500565b9050828152602081018484840111156149075761490661449b565b5b61491284828561454c565b509392505050565b600082601f83011261492f5761492e614496565b5b813561493f8482602086016148d8565b91505092915050565b6000806000806080858703121561496257614961614184565b5b600061497087828801614441565b945050602061498187828801614441565b93505060406149928782880161438c565b925050606085013567ffffffffffffffff8111156149b3576149b2614189565b5b6149bf8782880161491a565b91505092959194509250565b6000806000604084860312156149e4576149e3614184565b5b60006149f2868287016146b5565b935050602084013567ffffffffffffffff811115614a1357614a12614189565b5b614a1f86828701614798565b92509250509250925092565b614a3481614249565b82525050565b6000602082019050614a4f6000830184614a2b565b92915050565b60008060408385031215614a6c57614a6b614184565b5b6000614a7a85828601614441565b9250506020614a8b85828601614441565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614acb6020836142bb565b9150614ad682614a95565b602082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b4857607f821691505b602082108103614b5b57614b5a614b01565b5b50919050565b6000604082019050614b766000830185614400565b614b836020830184614400565b9392505050565b600081519050614b998161483b565b92915050565b600060208284031215614bb557614bb4614184565b5b6000614bc384828501614b8a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c0682614249565b9150614c1183614249565b92508261ffff03821115614c2857614c27614bcc565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000614c696013836142bb565b9150614c7482614c33565b602082019050919050565b60006020820190508181036000830152614c9881614c5c565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000614cd56017836142bb565b9150614ce082614c9f565b602082019050919050565b60006020820190508181036000830152614d0481614cc8565b9050919050565b6000614d1682614691565b9150614d2183614691565b92508260ff03821115614d3757614d36614bcc565b5b828201905092915050565b7f45786365656473206d617820206c696d69742020706572206164647265737300600082015250565b6000614d78601f836142bb565b9150614d8382614d42565b602082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b7f45786365656473206d617820206c696d69742020706572207478000000000000600082015250565b6000614de4601a836142bb565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f57686974656c697374206d696e74696e67206973206f76657221000000000000600082015250565b6000614e50601a836142bb565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b6000614e918261436b565b9150614e9c8361436b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ed557614ed4614bcc565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614f166013836142bb565b9150614f2182614ee0565b602082019050919050565b60006020820190508181036000830152614f4581614f09565b9050919050565b6000614f5782614691565b9150614f6283614691565b925082821015614f7557614f74614bcc565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614fba82614691565b915060ff8203614fcd57614fcc614bcc565b5b600182019050919050565b7f45786365656473206d6178207065722057616c6c65742e000000000000000000600082015250565b600061500e6017836142bb565b915061501982614fd8565b602082019050919050565b6000602082019050818103600083015261503d81615001565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061507a6017836142bb565b915061508582615044565b602082019050919050565b600060208201905081810360008301526150a98161506d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061510c602f836142bb565b9150615117826150b0565b604082019050919050565b6000602082019050818103600083015261513b816150ff565b9050919050565b600081905092915050565b6000615158826142b0565b6151628185615142565b93506151728185602086016142cc565b80840191505092915050565b60008190508160005260206000209050919050565b600081546151a081614b30565b6151aa8186615142565b945060018216600081146151c557600181146151d657615209565b60ff19831686528186019350615209565b6151df8561517e565b60005b83811015615201578154818901526001820191506020810190506151e2565b838801955050505b50505092915050565b600061521e828661514d565b915061522a828561514d565b91506152368284615193565b9150819050949350505050565b600061524e8261436b565b91506152598361436b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561528e5761528d614bcc565b5b828201905092915050565b7f45786365656573206d617820737570706c792e00000000000000000000000000600082015250565b60006152cf6013836142bb565b91506152da82615299565b602082019050919050565b600060208201905081810360008301526152fe816152c2565b9050919050565b60006153108261436b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361534257615341614bcc565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153a96026836142bb565b91506153b48261534d565b604082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006154198261436b565b91506154248361436b565b925082615434576154336153df565b5b828204905092915050565b600061544a8261436b565b91506154558361436b565b92508282101561546857615467614bcc565b5b828203905092915050565b600061547e8261436b565b91506154898361436b565b925082615499576154986153df565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006154cb826154a4565b6154d581856154af565b93506154e58185602086016142cc565b6154ee816142ff565b840191505092915050565b600060808201905061550e6000830187614400565b61551b6020830186614400565b6155286040830185614614565b818103606083015261553a81846154c0565b905095945050505050565b600081519050615554816141ba565b92915050565b6000602082840312156155705761556f614184565b5b600061557e84828501615545565b9150509291505056fea26469706673582212204336e083c8cbfa677684e63b352270a4f4cd8b4084fdf8b288b876ba436bf28c64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063715018a61161015a578063aa062290116100c1578063d5abeb011161007a578063d5abeb0114610980578063e94053c7146109ab578063e985e9c5146109e8578063eef440af14610a25578063f2fde38b14610a50578063f8bf517214610a7957610293565b8063aa06229014610874578063b88d4fde1461089d578063bc951b91146108c6578063c87b56dd146108f1578063cffb6e201461092e578063d1d192131461095757610293565b80639257e044116101135780639257e0441461078357806394354fd0146107ae57806395d89b41146107d9578063a22cb46514610804578063a2522d2d1461082d578063a475b5dd1461084957610293565b8063715018a61461069b5780637ec4a659146106b25780637f6e9093146106db5780638da5cb5b146107065780638e07484c146107315780638f65fe0a1461075a57610293565b806337a66d85116101fe5780634d9c1848116101b75780634d9c18481461057457806359bf5dbb1461059d5780635c975abb146105da57806360e85cde146106055780636352211e1461062157806370a082311461065e57610293565b806337a66d85146104a05780633af32abf146104b75780633bd64968146104f45780633ccfd60b1461050b57806342842e0e1461052257806344a0d68a1461054b57610293565b80631067fcc7116102505780631067fcc7146103a657806313faede6146103cf57806318160ddd146103fa57806323b872dd1461042557806328b60d151461044e5780632f6f98e11461047757610293565b806301ffc9a71461029857806306421c2f146102d557806306fdde03146102fe578063081812fc14610329578063093cfa6314610366578063095ea7b31461037d575b600080fd5b3480156102a457600080fd5b506102bf60048036038101906102ba91906141e6565b610aa4565b6040516102cc919061422e565b60405180910390f35b3480156102e157600080fd5b506102fc60048036038101906102f79190614283565b610b86565b005b34801561030a57600080fd5b50610313610c22565b6040516103209190614349565b60405180910390f35b34801561033557600080fd5b50610350600480360381019061034b91906143a1565b610cb4565b60405161035d919061440f565b60405180910390f35b34801561037257600080fd5b5061037b610d30565b005b34801561038957600080fd5b506103a4600480360381019061039f9190614456565b610dd8565b005b3480156103b257600080fd5b506103cd60048036038101906103c891906145cb565b610ee2565b005b3480156103db57600080fd5b506103e4610f78565b6040516103f19190614623565b60405180910390f35b34801561040657600080fd5b5061040f610f7e565b60405161041c9190614623565b60405180910390f35b34801561043157600080fd5b5061044c6004803603810190610447919061463e565b610f95565b005b34801561045a57600080fd5b50610475600480360381019061047091906146ca565b611177565b005b34801561048357600080fd5b5061049e600480360381019061049991906146f7565b611211565b005b3480156104ac57600080fd5b506104b561131e565b005b3480156104c357600080fd5b506104de60048036038101906104d99190614737565b6113e1565b6040516104eb919061422e565b60405180910390f35b34801561050057600080fd5b50610509611401565b005b34801561051757600080fd5b506105206114a9565b005b34801561052e57600080fd5b506105496004803603810190610544919061463e565b611574565b005b34801561055757600080fd5b50610572600480360381019061056d91906143a1565b611756565b005b34801561058057600080fd5b5061059b600480360381019061059691906146ca565b6117dc565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190614737565b61187a565b6040516105d19190614773565b60405180910390f35b3480156105e657600080fd5b506105ef61189a565b6040516105fc919061422e565b60405180910390f35b61061f600480360381019061061a91906146ca565b6118ad565b005b34801561062d57600080fd5b50610648600480360381019061064391906143a1565b611c9b565b604051610655919061440f565b60405180910390f35b34801561066a57600080fd5b5061068560048036038101906106809190614737565b611cb1565b6040516106929190614623565b60405180910390f35b3480156106a757600080fd5b506106b0611d80565b005b3480156106be57600080fd5b506106d960048036038101906106d491906145cb565b611e08565b005b3480156106e757600080fd5b506106f0611e9e565b6040516106fd919061422e565b60405180910390f35b34801561071257600080fd5b5061071b611eb1565b604051610728919061440f565b60405180910390f35b34801561073d57600080fd5b50610758600480360381019061075391906147ee565b611edb565b005b34801561076657600080fd5b50610781600480360381019061077c91906147ee565b612002565b005b34801561078f57600080fd5b50610798612129565b6040516107a59190614623565b60405180910390f35b3480156107ba57600080fd5b506107c361212f565b6040516107d09190614773565b60405180910390f35b3480156107e557600080fd5b506107ee612142565b6040516107fb9190614349565b60405180910390f35b34801561081057600080fd5b5061082b60048036038101906108269190614867565b6121d4565b005b610847600480360381019061084291906146ca565b61234b565b005b34801561085557600080fd5b5061085e6126ad565b60405161086b919061422e565b60405180910390f35b34801561088057600080fd5b5061089b600480360381019061089691906146ca565b6126c0565b005b3480156108a957600080fd5b506108c460048036038101906108bf9190614948565b61275a565b005b3480156108d257600080fd5b506108db61293f565b6040516108e89190614773565b60405180910390f35b3480156108fd57600080fd5b50610918600480360381019061091391906143a1565b612952565b6040516109259190614349565b60405180910390f35b34801561093a57600080fd5b50610955600480360381019061095091906149cb565b612aaa565b005b34801561096357600080fd5b5061097e600480360381019061097991906143a1565b612c13565b005b34801561098c57600080fd5b50610995612c9d565b6040516109a29190614a3a565b60405180910390f35b3480156109b757600080fd5b506109d260048036038101906109cd9190614737565b612cb1565b6040516109df9190614773565b60405180910390f35b3480156109f457600080fd5b50610a0f6004803603810190610a0a9190614a55565b612cd1565b604051610a1c919061422e565b60405180910390f35b348015610a3157600080fd5b50610a3a612d65565b604051610a479190614349565b60405180910390f35b348015610a5c57600080fd5b50610a776004803603810190610a729190614737565b612df3565b005b348015610a8557600080fd5b50610a8e612eea565b604051610a9b9190614773565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610b6f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b7f5750610b7e82612efd565b5b9050919050565b610b8e612f67565b73ffffffffffffffffffffffffffffffffffffffff16610bac611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf990614ae1565b60405180910390fd5b80600e60006101000a81548161ffff021916908361ffff16021790555050565b606060028054610c3190614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5d90614b30565b8015610caa5780601f10610c7f57610100808354040283529160200191610caa565b820191906000526020600020905b815481529060010190602001808311610c8d57829003601f168201915b5050505050905090565b6000610cbf82612f6f565b610cf5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610d38612f67565b73ffffffffffffffffffffffffffffffffffffffff16610d56611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390614ae1565b60405180910390fd5b600e60059054906101000a900460ff1615600e60056101000a81548160ff021916908315150217905550565b6000610de382611c9b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e4a576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e69612f67565b73ffffffffffffffffffffffffffffffffffffffff1614158015610e9b5750610e9981610e94612f67565b612cd1565b155b15610ed2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610edd838383612fbd565b505050565b610eea612f67565b73ffffffffffffffffffffffffffffffffffffffff16610f08611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614610f5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5590614ae1565b60405180910390fd5b80600b9080519060200190610f74929190614094565b5050565b600c5481565b6000610f8861306f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611165573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361100757611002848484613074565b611171565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611050929190614b61565b602060405180830381865afa15801561106d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110919190614b9f565b801561112357506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016110e1929190614b61565b602060405180830381865afa1580156110fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111229190614b9f565b5b61116457336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161115b919061440f565b60405180910390fd5b5b611170848484613074565b5b50505050565b61117f612f67565b73ffffffffffffffffffffffffffffffffffffffff1661119d611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146111f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ea90614ae1565b60405180910390fd5b80600e60036101000a81548160ff021916908360ff16021790555050565b611219612f67565b73ffffffffffffffffffffffffffffffffffffffff16611237611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461128d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128490614ae1565b60405180910390fd5b6000611297610f7e565b9050600e60009054906101000a900461ffff1661ffff1683826112ba9190614bfb565b61ffff1611156112ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f690614c7f565b60405180910390fd5b61130d828461ffff16613084565b600092506000915060009050505050565b611326612f67565b73ffffffffffffffffffffffffffffffffffffffff16611344611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614ae1565b60405180910390fd5b600e60069054906101000a900460ff1615600e60066101000a81548160ff0219169083151502179055506001600e60056101000a81548160ff021916908315150217905550565b60116020528060005260406000206000915054906101000a900460ff1681565b611409612f67565b73ffffffffffffffffffffffffffffffffffffffff16611427611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461147d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147490614ae1565b60405180910390fd5b600e60079054906101000a900460ff1615600e60076101000a81548160ff021916908315150217905550565b6114b1612f67565b73ffffffffffffffffffffffffffffffffffffffff166114cf611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611525576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151c90614ae1565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015611570573d6000803e3d6000fd5b5050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611744573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036115e6576115e18484846130a2565b611750565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161162f929190614b61565b602060405180830381865afa15801561164c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116709190614b9f565b801561170257506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016116c0929190614b61565b602060405180830381865afa1580156116dd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117019190614b9f565b5b61174357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161173a919061440f565b60405180910390fd5b5b61174f8484846130a2565b5b50505050565b61175e612f67565b73ffffffffffffffffffffffffffffffffffffffff1661177c611eb1565b73ffffffffffffffffffffffffffffffffffffffff16146117d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c990614ae1565b60405180910390fd5b80600c8190555050565b6117e4612f67565b73ffffffffffffffffffffffffffffffffffffffff16611802611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611858576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184f90614ae1565b60405180910390fd5b80600e60046101000a81548160ff021916908360ff1602179055506000905050565b600f6020528060005260406000206000915054906101000a900460ff1681565b600e60069054906101000a900460ff1681565b6000600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1690506000611908610f7e565b9050601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16611996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198d90614ceb565b60405180910390fd5b600e60009054906101000a900461ffff1661ffff168360ff16826119ba9190614bfb565b61ffff1611156119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f690614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff168383611a1e9190614d0b565b60ff161115611a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5990614d8e565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff161115611aba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab190614dfa565b60405180910390fd5b600e60059054906101000a900460ff1615611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0190614e66565b60405180910390fd5b600e60049054906101000a900460ff1660ff168260ff1610611b7e578260ff16600d54611b379190614e86565b341015611b79576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7090614f2c565b60405180910390fd5b611c1e565b60008284611b8c9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff161115611c1c57600e60049054906101000a900460ff1681611bc69190614f4c565b90508060ff16600d54611bd99190614e86565b341015611c1b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1290614f2c565b60405180910390fd5b5b505b611c2b338460ff16613084565b8282611c379190614d0b565b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000925060009150505050565b6000611ca6826130c2565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d18576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611d88612f67565b73ffffffffffffffffffffffffffffffffffffffff16611da6611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611df390614ae1565b60405180910390fd5b611e066000613351565b565b611e10612f67565b73ffffffffffffffffffffffffffffffffffffffff16611e2e611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7b90614ae1565b60405180910390fd5b8060099080519060200190611e9a929190614094565b5050565b600e60059054906101000a900460ff1681565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611ee3612f67565b73ffffffffffffffffffffffffffffffffffffffff16611f01611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4e90614ae1565b60405180910390fd5b60005b828290508160ff161015611ffd5760016011600085858560ff16818110611f8457611f83614f80565b5b9050602002016020810190611f999190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ff590614faf565b915050611f5a565b505050565b61200a612f67565b73ffffffffffffffffffffffffffffffffffffffff16612028611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461207e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207590614ae1565b60405180910390fd5b60005b828290508160ff1610156121245760006011600085858560ff168181106120ab576120aa614f80565b5b90506020020160208101906120c09190614737565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550808061211c90614faf565b915050612081565b505050565b600d5481565b600e60029054906101000a900460ff1681565b60606003805461215190614b30565b80601f016020809104026020016040519081016040528092919081815260200182805461217d90614b30565b80156121ca5780601f1061219f576101008083540402835291602001916121ca565b820191906000526020600020905b8154815290600101906020018083116121ad57829003601f168201915b5050505050905090565b6121dc612f67565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612240576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061224d612f67565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166122fa612f67565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161233f919061422e565b60405180910390a35050565b6000612355610f7e565b90506000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050600e60009054906101000a900461ffff1661ffff168360ff16836123cc9190614bfb565b61ffff161115612411576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161240890614c7f565b60405180910390fd5b600e60039054906101000a900460ff1660ff1681846124309190614d0b565b60ff161115612474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161246b90615024565b60405180910390fd5b600e60029054906101000a900460ff1660ff168360ff1611156124cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c390615024565b60405180910390fd5b600e60069054906101000a900460ff161561251c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251390615090565b60405180910390fd5b600e60049054906101000a900460ff1660ff168160ff1610612590578260ff16600c546125499190614e86565b34101561258b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258290614f2c565b60405180910390fd5b612630565b6000818461259e9190614d0b565b9050600e60049054906101000a900460ff1660ff168160ff16111561262e57600e60049054906101000a900460ff16816125d89190614f4c565b90508060ff16600c546125eb9190614e86565b34101561262d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161262490614f2c565b60405180910390fd5b5b505b61263d338460ff16613084565b80836126499190614d0b565b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506000915060009250505050565b600e60079054906101000a900460ff1681565b6126c8612f67565b73ffffffffffffffffffffffffffffffffffffffff166126e6611eb1565b73ffffffffffffffffffffffffffffffffffffffff161461273c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273390614ae1565b60405180910390fd5b80600e60026101000a81548160ff021916908360ff16021790555050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561292b573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036127cd576127c885858585613417565b612938565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401612816929190614b61565b602060405180830381865afa158015612833573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128579190614b9f565b80156128e957506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016128a7929190614b61565b602060405180830381865afa1580156128c4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128e89190614b9f565b5b61292a57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401612921919061440f565b60405180910390fd5b5b61293785858585613417565b5b5050505050565b600e60039054906101000a900460ff1681565b606061295d82612f6f565b61299c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299390615122565b60405180910390fd5b60001515600e60079054906101000a900460ff16151503612a4957600b80546129c490614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546129f090614b30565b8015612a3d5780601f10612a1257610100808354040283529160200191612a3d565b820191906000526020600020905b815481529060010190602001808311612a2057829003601f168201915b50505050509050612aa5565b6000612a53613493565b90506000815111612a735760405180602001604052806000815250612aa1565b80612a7d84613525565b600a604051602001612a9193929190615212565b6040516020818303038152906040525b9150505b919050565b612ab2612f67565b73ffffffffffffffffffffffffffffffffffffffff16612ad0611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612b26576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1d90614ae1565b60405180910390fd5b6000612b30610f7e565b90506000838390508560ff16612b469190614e86565b9050600e60009054906101000a900461ffff1661ffff16818361ffff16612b6d9190615243565b1115612bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba5906152e5565b60405180910390fd5b60005b84849050811015612c0357612bf0858583818110612bd257612bd1614f80565b5b9050602002016020810190612be79190614737565b8760ff16613084565b8080612bfb90615305565b915050612bb1565b5060009450600091505050505050565b612c1b612f67565b73ffffffffffffffffffffffffffffffffffffffff16612c39611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612c8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8690614ae1565b60405180910390fd5b80600d819055506000905050565b600e60009054906101000a900461ffff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054612d7290614b30565b80601f0160208091040260200160405190810160405280929190818152602001828054612d9e90614b30565b8015612deb5780601f10612dc057610100808354040283529160200191612deb565b820191906000526020600020905b815481529060010190602001808311612dce57829003601f168201915b505050505081565b612dfb612f67565b73ffffffffffffffffffffffffffffffffffffffff16612e19611eb1565b73ffffffffffffffffffffffffffffffffffffffff1614612e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e6690614ae1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612ede576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ed5906153bf565b60405180910390fd5b612ee781613351565b50565b600e60049054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081612f7a61306f565b11158015612f89575060005482105b8015612fb6575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b61307f838383613685565b505050565b61309e828260405180602001604052806000815250613b39565b5050565b6130bd8383836040518060200160405280600081525061275a565b505050565b6130ca61411a565b6000829050806130d861306f565b111580156130e7575060005481105b1561331a576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161331857600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146131fc57809250505061334c565b5b60011561331757818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461331257809250505061334c565b6131fd565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b613422848484613685565b6134418373ffffffffffffffffffffffffffffffffffffffff16613b4b565b8015613456575061345484848484613b6e565b155b1561348d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b6060600980546134a290614b30565b80601f01602080910402602001604051908101604052809291908181526020018280546134ce90614b30565b801561351b5780601f106134f05761010080835404028352916020019161351b565b820191906000526020600020905b8154815290600101906020018083116134fe57829003601f168201915b5050505050905090565b60606000820361356c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613680565b600082905060005b6000821461359e57808061358790615305565b915050600a82613597919061540e565b9150613574565b60008167ffffffffffffffff8111156135ba576135b96144a0565b5b6040519080825280601f01601f1916602001820160405280156135ec5781602001600182028036833780820191505090505b5090505b6000851461367957600182613605919061543f565b9150600a856136149190615473565b60306136209190615243565b60f81b81838151811061363657613635614f80565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85613672919061540e565b94506135f0565b8093505050505b919050565b6000613690826130c2565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146136fb576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661371c612f67565b73ffffffffffffffffffffffffffffffffffffffff16148061374b575061374a85613745612f67565b612cd1565b5b806137905750613759612f67565b73ffffffffffffffffffffffffffffffffffffffff1661377884610cb4565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806137c9576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361382f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61383c8585856001613cbe565b61384860008487612fbd565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603613ac7576000548214613ac657878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613b328585856001613cc4565b5050505050565b613b468383836001613cca565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613b94612f67565b8786866040518563ffffffff1660e01b8152600401613bb694939291906154f9565b6020604051808303816000875af1925050508015613bf257506040513d601f19601f82011682018060405250810190613bef919061555a565b60015b613c6b573d8060008114613c22576040519150601f19603f3d011682016040523d82523d6000602084013e613c27565b606091505b506000815103613c63576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603613d36576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613d70576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613d7d6000868387613cbe565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015613f475750613f468773ffffffffffffffffffffffffffffffffffffffff16613b4b565b5b1561400c575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613fbc6000888480600101955088613b6e565b613ff2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613f4d57826000541461400757600080fd5b614077565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480820361400d575b81600081905550505061408d6000868387613cc4565b5050505050565b8280546140a090614b30565b90600052602060002090601f0160209004810192826140c25760008555614109565b82601f106140db57805160ff1916838001178555614109565b82800160010185558215614109579182015b828111156141085782518255916020019190600101906140ed565b5b509050614116919061415d565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b8082111561417657600081600090555060010161415e565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6141c38161418e565b81146141ce57600080fd5b50565b6000813590506141e0816141ba565b92915050565b6000602082840312156141fc576141fb614184565b5b600061420a848285016141d1565b91505092915050565b60008115159050919050565b61422881614213565b82525050565b6000602082019050614243600083018461421f565b92915050565b600061ffff82169050919050565b61426081614249565b811461426b57600080fd5b50565b60008135905061427d81614257565b92915050565b60006020828403121561429957614298614184565b5b60006142a78482850161426e565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156142ea5780820151818401526020810190506142cf565b838111156142f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061431b826142b0565b61432581856142bb565b93506143358185602086016142cc565b61433e816142ff565b840191505092915050565b600060208201905081810360008301526143638184614310565b905092915050565b6000819050919050565b61437e8161436b565b811461438957600080fd5b50565b60008135905061439b81614375565b92915050565b6000602082840312156143b7576143b6614184565b5b60006143c58482850161438c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006143f9826143ce565b9050919050565b614409816143ee565b82525050565b60006020820190506144246000830184614400565b92915050565b614433816143ee565b811461443e57600080fd5b50565b6000813590506144508161442a565b92915050565b6000806040838503121561446d5761446c614184565b5b600061447b85828601614441565b925050602061448c8582860161438c565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6144d8826142ff565b810181811067ffffffffffffffff821117156144f7576144f66144a0565b5b80604052505050565b600061450a61417a565b905061451682826144cf565b919050565b600067ffffffffffffffff821115614536576145356144a0565b5b61453f826142ff565b9050602081019050919050565b82818337600083830152505050565b600061456e6145698461451b565b614500565b90508281526020810184848401111561458a5761458961449b565b5b61459584828561454c565b509392505050565b600082601f8301126145b2576145b1614496565b5b81356145c284826020860161455b565b91505092915050565b6000602082840312156145e1576145e0614184565b5b600082013567ffffffffffffffff8111156145ff576145fe614189565b5b61460b8482850161459d565b91505092915050565b61461d8161436b565b82525050565b60006020820190506146386000830184614614565b92915050565b60008060006060848603121561465757614656614184565b5b600061466586828701614441565b935050602061467686828701614441565b92505060406146878682870161438c565b9150509250925092565b600060ff82169050919050565b6146a781614691565b81146146b257600080fd5b50565b6000813590506146c48161469e565b92915050565b6000602082840312156146e0576146df614184565b5b60006146ee848285016146b5565b91505092915050565b6000806040838503121561470e5761470d614184565b5b600061471c8582860161426e565b925050602061472d85828601614441565b9150509250929050565b60006020828403121561474d5761474c614184565b5b600061475b84828501614441565b91505092915050565b61476d81614691565b82525050565b60006020820190506147886000830184614764565b92915050565b600080fd5b600080fd5b60008083601f8401126147ae576147ad614496565b5b8235905067ffffffffffffffff8111156147cb576147ca61478e565b5b6020830191508360208202830111156147e7576147e6614793565b5b9250929050565b6000806020838503121561480557614804614184565b5b600083013567ffffffffffffffff81111561482357614822614189565b5b61482f85828601614798565b92509250509250929050565b61484481614213565b811461484f57600080fd5b50565b6000813590506148618161483b565b92915050565b6000806040838503121561487e5761487d614184565b5b600061488c85828601614441565b925050602061489d85828601614852565b9150509250929050565b600067ffffffffffffffff8211156148c2576148c16144a0565b5b6148cb826142ff565b9050602081019050919050565b60006148eb6148e6846148a7565b614500565b9050828152602081018484840111156149075761490661449b565b5b61491284828561454c565b509392505050565b600082601f83011261492f5761492e614496565b5b813561493f8482602086016148d8565b91505092915050565b6000806000806080858703121561496257614961614184565b5b600061497087828801614441565b945050602061498187828801614441565b93505060406149928782880161438c565b925050606085013567ffffffffffffffff8111156149b3576149b2614189565b5b6149bf8782880161491a565b91505092959194509250565b6000806000604084860312156149e4576149e3614184565b5b60006149f2868287016146b5565b935050602084013567ffffffffffffffff811115614a1357614a12614189565b5b614a1f86828701614798565b92509250509250925092565b614a3481614249565b82525050565b6000602082019050614a4f6000830184614a2b565b92915050565b60008060408385031215614a6c57614a6b614184565b5b6000614a7a85828601614441565b9250506020614a8b85828601614441565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614acb6020836142bb565b9150614ad682614a95565b602082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680614b4857607f821691505b602082108103614b5b57614b5a614b01565b5b50919050565b6000604082019050614b766000830185614400565b614b836020830184614400565b9392505050565b600081519050614b998161483b565b92915050565b600060208284031215614bb557614bb4614184565b5b6000614bc384828501614b8a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614c0682614249565b9150614c1183614249565b92508261ffff03821115614c2857614c27614bcc565b5b828201905092915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000614c696013836142bb565b9150614c7482614c33565b602082019050919050565b60006020820190508181036000830152614c9881614c5c565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564000000000000000000600082015250565b6000614cd56017836142bb565b9150614ce082614c9f565b602082019050919050565b60006020820190508181036000830152614d0481614cc8565b9050919050565b6000614d1682614691565b9150614d2183614691565b92508260ff03821115614d3757614d36614bcc565b5b828201905092915050565b7f45786365656473206d617820206c696d69742020706572206164647265737300600082015250565b6000614d78601f836142bb565b9150614d8382614d42565b602082019050919050565b60006020820190508181036000830152614da781614d6b565b9050919050565b7f45786365656473206d617820206c696d69742020706572207478000000000000600082015250565b6000614de4601a836142bb565b9150614def82614dae565b602082019050919050565b60006020820190508181036000830152614e1381614dd7565b9050919050565b7f57686974656c697374206d696e74696e67206973206f76657221000000000000600082015250565b6000614e50601a836142bb565b9150614e5b82614e1a565b602082019050919050565b60006020820190508181036000830152614e7f81614e43565b9050919050565b6000614e918261436b565b9150614e9c8361436b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614ed557614ed4614bcc565b5b828202905092915050565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b6000614f166013836142bb565b9150614f2182614ee0565b602082019050919050565b60006020820190508181036000830152614f4581614f09565b9050919050565b6000614f5782614691565b9150614f6283614691565b925082821015614f7557614f74614bcc565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000614fba82614691565b915060ff8203614fcd57614fcc614bcc565b5b600182019050919050565b7f45786365656473206d6178207065722057616c6c65742e000000000000000000600082015250565b600061500e6017836142bb565b915061501982614fd8565b602082019050919050565b6000602082019050818103600083015261503d81615001565b9050919050565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b600061507a6017836142bb565b915061508582615044565b602082019050919050565b600060208201905081810360008301526150a98161506d565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061510c602f836142bb565b9150615117826150b0565b604082019050919050565b6000602082019050818103600083015261513b816150ff565b9050919050565b600081905092915050565b6000615158826142b0565b6151628185615142565b93506151728185602086016142cc565b80840191505092915050565b60008190508160005260206000209050919050565b600081546151a081614b30565b6151aa8186615142565b945060018216600081146151c557600181146151d657615209565b60ff19831686528186019350615209565b6151df8561517e565b60005b83811015615201578154818901526001820191506020810190506151e2565b838801955050505b50505092915050565b600061521e828661514d565b915061522a828561514d565b91506152368284615193565b9150819050949350505050565b600061524e8261436b565b91506152598361436b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561528e5761528d614bcc565b5b828201905092915050565b7f45786365656573206d617820737570706c792e00000000000000000000000000600082015250565b60006152cf6013836142bb565b91506152da82615299565b602082019050919050565b600060208201905081810360008301526152fe816152c2565b9050919050565b60006153108261436b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361534257615341614bcc565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006153a96026836142bb565b91506153b48261534d565b604082019050919050565b600060208201905081810360008301526153d88161539c565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006154198261436b565b91506154248361436b565b925082615434576154336153df565b5b828204905092915050565b600061544a8261436b565b91506154558361436b565b92508282101561546857615467614bcc565b5b828203905092915050565b600061547e8261436b565b91506154898361436b565b925082615499576154986153df565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006154cb826154a4565b6154d581856154af565b93506154e58185602086016142cc565b6154ee816142ff565b840191505092915050565b600060808201905061550e6000830187614400565b61551b6020830186614400565b6155286040830185614614565b818103606083015261553a81846154c0565b905095945050505050565b600081519050615554816141ba565b92915050565b6000602082840312156155705761556f614184565b5b600061557e84828501615545565b9150509291505056fea26469706673582212204336e083c8cbfa677684e63b352270a4f4cd8b4084fdf8b288b876ba436bf28c64736f6c634300080d0033

Deployed Bytecode Sourcemap

48629:6893:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24518:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51394:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27631:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29134:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52004:75;;;;;;;;;;;;;:::i;:::-;;28697:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54080:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48851:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23767:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54941:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54561:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50578:326;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54190:91;;;;;;;;;;;;;:::i;:::-;;49368:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54368:70;;;;;;;;;;;;;:::i;:::-;;54687:144;;;;;;;;;;;;;:::i;:::-;;55112:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54287:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52198:134;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49255:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49195:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52760:1207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27439:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24887:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43340:103;;;;;;;;;;;;;:::i;:::-;;53973:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49163:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42688:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52344:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52552:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48888:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48966:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27800:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29410:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49518:1052;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49225:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54444:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55291:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49006:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51506:490;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50910:473;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52083:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48932:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49310:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29768:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48811:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43598:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49052:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24518:305;24620:4;24672:25;24657:40;;;:11;:40;;;;:105;;;;24729:33;24714:48;;;:11;:48;;;;24657:105;:158;;;;24779:36;24803:11;24779:23;:36::i;:::-;24657:158;24637:178;;24518:305;;;:::o;51394:97::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51475:10:::1;51463:9;;:22;;;;;;;;;;;;;;;;;;51394:97:::0;:::o;27631:100::-;27685:13;27718:5;27711:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27631:100;:::o;29134:204::-;29202:7;29227:16;29235:7;29227;:16::i;:::-;29222:64;;29252:34;;;;;;;;;;;;;;29222:64;29306:15;:24;29322:7;29306:24;;;;;;;;;;;;;;;;;;;;;29299:31;;29134:204;;;:::o;52004:75::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52065:8:::1;;;;;;;;;;;52064:9;52053:8;;:20;;;;;;;;;;;;;;;;;;52004:75::o:0;28697:371::-;28770:13;28786:24;28802:7;28786:15;:24::i;:::-;28770:40;;28831:5;28825:11;;:2;:11;;;28821:48;;28845:24;;;;;;;;;;;;;;28821:48;28902:5;28886:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;28912:37;28929:5;28936:12;:10;:12::i;:::-;28912:16;:37::i;:::-;28911:38;28886:63;28882:138;;;28973:35;;;;;;;;;;;;;;28882:138;29032:28;29041:2;29045:7;29054:5;29032:8;:28::i;:::-;28759:309;28697:371;;:::o;54080:102::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54166:10:::1;54154:9;:22;;;;;;;;;;;;:::i;:::-;;54080:102:::0;:::o;48851:32::-;;;;:::o;23767:303::-;23811:7;24036:15;:13;:15::i;:::-;24021:12;;24005:13;;:28;:46;23998:53;;23767:303;:::o;54941:163::-;55042:4;47650:1;46464:42;47604:43;;;:47;47600:699;;;47891:10;47883:18;;:4;:18;;;47879:85;;55059:37:::1;55078:4;55084:2;55088:7;55059:18;:37::i;:::-;47942:7:::0;;47879:85;46464:42;48024:40;;;48073:4;48080:10;48024:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46464:42;48120:40;;;48169:4;48176;48120:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48024:157;47978:310;;48261:10;48242:30;;;;;;;;;;;:::i;:::-;;;;;;;;47978:310;47600:699;55059:37:::1;55078:4;55084:2;55088:7;55059:18;:37::i;:::-;54941:163:::0;;;;;:::o;54561:115::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54662:6:::1;54637:22;;:31;;;;;;;;;;;;;;;;;;54561:115:::0;:::o;50578:326::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50661:18:::1;50689:13;:11;:13::i;:::-;50661:42;;50747:9;;;;;;;;;;;50718:38;;50732:11;50718;:25;;;;:::i;:::-;:38;;;;50710:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;50788:34;50798:9;50810:11;50788:34;;:9;:34::i;:::-;50830:18;;;50856:16;;;50880:18;;;50653:251;50578:326:::0;;:::o;54190:91::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54247:6:::1;;;;;;;;;;;54246:7;54237:6;;:16;;;;;;;;;;;;;;;;;;54271:4;54260:8;;:15;;;;;;;;;;;;;;;;;;54190:91::o:0;49368:46::-;;;;;;;;;;;;;;;;;;;;;;:::o;54368:70::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54427:6:::1;;;;;;;;;;;54426:7;54417:6;;:16;;;;;;;;;;;;;;;;;;54368:70::o:0;54687:144::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54731:13:::1;54747:21;54731:37;;54784:10;54776:28;;:39;54805:8;54776:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54726:105;54687:144::o:0;55112:171::-;55217:4;47650:1;46464:42;47604:43;;;:47;47600:699;;;47891:10;47883:18;;:4;:18;;;47879:85;;55234:41:::1;55257:4;55263:2;55267:7;55234:22;:41::i;:::-;47942:7:::0;;47879:85;46464:42;48024:40;;;48073:4;48080:10;48024:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46464:42;48120:40;;;48169:4;48176;48120:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48024:157;47978:310;;48261:10;48242:30;;;;;;;;;;;:::i;:::-;;;;;;;;47978:310;47600:699;55234:41:::1;55257:4;55263:2;55267:7;55234:22;:41::i;:::-;55112:171:::0;;;;;:::o;54287:76::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54350:5:::1;54343:4;:12;;;;54287:76:::0;:::o;52198:134::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52301:6:::1;52272:26;;:35;;;;;;;;;;;;;;;;;;52313:13;;;52198:134:::0;:::o;49255:49::-;;;;;;;;;;;;;;;;;;;;;;:::o;49195:25::-;;;;;;;;;;;;;:::o;52760:1207::-;52846:9;52858:15;:27;52874:10;52858:27;;;;;;;;;;;;;;;;;;;;;;;;;52846:39;;52896:18;52924:13;:11;:13::i;:::-;52896:42;;52956:13;:25;52970:10;52956:25;;;;;;;;;;;;;;;;;;;;;;;;;52948:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;53057:9;;;;;;;;;;;53028:38;;53042:11;53028:25;;:11;:25;;;;:::i;:::-;:38;;;;53020:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53132:22;;;;;;;;;;;53111:43;;53117:11;53111:3;:17;;;;:::i;:::-;:43;;;;53102:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;53225:18;;;;;;;;;;;53210:33;;:11;:33;;;;53201:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;53302:8;;;;;;;;;;;53301:9;53293:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53363:26;;;;;;;;;;;53356:33;;:3;:33;;;53353:435;;53440:11;53424:27;;:13;;:27;;;;:::i;:::-;53411:9;:40;;53403:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;53353:435;;;53506:16;53539:3;53525:11;:17;;;;:::i;:::-;53506:36;;53569:26;;;;;;;;;;;53556:39;;:10;:39;;;53553:208;;;53642:26;;;;;;;;;;;53629:10;:39;;;;:::i;:::-;53616:52;;53716:10;53700:26;;:13;;:26;;;;:::i;:::-;53687:9;:39;;53679:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;53553:208;53494:294;53353:435;53809:35;53819:10;53832:11;53809:35;;:9;:35::i;:::-;53888:11;53882:3;:17;;;;:::i;:::-;53853:15;:27;53869:10;53853:27;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;53915:18;;;53943:10;;;52819:1148;;52760:1207;:::o;27439:125::-;27503:7;27530:21;27543:7;27530:12;:21::i;:::-;:26;;;27523:33;;27439:125;;;:::o;24887:206::-;24951:7;24992:1;24975:19;;:5;:19;;;24971:60;;25003:28;;;;;;;;;;;;;;24971:60;25057:12;:19;25070:5;25057:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;25049:36;;25042:43;;24887:206;;;:::o;43340:103::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43405:30:::1;43432:1;43405:18;:30::i;:::-;43340:103::o:0;53973:102::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54059:10:::1;54047:9;:22;;;;;;;;;;;;:::i;:::-;;53973:102:::0;:::o;49163:27::-;;;;;;;;;;;;;:::o;42688:87::-;42734:7;42761:6;;;;;;;;;;;42754:13;;42688:87;:::o;52344:200::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52437:7:::1;52433:101;52454:7;;:14;;52450:1;:18;;;52433:101;;;52518:4;52490:13;:25;52504:7;;52512:1;52504:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52490:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;52470:3;;;;;:::i;:::-;;;;52433:101;;;;52344:200:::0;;:::o;52552:204::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52650:7:::1;52646:103;52667:7;;:14;;52663:1;:18;;;52646:103;;;52732:5;52704:13;:25;52718:7;;52726:1;52718:10;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;52704:25;;;;;;;;;;;;;;;;:33;;;;;;;;;;;;;;;;;;52683:3;;;;;:::i;:::-;;;;52646:103;;;;52552:204:::0;;:::o;48888:32::-;;;;:::o;48966:35::-;;;;;;;;;;;;;:::o;27800:104::-;27856:13;27889:7;27882:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27800:104;:::o;29410:287::-;29521:12;:10;:12::i;:::-;29509:24;;:8;:24;;;29505:54;;29542:17;;;;;;;;;;;;;;29505:54;29617:8;29572:18;:32;29591:12;:10;:12::i;:::-;29572:32;;;;;;;;;;;;;;;:42;29605:8;29572:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;29670:8;29641:48;;29656:12;:10;:12::i;:::-;29641:48;;;29680:8;29641:48;;;;;;:::i;:::-;;;;;;;;29410:287;;:::o;49518:1052::-;49577:18;49605:13;:11;:13::i;:::-;49577:42;;49627:9;49639:19;:31;49659:10;49639:31;;;;;;;;;;;;;;;;;;;;;;;;;49627:43;;49714:9;;;;;;;;;;;49685:38;;49699:11;49685:25;;:11;:25;;;;:::i;:::-;:38;;;;49677:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49783:22;;;;;;;;;;;49762:43;;49776:3;49762:11;:17;;;;:::i;:::-;:43;;;;49754:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;49864:18;;;;;;;;;;;49848:34;;:11;:34;;;;49840:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49928:6;;;;;;;;;;;49927:7;49919:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;49987:26;;;;;;;;;;;49980:33;;:3;:33;;;49977:417;;50055:11;50048:18;;:4;;:18;;;;:::i;:::-;50035:9;:31;;50027:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49977:417;;;50121:16;50154:3;50140:11;:17;;;;:::i;:::-;50121:36;;50184:26;;;;;;;;;;;50171:39;;:10;:39;;;50168:199;;;50257:26;;;;;;;;;;;50244:10;:39;;;;:::i;:::-;50231:52;;50322:10;50315:17;;:4;;:17;;;;:::i;:::-;50302:9;:30;;50294:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;50168:199;50109:285;49977:417;50410:35;50420:10;50433:11;50410:35;;:9;:35::i;:::-;50502:3;50488:11;:17;;;;:::i;:::-;50454:19;:31;50474:10;50454:31;;;;;;;;;;;;;;;;:51;;;;;;;;;;;;;;;;;;50520:18;;;50546;;;49569:1001;;49518:1052;:::o;49225:25::-;;;;;;;;;;;;;:::o;54444:107::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;54537:6:::1;54516:18;;:27;;;;;;;;;;;;;;;;;;54444:107:::0;:::o;55291:228::-;55442:4;47650:1;46464:42;47604:43;;;:47;47600:699;;;47891:10;47883:18;;:4;:18;;;47879:85;;55464:47:::1;55487:4;55493:2;55497:7;55506:4;55464:22;:47::i;:::-;47942:7:::0;;47879:85;46464:42;48024:40;;;48073:4;48080:10;48024:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;46464:42;48120:40;;;48169:4;48176;48120:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;48024:157;47978:310;;48261:10;48242:30;;;;;;;;;;;:::i;:::-;;;;;;;;47978:310;47600:699;55464:47:::1;55487:4;55493:2;55497:7;55506:4;55464:22;:47::i;:::-;55291:228:::0;;;;;;:::o;49006:39::-;;;;;;;;;;;;;:::o;51506:490::-;51605:13;51646:17;51654:8;51646:7;:17::i;:::-;51630:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;51756:5;51746:15;;:6;;;;;;;;;;;:15;;;51741:50;;51778:9;51771:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51741:50;51805:28;51836:10;:8;:10::i;:::-;51805:41;;51891:1;51866:14;51860:28;:32;:130;;;;;;;;;;;;;;;;;51928:14;51944:19;:8;:17;:19::i;:::-;51965:9;51911:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51860:130;51853:137;;;51506:490;;;;:::o;50910:473::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;51010:18:::1;51038:13;:11;:13::i;:::-;51010:42;;51060:16;51101:9;;:16;;51081:17;:36;;;;;;:::i;:::-;51060:57;;51161:9;;;;;;;;;;;51132:38;;51146:11;51132;:25;;;;;;:::i;:::-;:38;;51124:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;51207:9;51202:116;51226:9;;:16;;51222:1;:20;51202:116;;;51264:42;51274:9;;51284:1;51274:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;51288:17;51264:42;;:9;:42::i;:::-;51244:3;;;;;:::i;:::-;;;;51202:116;;;;51327:24;;;51359:18;;;51002:381;;50910:473:::0;;;:::o;52083:106::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;52159:5:::1;52143:13;:21;;;;52171:12;;;52083:106:::0;:::o;48932:29::-;;;;;;;;;;;;;:::o;49310:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;29768:164::-;29865:4;29889:18;:25;29908:5;29889:25;;;;;;;;;;;;;;;:35;29915:8;29889:35;;;;;;;;;;;;;;;;;;;;;;;;;29882:42;;29768:164;;;;:::o;48811:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43598:201::-;42919:12;:10;:12::i;:::-;42908:23;;:7;:5;:7::i;:::-;:23;;;42900:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;43707:1:::1;43687:22;;:8;:22;;::::0;43679:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;43763:28;43782:8;43763:18;:28::i;:::-;43598:201:::0;:::o;49052:43::-;;;;;;;;;;;;;:::o;14443:157::-;14528:4;14567:25;14552:40;;;:11;:40;;;;14545:47;;14443:157;;;:::o;2913:98::-;2966:7;2993:10;2986:17;;2913:98;:::o;31120:187::-;31177:4;31220:7;31201:15;:13;:15::i;:::-;:26;;:53;;;;;31241:13;;31231:7;:23;31201:53;:98;;;;;31272:11;:20;31284:7;31272:20;;;;;;;;;;;:27;;;;;;;;;;;;31271:28;31201:98;31194:105;;31120:187;;;:::o;39290:196::-;39432:2;39405:15;:24;39421:7;39405:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39470:7;39466:2;39450:28;;39459:5;39450:28;;;;;;;;;;;;39290:196;;;:::o;23541:92::-;23597:7;23541:92;:::o;29999:170::-;30133:28;30143:4;30149:2;30153:7;30133:9;:28::i;:::-;29999:170;;;:::o;31315:104::-;31384:27;31394:2;31398:8;31384:27;;;;;;;;;;;;:9;:27::i;:::-;31315:104;;:::o;30240:185::-;30378:39;30395:4;30401:2;30405:7;30378:39;;;;;;;;;;;;:16;:39::i;:::-;30240:185;;;:::o;26268:1109::-;26330:21;;:::i;:::-;26364:12;26379:7;26364:22;;26447:4;26428:15;:13;:15::i;:::-;:23;;:47;;;;;26462:13;;26455:4;:20;26428:47;26424:886;;;26496:31;26530:11;:17;26542:4;26530:17;;;;;;;;;;;26496:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26571:9;:16;;;26566:729;;26642:1;26616:28;;:9;:14;;;:28;;;26612:101;;26680:9;26673:16;;;;;;26612:101;27015:261;27022:4;27015:261;;;27055:6;;;;;;;;27100:11;:17;27112:4;27100:17;;;;;;;;;;;27088:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27174:1;27148:28;;:9;:14;;;:28;;;27144:109;;27216:9;27209:16;;;;;;27144:109;27015:261;;;26566:729;26477:833;26424:886;27338:31;;;;;;;;;;;;;;26268:1109;;;;:::o;43959:191::-;44033:16;44052:6;;;;;;;;;;;44033:25;;44078:8;44069:6;;:17;;;;;;;;;;;;;;;;;;44133:8;44102:40;;44123:8;44102:40;;;;;;;;;;;;44022:128;43959:191;:::o;30496:369::-;30663:28;30673:4;30679:2;30683:7;30663:9;:28::i;:::-;30706:15;:2;:13;;;:15::i;:::-;:76;;;;;30726:56;30757:4;30763:2;30767:7;30776:5;30726:30;:56::i;:::-;30725:57;30706:76;30702:156;;;30806:40;;;;;;;;;;;;;;30702:156;30496:369;;;;:::o;54839:97::-;54892:13;54921:9;54914:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54839:97;:::o;475:723::-;531:13;761:1;752:5;:10;748:53;;779:10;;;;;;;;;;;;;;;;;;;;;748:53;811:12;826:5;811:20;;842:14;867:78;882:1;874:4;:9;867:78;;900:8;;;;;:::i;:::-;;;;931:2;923:10;;;;;:::i;:::-;;;867:78;;;955:19;987:6;977:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;955:39;;1005:154;1021:1;1012:5;:10;1005:154;;1049:1;1039:11;;;;;:::i;:::-;;;1116:2;1108:5;:10;;;;:::i;:::-;1095:2;:24;;;;:::i;:::-;1082:39;;1065:6;1072;1065:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1145:2;1136:11;;;;;:::i;:::-;;;1005:154;;;1183:6;1169:21;;;;;475:723;;;;:::o;34233:2130::-;34348:35;34386:21;34399:7;34386:12;:21::i;:::-;34348:59;;34446:4;34424:26;;:13;:18;;;:26;;;34420:67;;34459:28;;;;;;;;;;;;;;34420:67;34500:22;34542:4;34526:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;34563:36;34580:4;34586:12;:10;:12::i;:::-;34563:16;:36::i;:::-;34526:73;:126;;;;34640:12;:10;:12::i;:::-;34616:36;;:20;34628:7;34616:11;:20::i;:::-;:36;;;34526:126;34500:153;;34671:17;34666:66;;34697:35;;;;;;;;;;;;;;34666:66;34761:1;34747:16;;:2;:16;;;34743:52;;34772:23;;;;;;;;;;;;;;34743:52;34808:43;34830:4;34836:2;34840:7;34849:1;34808:21;:43::i;:::-;34916:35;34933:1;34937:7;34946:4;34916:8;:35::i;:::-;35277:1;35247:12;:18;35260:4;35247:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35321:1;35293:12;:16;35306:2;35293:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35339:31;35373:11;:20;35385:7;35373:20;;;;;;;;;;;35339:54;;35424:2;35408:8;:13;;;:18;;;;;;;;;;;;;;;;;;35474:15;35441:8;:23;;;:49;;;;;;;;;;;;;;;;;;35742:19;35774:1;35764:7;:11;35742:33;;35790:31;35824:11;:24;35836:11;35824:24;;;;;;;;;;;35790:58;;35892:1;35867:27;;:8;:13;;;;;;;;;;;;:27;;;35863:384;;36077:13;;36062:11;:28;36058:174;;36131:4;36115:8;:13;;;:20;;;;;;;;;;;;;;;;;;36184:13;:28;;;36158:8;:23;;;:54;;;;;;;;;;;;;;;;;;36058:174;35863:384;35222:1036;;;36294:7;36290:2;36275:27;;36284:4;36275:27;;;;;;;;;;;;36313:42;36334:4;36340:2;36344:7;36353:1;36313:20;:42::i;:::-;34337:2026;;34233:2130;;;:::o;31782:163::-;31905:32;31911:2;31915:8;31925:5;31932:4;31905:5;:32::i;:::-;31782:163;;;:::o;4360:326::-;4420:4;4677:1;4655:7;:19;;;:23;4648:30;;4360:326;;;:::o;39978:667::-;40141:4;40178:2;40162:36;;;40199:12;:10;:12::i;:::-;40213:4;40219:7;40228:5;40162:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40158:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40413:1;40396:6;:13;:18;40392:235;;40442:40;;;;;;;;;;;;;;40392:235;40585:6;40579:13;40570:6;40566:2;40562:15;40555:38;40158:480;40291:45;;;40281:55;;;:6;:55;;;;40274:62;;;39978:667;;;;;;:::o;41293:159::-;;;;;:::o;42111:158::-;;;;;:::o;32204:1775::-;32343:20;32366:13;;32343:36;;32408:1;32394:16;;:2;:16;;;32390:48;;32419:19;;;;;;;;;;;;;;32390:48;32465:1;32453:8;:13;32449:44;;32475:18;;;;;;;;;;;;;;32449:44;32506:61;32536:1;32540:2;32544:12;32558:8;32506:21;:61::i;:::-;32879:8;32844:12;:16;32857:2;32844:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32943:8;32903:12;:16;32916:2;32903:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33002:2;32969:11;:25;32981:12;32969:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;33069:15;33019:11;:25;33031:12;33019:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;33102:20;33125:12;33102:35;;33152:11;33181:8;33166:12;:23;33152:37;;33210:4;:23;;;;;33218:15;:2;:13;;;:15::i;:::-;33210:23;33206:641;;;33254:314;33310:12;33306:2;33285:38;;33302:1;33285:38;;;;;;;;;;;;33351:69;33390:1;33394:2;33398:14;;;;;;33414:5;33351:30;:69::i;:::-;33346:174;;33456:40;;;;;;;;;;;;;;33346:174;33563:3;33547:12;:19;33254:314;;33649:12;33632:13;;:29;33628:43;;33663:8;;;33628:43;33206:641;;;33712:120;33768:14;;;;;;33764:2;33743:40;;33760:1;33743:40;;;;;;;;;;;;33827:3;33811:12;:19;33712:120;;33206:641;33877:12;33861:13;:28;;;;32819:1082;;33911:60;33940:1;33944:2;33948:12;33962:8;33911:20;:60::i;:::-;32332:1647;32204:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:89::-;1554:7;1594:6;1587:5;1583:18;1572:29;;1518:89;;;:::o;1613:120::-;1685:23;1702:5;1685:23;:::i;:::-;1678:5;1675:34;1665:62;;1723:1;1720;1713:12;1665:62;1613:120;:::o;1739:137::-;1784:5;1822:6;1809:20;1800:29;;1838:32;1864:5;1838:32;:::i;:::-;1739:137;;;;:::o;1882:327::-;1940:6;1989:2;1977:9;1968:7;1964:23;1960:32;1957:119;;;1995:79;;:::i;:::-;1957:119;2115:1;2140:52;2184:7;2175:6;2164:9;2160:22;2140:52;:::i;:::-;2130:62;;2086:116;1882:327;;;;:::o;2215:99::-;2267:6;2301:5;2295:12;2285:22;;2215:99;;;:::o;2320:169::-;2404:11;2438:6;2433:3;2426:19;2478:4;2473:3;2469:14;2454:29;;2320:169;;;;:::o;2495:307::-;2563:1;2573:113;2587:6;2584:1;2581:13;2573:113;;;2672:1;2667:3;2663:11;2657:18;2653:1;2648:3;2644:11;2637:39;2609:2;2606:1;2602:10;2597:15;;2573:113;;;2704:6;2701:1;2698:13;2695:101;;;2784:1;2775:6;2770:3;2766:16;2759:27;2695:101;2544:258;2495:307;;;:::o;2808:102::-;2849:6;2900:2;2896:7;2891:2;2884:5;2880:14;2876:28;2866:38;;2808:102;;;:::o;2916:364::-;3004:3;3032:39;3065:5;3032:39;:::i;:::-;3087:71;3151:6;3146:3;3087:71;:::i;:::-;3080:78;;3167:52;3212:6;3207:3;3200:4;3193:5;3189:16;3167:52;:::i;:::-;3244:29;3266:6;3244:29;:::i;:::-;3239:3;3235:39;3228:46;;3008:272;2916:364;;;;:::o;3286:313::-;3399:4;3437:2;3426:9;3422:18;3414:26;;3486:9;3480:4;3476:20;3472:1;3461:9;3457:17;3450:47;3514:78;3587:4;3578:6;3514:78;:::i;:::-;3506:86;;3286:313;;;;:::o;3605:77::-;3642:7;3671:5;3660:16;;3605:77;;;:::o;3688:122::-;3761:24;3779:5;3761:24;:::i;:::-;3754:5;3751:35;3741:63;;3800:1;3797;3790:12;3741:63;3688:122;:::o;3816:139::-;3862:5;3900:6;3887:20;3878:29;;3916:33;3943:5;3916:33;:::i;:::-;3816:139;;;;:::o;3961:329::-;4020:6;4069:2;4057:9;4048:7;4044:23;4040:32;4037:119;;;4075:79;;:::i;:::-;4037:119;4195:1;4220:53;4265:7;4256:6;4245:9;4241:22;4220:53;:::i;:::-;4210:63;;4166:117;3961:329;;;;:::o;4296:126::-;4333:7;4373:42;4366:5;4362:54;4351:65;;4296:126;;;:::o;4428:96::-;4465:7;4494:24;4512:5;4494:24;:::i;:::-;4483:35;;4428:96;;;:::o;4530:118::-;4617:24;4635:5;4617:24;:::i;:::-;4612:3;4605:37;4530:118;;:::o;4654:222::-;4747:4;4785:2;4774:9;4770:18;4762:26;;4798:71;4866:1;4855:9;4851:17;4842:6;4798:71;:::i;:::-;4654:222;;;;:::o;4882:122::-;4955:24;4973:5;4955:24;:::i;:::-;4948:5;4945:35;4935:63;;4994:1;4991;4984:12;4935:63;4882:122;:::o;5010:139::-;5056:5;5094:6;5081:20;5072:29;;5110:33;5137:5;5110:33;:::i;:::-;5010:139;;;;:::o;5155:474::-;5223:6;5231;5280:2;5268:9;5259:7;5255:23;5251:32;5248:119;;;5286:79;;:::i;:::-;5248:119;5406:1;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5377:117;5533:2;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5504:118;5155:474;;;;;:::o;5635:117::-;5744:1;5741;5734:12;5758:117;5867:1;5864;5857:12;5881:180;5929:77;5926:1;5919:88;6026:4;6023:1;6016:15;6050:4;6047:1;6040:15;6067:281;6150:27;6172:4;6150:27;:::i;:::-;6142:6;6138:40;6280:6;6268:10;6265:22;6244:18;6232:10;6229:34;6226:62;6223:88;;;6291:18;;:::i;:::-;6223:88;6331:10;6327:2;6320:22;6110:238;6067:281;;:::o;6354:129::-;6388:6;6415:20;;:::i;:::-;6405:30;;6444:33;6472:4;6464:6;6444:33;:::i;:::-;6354:129;;;:::o;6489:308::-;6551:4;6641:18;6633:6;6630:30;6627:56;;;6663:18;;:::i;:::-;6627:56;6701:29;6723:6;6701:29;:::i;:::-;6693:37;;6785:4;6779;6775:15;6767:23;;6489:308;;;:::o;6803:154::-;6887:6;6882:3;6877;6864:30;6949:1;6940:6;6935:3;6931:16;6924:27;6803:154;;;:::o;6963:412::-;7041:5;7066:66;7082:49;7124:6;7082:49;:::i;:::-;7066:66;:::i;:::-;7057:75;;7155:6;7148:5;7141:21;7193:4;7186:5;7182:16;7231:3;7222:6;7217:3;7213:16;7210:25;7207:112;;;7238:79;;:::i;:::-;7207:112;7328:41;7362:6;7357:3;7352;7328:41;:::i;:::-;7047:328;6963:412;;;;;:::o;7395:340::-;7451:5;7500:3;7493:4;7485:6;7481:17;7477:27;7467:122;;7508:79;;:::i;:::-;7467:122;7625:6;7612:20;7650:79;7725:3;7717:6;7710:4;7702:6;7698:17;7650:79;:::i;:::-;7641:88;;7457:278;7395:340;;;;:::o;7741:509::-;7810:6;7859:2;7847:9;7838:7;7834:23;7830:32;7827:119;;;7865:79;;:::i;:::-;7827:119;8013:1;8002:9;7998:17;7985:31;8043:18;8035:6;8032:30;8029:117;;;8065:79;;:::i;:::-;8029:117;8170:63;8225:7;8216:6;8205:9;8201:22;8170:63;:::i;:::-;8160:73;;7956:287;7741:509;;;;:::o;8256:118::-;8343:24;8361:5;8343:24;:::i;:::-;8338:3;8331:37;8256:118;;:::o;8380:222::-;8473:4;8511:2;8500:9;8496:18;8488:26;;8524:71;8592:1;8581:9;8577:17;8568:6;8524:71;:::i;:::-;8380:222;;;;:::o;8608:619::-;8685:6;8693;8701;8750:2;8738:9;8729:7;8725:23;8721:32;8718:119;;;8756:79;;:::i;:::-;8718:119;8876:1;8901:53;8946:7;8937:6;8926:9;8922:22;8901:53;:::i;:::-;8891:63;;8847:117;9003:2;9029:53;9074:7;9065:6;9054:9;9050:22;9029:53;:::i;:::-;9019:63;;8974:118;9131:2;9157:53;9202:7;9193:6;9182:9;9178:22;9157:53;:::i;:::-;9147:63;;9102:118;8608:619;;;;;:::o;9233:86::-;9268:7;9308:4;9301:5;9297:16;9286:27;;9233:86;;;:::o;9325:118::-;9396:22;9412:5;9396:22;:::i;:::-;9389:5;9386:33;9376:61;;9433:1;9430;9423:12;9376:61;9325:118;:::o;9449:135::-;9493:5;9531:6;9518:20;9509:29;;9547:31;9572:5;9547:31;:::i;:::-;9449:135;;;;:::o;9590:325::-;9647:6;9696:2;9684:9;9675:7;9671:23;9667:32;9664:119;;;9702:79;;:::i;:::-;9664:119;9822:1;9847:51;9890:7;9881:6;9870:9;9866:22;9847:51;:::i;:::-;9837:61;;9793:115;9590:325;;;;:::o;9921:472::-;9988:6;9996;10045:2;10033:9;10024:7;10020:23;10016:32;10013:119;;;10051:79;;:::i;:::-;10013:119;10171:1;10196:52;10240:7;10231:6;10220:9;10216:22;10196:52;:::i;:::-;10186:62;;10142:116;10297:2;10323:53;10368:7;10359:6;10348:9;10344:22;10323:53;:::i;:::-;10313:63;;10268:118;9921:472;;;;;:::o;10399:329::-;10458:6;10507:2;10495:9;10486:7;10482:23;10478:32;10475:119;;;10513:79;;:::i;:::-;10475:119;10633:1;10658:53;10703:7;10694:6;10683:9;10679:22;10658:53;:::i;:::-;10648:63;;10604:117;10399:329;;;;:::o;10734:112::-;10817:22;10833:5;10817:22;:::i;:::-;10812:3;10805:35;10734:112;;:::o;10852:214::-;10941:4;10979:2;10968:9;10964:18;10956:26;;10992:67;11056:1;11045:9;11041:17;11032:6;10992:67;:::i;:::-;10852:214;;;;:::o;11072:117::-;11181:1;11178;11171:12;11195:117;11304:1;11301;11294:12;11335:568;11408:8;11418:6;11468:3;11461:4;11453:6;11449:17;11445:27;11435:122;;11476:79;;:::i;:::-;11435:122;11589:6;11576:20;11566:30;;11619:18;11611:6;11608:30;11605:117;;;11641:79;;:::i;:::-;11605:117;11755:4;11747:6;11743:17;11731:29;;11809:3;11801:4;11793:6;11789:17;11779:8;11775:32;11772:41;11769:128;;;11816:79;;:::i;:::-;11769:128;11335:568;;;;;:::o;11909:559::-;11995:6;12003;12052:2;12040:9;12031:7;12027:23;12023:32;12020:119;;;12058:79;;:::i;:::-;12020:119;12206:1;12195:9;12191:17;12178:31;12236:18;12228:6;12225:30;12222:117;;;12258:79;;:::i;:::-;12222:117;12371:80;12443:7;12434:6;12423:9;12419:22;12371:80;:::i;:::-;12353:98;;;;12149:312;11909:559;;;;;:::o;12474:116::-;12544:21;12559:5;12544:21;:::i;:::-;12537:5;12534:32;12524:60;;12580:1;12577;12570:12;12524:60;12474:116;:::o;12596:133::-;12639:5;12677:6;12664:20;12655:29;;12693:30;12717:5;12693:30;:::i;:::-;12596:133;;;;:::o;12735:468::-;12800:6;12808;12857:2;12845:9;12836:7;12832:23;12828:32;12825:119;;;12863:79;;:::i;:::-;12825:119;12983:1;13008:53;13053:7;13044:6;13033:9;13029:22;13008:53;:::i;:::-;12998:63;;12954:117;13110:2;13136:50;13178:7;13169:6;13158:9;13154:22;13136:50;:::i;:::-;13126:60;;13081:115;12735:468;;;;;:::o;13209:307::-;13270:4;13360:18;13352:6;13349:30;13346:56;;;13382:18;;:::i;:::-;13346:56;13420:29;13442:6;13420:29;:::i;:::-;13412:37;;13504:4;13498;13494:15;13486:23;;13209:307;;;:::o;13522:410::-;13599:5;13624:65;13640:48;13681:6;13640:48;:::i;:::-;13624:65;:::i;:::-;13615:74;;13712:6;13705:5;13698:21;13750:4;13743:5;13739:16;13788:3;13779:6;13774:3;13770:16;13767:25;13764:112;;;13795:79;;:::i;:::-;13764:112;13885:41;13919:6;13914:3;13909;13885:41;:::i;:::-;13605:327;13522:410;;;;;:::o;13951:338::-;14006:5;14055:3;14048:4;14040:6;14036:17;14032:27;14022:122;;14063:79;;:::i;:::-;14022:122;14180:6;14167:20;14205:78;14279:3;14271:6;14264:4;14256:6;14252:17;14205:78;:::i;:::-;14196:87;;14012:277;13951:338;;;;:::o;14295:943::-;14390:6;14398;14406;14414;14463:3;14451:9;14442:7;14438:23;14434:33;14431:120;;;14470:79;;:::i;:::-;14431:120;14590:1;14615:53;14660:7;14651:6;14640:9;14636:22;14615:53;:::i;:::-;14605:63;;14561:117;14717:2;14743:53;14788:7;14779:6;14768:9;14764:22;14743:53;:::i;:::-;14733:63;;14688:118;14845:2;14871:53;14916:7;14907:6;14896:9;14892:22;14871:53;:::i;:::-;14861:63;;14816:118;15001:2;14990:9;14986:18;14973:32;15032:18;15024:6;15021:30;15018:117;;;15054:79;;:::i;:::-;15018:117;15159:62;15213:7;15204:6;15193:9;15189:22;15159:62;:::i;:::-;15149:72;;14944:287;14295:943;;;;;;;:::o;15244:700::-;15337:6;15345;15353;15402:2;15390:9;15381:7;15377:23;15373:32;15370:119;;;15408:79;;:::i;:::-;15370:119;15528:1;15553:51;15596:7;15587:6;15576:9;15572:22;15553:51;:::i;:::-;15543:61;;15499:115;15681:2;15670:9;15666:18;15653:32;15712:18;15704:6;15701:30;15698:117;;;15734:79;;:::i;:::-;15698:117;15847:80;15919:7;15910:6;15899:9;15895:22;15847:80;:::i;:::-;15829:98;;;;15624:313;15244:700;;;;;:::o;15950:115::-;16035:23;16052:5;16035:23;:::i;:::-;16030:3;16023:36;15950:115;;:::o;16071:218::-;16162:4;16200:2;16189:9;16185:18;16177:26;;16213:69;16279:1;16268:9;16264:17;16255:6;16213:69;:::i;:::-;16071:218;;;;:::o;16295:474::-;16363:6;16371;16420:2;16408:9;16399:7;16395:23;16391:32;16388:119;;;16426:79;;:::i;:::-;16388:119;16546:1;16571:53;16616:7;16607:6;16596:9;16592:22;16571:53;:::i;:::-;16561:63;;16517:117;16673:2;16699:53;16744:7;16735:6;16724:9;16720:22;16699:53;:::i;:::-;16689:63;;16644:118;16295:474;;;;;:::o;16775:182::-;16915:34;16911:1;16903:6;16899:14;16892:58;16775:182;:::o;16963:366::-;17105:3;17126:67;17190:2;17185:3;17126:67;:::i;:::-;17119:74;;17202:93;17291:3;17202:93;:::i;:::-;17320:2;17315:3;17311:12;17304:19;;16963:366;;;:::o;17335:419::-;17501:4;17539:2;17528:9;17524:18;17516:26;;17588:9;17582:4;17578:20;17574:1;17563:9;17559:17;17552:47;17616:131;17742:4;17616:131;:::i;:::-;17608:139;;17335:419;;;:::o;17760:180::-;17808:77;17805:1;17798:88;17905:4;17902:1;17895:15;17929:4;17926:1;17919:15;17946:320;17990:6;18027:1;18021:4;18017:12;18007:22;;18074:1;18068:4;18064:12;18095:18;18085:81;;18151:4;18143:6;18139:17;18129:27;;18085:81;18213:2;18205:6;18202:14;18182:18;18179:38;18176:84;;18232:18;;:::i;:::-;18176:84;17997:269;17946:320;;;:::o;18272:332::-;18393:4;18431:2;18420:9;18416:18;18408:26;;18444:71;18512:1;18501:9;18497:17;18488:6;18444:71;:::i;:::-;18525:72;18593:2;18582:9;18578:18;18569:6;18525:72;:::i;:::-;18272:332;;;;;:::o;18610:137::-;18664:5;18695:6;18689:13;18680:22;;18711:30;18735:5;18711:30;:::i;:::-;18610:137;;;;:::o;18753:345::-;18820:6;18869:2;18857:9;18848:7;18844:23;18840:32;18837:119;;;18875:79;;:::i;:::-;18837:119;18995:1;19020:61;19073:7;19064:6;19053:9;19049:22;19020:61;:::i;:::-;19010:71;;18966:125;18753:345;;;;:::o;19104:180::-;19152:77;19149:1;19142:88;19249:4;19246:1;19239:15;19273:4;19270:1;19263:15;19290:242;19329:3;19348:19;19365:1;19348:19;:::i;:::-;19343:24;;19381:19;19398:1;19381:19;:::i;:::-;19376:24;;19474:1;19466:6;19462:14;19459:1;19456:21;19453:47;;;19480:18;;:::i;:::-;19453:47;19524:1;19521;19517:9;19510:16;;19290:242;;;;:::o;19538:169::-;19678:21;19674:1;19666:6;19662:14;19655:45;19538:169;:::o;19713:366::-;19855:3;19876:67;19940:2;19935:3;19876:67;:::i;:::-;19869:74;;19952:93;20041:3;19952:93;:::i;:::-;20070:2;20065:3;20061:12;20054:19;;19713:366;;;:::o;20085:419::-;20251:4;20289:2;20278:9;20274:18;20266:26;;20338:9;20332:4;20328:20;20324:1;20313:9;20309:17;20302:47;20366:131;20492:4;20366:131;:::i;:::-;20358:139;;20085:419;;;:::o;20510:173::-;20650:25;20646:1;20638:6;20634:14;20627:49;20510:173;:::o;20689:366::-;20831:3;20852:67;20916:2;20911:3;20852:67;:::i;:::-;20845:74;;20928:93;21017:3;20928:93;:::i;:::-;21046:2;21041:3;21037:12;21030:19;;20689:366;;;:::o;21061:419::-;21227:4;21265:2;21254:9;21250:18;21242:26;;21314:9;21308:4;21304:20;21300:1;21289:9;21285:17;21278:47;21342:131;21468:4;21342:131;:::i;:::-;21334:139;;21061:419;;;:::o;21486:237::-;21524:3;21543:18;21559:1;21543:18;:::i;:::-;21538:23;;21575:18;21591:1;21575:18;:::i;:::-;21570:23;;21665:1;21659:4;21655:12;21652:1;21649:19;21646:45;;;21671:18;;:::i;:::-;21646:45;21715:1;21712;21708:9;21701:16;;21486:237;;;;:::o;21729:181::-;21869:33;21865:1;21857:6;21853:14;21846:57;21729:181;:::o;21916:366::-;22058:3;22079:67;22143:2;22138:3;22079:67;:::i;:::-;22072:74;;22155:93;22244:3;22155:93;:::i;:::-;22273:2;22268:3;22264:12;22257:19;;21916:366;;;:::o;22288:419::-;22454:4;22492:2;22481:9;22477:18;22469:26;;22541:9;22535:4;22531:20;22527:1;22516:9;22512:17;22505:47;22569:131;22695:4;22569:131;:::i;:::-;22561:139;;22288:419;;;:::o;22713:176::-;22853:28;22849:1;22841:6;22837:14;22830:52;22713:176;:::o;22895:366::-;23037:3;23058:67;23122:2;23117:3;23058:67;:::i;:::-;23051:74;;23134:93;23223:3;23134:93;:::i;:::-;23252:2;23247:3;23243:12;23236:19;;22895:366;;;:::o;23267:419::-;23433:4;23471:2;23460:9;23456:18;23448:26;;23520:9;23514:4;23510:20;23506:1;23495:9;23491:17;23484:47;23548:131;23674:4;23548:131;:::i;:::-;23540:139;;23267:419;;;:::o;23692:176::-;23832:28;23828:1;23820:6;23816:14;23809:52;23692:176;:::o;23874:366::-;24016:3;24037:67;24101:2;24096:3;24037:67;:::i;:::-;24030:74;;24113:93;24202:3;24113:93;:::i;:::-;24231:2;24226:3;24222:12;24215:19;;23874:366;;;:::o;24246:419::-;24412:4;24450:2;24439:9;24435:18;24427:26;;24499:9;24493:4;24489:20;24485:1;24474:9;24470:17;24463:47;24527:131;24653:4;24527:131;:::i;:::-;24519:139;;24246:419;;;:::o;24671:348::-;24711:7;24734:20;24752:1;24734:20;:::i;:::-;24729:25;;24768:20;24786:1;24768:20;:::i;:::-;24763:25;;24956:1;24888:66;24884:74;24881:1;24878:81;24873:1;24866:9;24859:17;24855:105;24852:131;;;24963:18;;:::i;:::-;24852:131;25011:1;25008;25004:9;24993:20;;24671:348;;;;:::o;25025:169::-;25165:21;25161:1;25153:6;25149:14;25142:45;25025:169;:::o;25200:366::-;25342:3;25363:67;25427:2;25422:3;25363:67;:::i;:::-;25356:74;;25439:93;25528:3;25439:93;:::i;:::-;25557:2;25552:3;25548:12;25541:19;;25200:366;;;:::o;25572:419::-;25738:4;25776:2;25765:9;25761:18;25753:26;;25825:9;25819:4;25815:20;25811:1;25800:9;25796:17;25789:47;25853:131;25979:4;25853:131;:::i;:::-;25845:139;;25572:419;;;:::o;25997:185::-;26035:4;26055:18;26071:1;26055:18;:::i;:::-;26050:23;;26087:18;26103:1;26087:18;:::i;:::-;26082:23;;26124:1;26121;26118:8;26115:34;;;26129:18;;:::i;:::-;26115:34;26174:1;26171;26167:9;26159:17;;25997:185;;;;:::o;26188:180::-;26236:77;26233:1;26226:88;26333:4;26330:1;26323:15;26357:4;26354:1;26347:15;26374:167;26411:3;26434:22;26450:5;26434:22;:::i;:::-;26425:31;;26478:4;26471:5;26468:15;26465:41;;26486:18;;:::i;:::-;26465:41;26533:1;26526:5;26522:13;26515:20;;26374:167;;;:::o;26547:173::-;26687:25;26683:1;26675:6;26671:14;26664:49;26547:173;:::o;26726:366::-;26868:3;26889:67;26953:2;26948:3;26889:67;:::i;:::-;26882:74;;26965:93;27054:3;26965:93;:::i;:::-;27083:2;27078:3;27074:12;27067:19;;26726:366;;;:::o;27098:419::-;27264:4;27302:2;27291:9;27287:18;27279:26;;27351:9;27345:4;27341:20;27337:1;27326:9;27322:17;27315:47;27379:131;27505:4;27379:131;:::i;:::-;27371:139;;27098:419;;;:::o;27523:173::-;27663:25;27659:1;27651:6;27647:14;27640:49;27523:173;:::o;27702:366::-;27844:3;27865:67;27929:2;27924:3;27865:67;:::i;:::-;27858:74;;27941:93;28030:3;27941:93;:::i;:::-;28059:2;28054:3;28050:12;28043:19;;27702:366;;;:::o;28074:419::-;28240:4;28278:2;28267:9;28263:18;28255:26;;28327:9;28321:4;28317:20;28313:1;28302:9;28298:17;28291:47;28355:131;28481:4;28355:131;:::i;:::-;28347:139;;28074:419;;;:::o;28499:234::-;28639:34;28635:1;28627:6;28623:14;28616:58;28708:17;28703:2;28695:6;28691:15;28684:42;28499:234;:::o;28739:366::-;28881:3;28902:67;28966:2;28961:3;28902:67;:::i;:::-;28895:74;;28978:93;29067:3;28978:93;:::i;:::-;29096:2;29091:3;29087:12;29080:19;;28739:366;;;:::o;29111:419::-;29277:4;29315:2;29304:9;29300:18;29292:26;;29364:9;29358:4;29354:20;29350:1;29339:9;29335:17;29328:47;29392:131;29518:4;29392:131;:::i;:::-;29384:139;;29111:419;;;:::o;29536:148::-;29638:11;29675:3;29660:18;;29536:148;;;;:::o;29690:377::-;29796:3;29824:39;29857:5;29824:39;:::i;:::-;29879:89;29961:6;29956:3;29879:89;:::i;:::-;29872:96;;29977:52;30022:6;30017:3;30010:4;30003:5;29999:16;29977:52;:::i;:::-;30054:6;30049:3;30045:16;30038:23;;29800:267;29690:377;;;;:::o;30073:141::-;30122:4;30145:3;30137:11;;30168:3;30165:1;30158:14;30202:4;30199:1;30189:18;30181:26;;30073:141;;;:::o;30244:845::-;30347:3;30384:5;30378:12;30413:36;30439:9;30413:36;:::i;:::-;30465:89;30547:6;30542:3;30465:89;:::i;:::-;30458:96;;30585:1;30574:9;30570:17;30601:1;30596:137;;;;30747:1;30742:341;;;;30563:520;;30596:137;30680:4;30676:9;30665;30661:25;30656:3;30649:38;30716:6;30711:3;30707:16;30700:23;;30596:137;;30742:341;30809:38;30841:5;30809:38;:::i;:::-;30869:1;30883:154;30897:6;30894:1;30891:13;30883:154;;;30971:7;30965:14;30961:1;30956:3;30952:11;30945:35;31021:1;31012:7;31008:15;30997:26;;30919:4;30916:1;30912:12;30907:17;;30883:154;;;31066:6;31061:3;31057:16;31050:23;;30749:334;;30563:520;;30351:738;;30244:845;;;;:::o;31095:589::-;31320:3;31342:95;31433:3;31424:6;31342:95;:::i;:::-;31335:102;;31454:95;31545:3;31536:6;31454:95;:::i;:::-;31447:102;;31566:92;31654:3;31645:6;31566:92;:::i;:::-;31559:99;;31675:3;31668:10;;31095:589;;;;;;:::o;31690:305::-;31730:3;31749:20;31767:1;31749:20;:::i;:::-;31744:25;;31783:20;31801:1;31783:20;:::i;:::-;31778:25;;31937:1;31869:66;31865:74;31862:1;31859:81;31856:107;;;31943:18;;:::i;:::-;31856:107;31987:1;31984;31980:9;31973:16;;31690:305;;;;:::o;32001:169::-;32141:21;32137:1;32129:6;32125:14;32118:45;32001:169;:::o;32176:366::-;32318:3;32339:67;32403:2;32398:3;32339:67;:::i;:::-;32332:74;;32415:93;32504:3;32415:93;:::i;:::-;32533:2;32528:3;32524:12;32517:19;;32176:366;;;:::o;32548:419::-;32714:4;32752:2;32741:9;32737:18;32729:26;;32801:9;32795:4;32791:20;32787:1;32776:9;32772:17;32765:47;32829:131;32955:4;32829:131;:::i;:::-;32821:139;;32548:419;;;:::o;32973:233::-;33012:3;33035:24;33053:5;33035:24;:::i;:::-;33026:33;;33081:66;33074:5;33071:77;33068:103;;33151:18;;:::i;:::-;33068:103;33198:1;33191:5;33187:13;33180:20;;32973:233;;;:::o;33212:225::-;33352:34;33348:1;33340:6;33336:14;33329:58;33421:8;33416:2;33408:6;33404:15;33397:33;33212:225;:::o;33443:366::-;33585:3;33606:67;33670:2;33665:3;33606:67;:::i;:::-;33599:74;;33682:93;33771:3;33682:93;:::i;:::-;33800:2;33795:3;33791:12;33784:19;;33443:366;;;:::o;33815:419::-;33981:4;34019:2;34008:9;34004:18;33996:26;;34068:9;34062:4;34058:20;34054:1;34043:9;34039:17;34032:47;34096:131;34222:4;34096:131;:::i;:::-;34088:139;;33815:419;;;:::o;34240:180::-;34288:77;34285:1;34278:88;34385:4;34382:1;34375:15;34409:4;34406:1;34399:15;34426:185;34466:1;34483:20;34501:1;34483:20;:::i;:::-;34478:25;;34517:20;34535:1;34517:20;:::i;:::-;34512:25;;34556:1;34546:35;;34561:18;;:::i;:::-;34546:35;34603:1;34600;34596:9;34591:14;;34426:185;;;;:::o;34617:191::-;34657:4;34677:20;34695:1;34677:20;:::i;:::-;34672:25;;34711:20;34729:1;34711:20;:::i;:::-;34706:25;;34750:1;34747;34744:8;34741:34;;;34755:18;;:::i;:::-;34741:34;34800:1;34797;34793:9;34785:17;;34617:191;;;;:::o;34814:176::-;34846:1;34863:20;34881:1;34863:20;:::i;:::-;34858:25;;34897:20;34915:1;34897:20;:::i;:::-;34892:25;;34936:1;34926:35;;34941:18;;:::i;:::-;34926:35;34982:1;34979;34975:9;34970:14;;34814:176;;;;:::o;34996:98::-;35047:6;35081:5;35075:12;35065:22;;34996:98;;;:::o;35100:168::-;35183:11;35217:6;35212:3;35205:19;35257:4;35252:3;35248:14;35233:29;;35100:168;;;;:::o;35274:360::-;35360:3;35388:38;35420:5;35388:38;:::i;:::-;35442:70;35505:6;35500:3;35442:70;:::i;:::-;35435:77;;35521:52;35566:6;35561:3;35554:4;35547:5;35543:16;35521:52;:::i;:::-;35598:29;35620:6;35598:29;:::i;:::-;35593:3;35589:39;35582:46;;35364:270;35274:360;;;;:::o;35640:640::-;35835:4;35873:3;35862:9;35858:19;35850:27;;35887:71;35955:1;35944:9;35940:17;35931:6;35887:71;:::i;:::-;35968:72;36036:2;36025:9;36021:18;36012:6;35968:72;:::i;:::-;36050;36118:2;36107:9;36103:18;36094:6;36050:72;:::i;:::-;36169:9;36163:4;36159:20;36154:2;36143:9;36139:18;36132:48;36197:76;36268:4;36259:6;36197:76;:::i;:::-;36189:84;;35640:640;;;;;;;:::o;36286:141::-;36342:5;36373:6;36367:13;36358:22;;36389:32;36415:5;36389:32;:::i;:::-;36286:141;;;;:::o;36433:349::-;36502:6;36551:2;36539:9;36530:7;36526:23;36522:32;36519:119;;;36557:79;;:::i;:::-;36519:119;36677:1;36702:63;36757:7;36748:6;36737:9;36733:22;36702:63;:::i;:::-;36692:73;;36648:127;36433:349;;;;:::o

Swarm Source

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