MATIC Price: $0.590975 (+3.27%)
Gas: 36 GWei
 

Overview

Max Total Supply

0 CCB

Holders

442

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x21ddaefd5fd975acf25eec0fabdab03098187335
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
Chibi_Character

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 polygonscan.com on 2023-01-05
*/

// SPDX-License-Identifier: MIT

// File: contracts/IOperatorFilterRegistry.sol


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 unregister(address addr) 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);
}

// File: contracts/OperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        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(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).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 (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

// File: contracts/DefaultOperatorFilterer.sol


pragma solidity ^0.8.13;


/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

// File: contracts/Halloween_banner.sol



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


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// 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/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.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
                /// @solidity memory-safe-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// 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/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

// File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: contracts/new_year.sol



//////////////////////////////////////////////////////////////////////
//                                                                  //
//   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•—β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•—β–‘β–‘β–‘β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–ˆβ–ˆβ•—β–‘β–‘β–ˆβ–ˆβ•—β–ˆβ–ˆβ•—β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘   //
//   β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β•β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—   //
//   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•¦β•β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β•šβ•β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•   //
//   β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•—β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β–‘β–‘β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•—β–ˆβ–ˆβ•”β•β•β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•”β•β•β•β•β–‘   //
//   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•¦β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•—β•šβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ•”β•β–ˆβ–ˆβ•‘β–‘β–‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–ˆβ–ˆβ•‘β–‘β–‘β–‘β–‘β–‘   //
//   β•šβ•β•β•β•β•β•β–‘β•šβ•β•β•β•β•β•β•β–‘β•šβ•β•β•β•β•β•β–‘β•šβ•β•β•β•β•β•β•β–‘β•šβ•β•β•β•β•β–‘β•šβ•β•β–‘β–‘β•šβ•β•β•šβ•β•β•šβ•β•β–‘β–‘β–‘β–‘β–‘   //
//                                                                  //
//       Bluechip Chibi Character NFT contract by Charactor DAO     //
//                                                                  //
//////////////////////////////////////////////////////////////////////

pragma solidity ^0.8.7;


contract Chibi_Character is ERC1155, Ownable, ERC2981, DefaultOperatorFilterer {
    string public name;
    string public symbol;
    // Creator fee 500=5%, 1000=10%
    uint96 public feeNumerator = 1000;
    string[] public BaseURI = ["ipfs://QmSjG3Jp5ahCFFgZpTw6CWjMZUpadtyqzRXzaiD3HywFVf/"];
    bool public saleEnabled = false;
    using Strings for uint256;
    mapping(address => mapping(uint256 => uint256)) public psMinted;

    constructor()
     ERC1155("") {
        name = "chibi character Banner";
        symbol = "CCB";

        _setDefaultRoyalty(0xa5eA07a623A502a98c1e34BF981e0971F768c830, feeNumerator);
    }

    //opensea
    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    }

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

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    // mint by owner or operator
    function ownerMint(address to, uint256 id, uint256 amount) external {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(msg.sender == owner() || isApprovedForAll(owner(), _msgSender()), "caller is not owner nor operator");
        _mint(to, id, amount,"");
    }

    // burn by owner or operator
    function burn(address from, uint256 id, uint256 amount) external {
        require(msg.sender == owner() || isApprovedForAll(owner(), _msgSender()), "caller is not owner nor operator");
        _burn(from, id, amount);
    }

    // swtich MetadataURI
    // timestamp 1665522000 = 2022/10/12 6:00:00
    function _metadataURI(uint256 _id) internal view returns (string memory) {
            return BaseURI[_id];
 
    }

    // refer the latest uri for token id
    function uri(uint256 id) public view override returns (string memory) {
        return string(abi.encodePacked(_metadataURI(id)));
    }

    // set newOwner by only owner
    function transferOwnership(address newOwner) public virtual override onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    // avoid renounce owner to 0x000... by only owner
    function renounceOwnership() public override onlyOwner {
        _transferOwnership(address(msg.sender));
    }

    function setSale(bool bool_) external onlyOwner {
        saleEnabled = bool_;
    }

    // set BaseURI by array
    function setBaseURI(string[] memory _uris) external onlyOwner {
        delete BaseURI;
        BaseURI = _uris;
    }

    //override
    function supportsInterface(bytes4 interfaceId)
        public view virtual override(ERC1155, ERC2981)
        returns (bool) {
            return super.supportsInterface(interfaceId);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"BaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeNumerator","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"psMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string[]","name":"_uris","type":"string[]"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"bool_","type":"bool"}],"name":"setSale","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526103e8600860006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550604051806020016040528060405180606001604052806036815260200162004c6a6036913981525060099060016200007192919062000664565b506000600a60006101000a81548160ff0219169083151502179055503480156200009a57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb6600160405180602001604052806000815250620000d381620003cd60201b60201c565b50620000f4620000e8620003e960201b60201c565b620003f160201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620002e9578015620001af576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001759291906200082e565b600060405180830381600087803b1580156200019057600080fd5b505af1158015620001a5573d6000803e3d6000fd5b50505050620002e8565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000269576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200022f9291906200082e565b600060405180830381600087803b1580156200024a57600080fd5b505af11580156200025f573d6000803e3d6000fd5b50505050620002e7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002b291906200085b565b600060405180830381600087803b158015620002cd57600080fd5b505af1158015620002e2573d6000803e3d6000fd5b505050505b5b5b50506040518060400160405280601681526020017f6368696269206368617261637465722042616e6e6572000000000000000000008152506006908051906020019062000338929190620006cb565b506040518060400160405280600381526020017f43434200000000000000000000000000000000000000000000000000000000008152506007908051906020019062000386929190620006cb565b50620003c773a5ea07a623a502a98c1e34bf981e0971f768c830600860009054906101000a90046bffffffffffffffffffffffff16620004b760201b60201c565b620009f7565b8060029080519060200190620003e5929190620006cb565b5050565b600033905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620004c76200065a60201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000528576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200051f90620008ff565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200059a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005919062000971565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600460008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b828054828255906000526020600020908101928215620006b8579160200282015b82811115620006b7578251829080519060200190620006a6929190620006cb565b509160200191906001019062000685565b5b509050620006c791906200075c565b5090565b828054620006d990620009c2565b90600052602060002090601f016020900481019282620006fd576000855562000749565b82601f106200071857805160ff191683800117855562000749565b8280016001018555821562000749579182015b82811115620007485782518255916020019190600101906200072b565b5b50905062000758919062000784565b5090565b5b80821115620007805760008181620007769190620007a3565b506001016200075d565b5090565b5b808211156200079f57600081600090555060010162000785565b5090565b508054620007b190620009c2565b6000825580601f10620007c55750620007e6565b601f016020900490600052602060002090810190620007e5919062000784565b5b50565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200081682620007e9565b9050919050565b620008288162000809565b82525050565b60006040820190506200084560008301856200081d565b6200085460208301846200081d565b9392505050565b60006020820190506200087260008301846200081d565b92915050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b6000620008e7602a8362000878565b9150620008f48262000889565b604082019050919050565b600060208201905081810360008301526200091a81620008d8565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b60006200095960198362000878565b9150620009668262000921565b602082019050919050565b600060208201905081810360008301526200098c816200094a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620009db57607f821691505b602082108103620009f157620009f062000993565b5b50919050565b6142638062000a076000396000f3fe608060405234801561001057600080fd5b506004361061014c5760003560e01c806341f43434116100c3578063a22cb4651161007c578063a22cb465146103b2578063e86dea4a146103ce578063e985e9c5146103ec578063f242432a1461041c578063f2fde38b14610438578063f5298aca146104545761014c565b806341f43434146103005780634e1273f41461031e578063715018a61461034e57806371b9b646146103585780638da5cb5b1461037657806395d89b41146103945761014c565b806310637d8a1161011557806310637d8a1461021b5780631d2e5a3a1461024b5780632a55205a146102675780632eb2c2d614610298578063388b9fe0146102b45780633ef0ddb9146102d05761014c565b8062fdd58e1461015157806301ffc9a71461018157806305959216146101b157806306fdde03146101cd5780630e89341c146101eb575b600080fd5b61016b600480360381019061016691906128a1565b610470565b60405161017891906128f0565b60405180910390f35b61019b60048036038101906101969190612963565b610538565b6040516101a891906129ab565b60405180910390f35b6101cb60048036038101906101c69190612bf2565b61054a565b005b6101d561057a565b6040516101e29190612cc3565b60405180910390f35b61020560048036038101906102009190612ce5565b610608565b6040516102129190612cc3565b60405180910390f35b610235600480360381019061023091906128a1565b610639565b60405161024291906128f0565b60405180910390f35b61026560048036038101906102609190612d3e565b61065e565b005b610281600480360381019061027c9190612d6b565b610683565b60405161028f929190612dba565b60405180910390f35b6102b260048036038101906102ad9190612f47565b61086d565b005b6102ce60048036038101906102c99190613016565b6109c3565b005b6102ea60048036038101906102e59190612ce5565b610ae6565b6040516102f79190612cc3565b60405180910390f35b610308610b92565b60405161031591906130c8565b60405180910390f35b610338600480360381019061033391906131a6565b610ba4565b60405161034591906132dc565b60405180910390f35b610356610cbd565b005b610360610cd0565b60405161036d91906129ab565b60405180910390f35b61037e610ce3565b60405161038b91906132fe565b60405180910390f35b61039c610d0d565b6040516103a99190612cc3565b60405180910390f35b6103cc60048036038101906103c79190613319565b610d9b565b005b6103d6610ea5565b6040516103e39190613380565b60405180910390f35b6104066004803603810190610401919061339b565b610ec3565b60405161041391906129ab565b60405180910390f35b610436600480360381019061043191906133db565b610f57565b005b610452600480360381019061044d9190613472565b6110ad565b005b61046e60048036038101906104699190613016565b611130565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036104e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d790613511565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610543826111d4565b9050919050565b61055261124e565b600960006105609190612671565b8060099080519060200190610576929190612692565b5050565b6006805461058790613560565b80601f01602080910402602001604051908101604052809291908181526020018280546105b390613560565b80156106005780601f106105d557610100808354040283529160200191610600565b820191906000526020600020905b8154815290600101906020018083116105e357829003601f168201915b505050505081565b6060610613826112cc565b60405160200161062391906135cd565b6040516020818303038152906040529050919050565b600b602052816000526040600020602052806000526040600020600091509150505481565b61066661124e565b80600a60006101000a81548160ff02191690831515021790555050565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036108185760046040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061082261137c565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661084e9190613613565b610858919061369c565b90508160000151819350935050509250929050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156109ad573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108e1576108dc8686868686611386565b6109bb565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161092a9291906136cd565b602060405180830381865afa158015610947573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096b919061370b565b6109ac57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016109a391906132fe565b60405180910390fd5b5b6109ba8686868686611386565b5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a29906137aa565b60405180910390fd5b610a3a610ce3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a875750610a86610a79610ce3565b610a81611427565b610ec3565b5b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90613816565b60405180910390fd5b610ae18383836040518060200160405280600081525061142f565b505050565b60098181548110610af657600080fd5b906000526020600020016000915090508054610b1190613560565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3d90613560565b8015610b8a5780601f10610b5f57610100808354040283529160200191610b8a565b820191906000526020600020905b815481529060010190602001808311610b6d57829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906138a8565b60405180910390fd5b6000835167ffffffffffffffff811115610c0757610c066129dc565b5b604051908082528060200260200182016040528015610c355781602001602082028036833780820191505090505b50905060005b8451811015610cb257610c82858281518110610c5a57610c596138c8565b5b6020026020010151858381518110610c7557610c746138c8565b5b6020026020010151610470565b828281518110610c9557610c946138c8565b5b60200260200101818152505080610cab906138f7565b9050610c3b565b508091505092915050565b610cc561124e565b610cce336115df565b565b600a60009054906101000a900460ff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60078054610d1a90613560565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4690613560565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b505050505081565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e96576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e139291906136cd565b602060405180830381865afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e54919061370b565b610e9557806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e8c91906132fe565b60405180910390fd5b5b610ea083836116a5565b505050565b600860009054906101000a90046bffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611097573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fcb57610fc686868686866116bb565b6110a5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110149291906136cd565b602060405180830381865afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611055919061370b565b61109657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161108d91906132fe565b60405180910390fd5b5b6110a486868686866116bb565b5b505050505050565b6110b561124e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b906139b1565b60405180910390fd5b61112d816115df565b50565b611138610ce3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111855750611184611177610ce3565b61117f611427565b610ec3565b5b6111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb90613816565b60405180910390fd5b6111cf83838361175c565b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112475750611246826119a2565b5b9050919050565b611256611427565b73ffffffffffffffffffffffffffffffffffffffff16611274610ce3565b73ffffffffffffffffffffffffffffffffffffffff16146112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190613a1d565b60405180910390fd5b565b6060600982815481106112e2576112e16138c8565b5b9060005260206000200180546112f790613560565b80601f016020809104026020016040519081016040528092919081815260200182805461132390613560565b80156113705780601f1061134557610100808354040283529160200191611370565b820191906000526020600020905b81548152906001019060200180831161135357829003601f168201915b50505050509050919050565b6000612710905090565b61138e611427565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113d457506113d3856113ce611427565b610ec3565b5b611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90613aaf565b60405180910390fd5b6114208585858585611a84565b5050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361149e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611495906137aa565b60405180910390fd5b60006114a8611427565b905060006114b585611da5565b905060006114c285611da5565b90506114d383600089858589611e1f565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115329190613acf565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516115b0929190613b25565b60405180910390a46115c783600089858589611e27565b6115d683600089898989611e2f565b50505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116b76116b0611427565b8383612006565b5050565b6116c3611427565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611709575061170885611703611427565b610ec3565b5b611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90613aaf565b60405180910390fd5b6117558585858585612172565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613bc0565b60405180910390fd5b60006117d5611427565b905060006117e284611da5565b905060006117ef84611da5565b905061180f83876000858560405180602001604052806000815250611e1f565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613c52565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611973929190613b25565b60405180910390a461199984886000868660405180602001604052806000815250611e27565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a6d57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a7d5750611a7c8261240d565b5b9050919050565b8151835114611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90613ce4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90613d76565b60405180910390fd5b6000611b41611427565b9050611b51818787878787611e1f565b60005b8451811015611d02576000858281518110611b7257611b716138c8565b5b602002602001015190506000858381518110611b9157611b906138c8565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990613e08565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ce79190613acf565b9250508190555050505080611cfb906138f7565b9050611b54565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d79929190613e28565b60405180910390a4611d8f818787878787611e27565b611d9d818787878787612477565b505050505050565b60606000600167ffffffffffffffff811115611dc457611dc36129dc565b5b604051908082528060200260200182016040528015611df25781602001602082028036833780820191505090505b5090508281600081518110611e0a57611e096138c8565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b611e4e8473ffffffffffffffffffffffffffffffffffffffff1661264e565b15611ffe578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611e94959493929190613eb4565b6020604051808303816000875af1925050508015611ed057506040513d601f19601f82011682018060405250810190611ecd9190613f23565b60015b611f7557611edc613f5d565b806308c379a003611f385750611ef0613f7f565b80611efb5750611f3a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2f9190612cc3565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6c90614081565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff390614113565b60405180910390fd5b505b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b906141a5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161216591906129ab565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d890613d76565b60405180910390fd5b60006121eb611427565b905060006121f885611da5565b9050600061220585611da5565b9050612215838989858589611e1f565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a390613e08565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123619190613acf565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516123de929190613b25565b60405180910390a46123f4848a8a86868a611e27565b612402848a8a8a8a8a611e2f565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124968473ffffffffffffffffffffffffffffffffffffffff1661264e565b15612646578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016124dc9594939291906141c5565b6020604051808303816000875af192505050801561251857506040513d601f19601f820116820180604052508101906125159190613f23565b60015b6125bd57612524613f5d565b806308c379a0036125805750612538613f7f565b806125435750612582565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125779190612cc3565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b490614081565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614113565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b508054600082559060005260206000209081019061268f91906126f2565b50565b8280548282559060005260206000209081019282156126e1579160200282015b828111156126e05782518290805190602001906126d0929190612716565b50916020019190600101906126b2565b5b5090506126ee91906126f2565b5090565b5b808211156127125760008181612709919061279c565b506001016126f3565b5090565b82805461272290613560565b90600052602060002090601f016020900481019282612744576000855561278b565b82601f1061275d57805160ff191683800117855561278b565b8280016001018555821561278b579182015b8281111561278a57825182559160200191906001019061276f565b5b50905061279891906127dc565b5090565b5080546127a890613560565b6000825580601f106127ba57506127d9565b601f0160209004906000526020600020908101906127d891906127dc565b5b50565b5b808211156127f55760008160009055506001016127dd565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128388261280d565b9050919050565b6128488161282d565b811461285357600080fd5b50565b6000813590506128658161283f565b92915050565b6000819050919050565b61287e8161286b565b811461288957600080fd5b50565b60008135905061289b81612875565b92915050565b600080604083850312156128b8576128b7612803565b5b60006128c685828601612856565b92505060206128d78582860161288c565b9150509250929050565b6128ea8161286b565b82525050565b600060208201905061290560008301846128e1565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129408161290b565b811461294b57600080fd5b50565b60008135905061295d81612937565b92915050565b60006020828403121561297957612978612803565b5b60006129878482850161294e565b91505092915050565b60008115159050919050565b6129a581612990565b82525050565b60006020820190506129c0600083018461299c565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a14826129cb565b810181811067ffffffffffffffff82111715612a3357612a326129dc565b5b80604052505050565b6000612a466127f9565b9050612a528282612a0b565b919050565b600067ffffffffffffffff821115612a7257612a716129dc565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff821115612aa857612aa76129dc565b5b612ab1826129cb565b9050602081019050919050565b82818337600083830152505050565b6000612ae0612adb84612a8d565b612a3c565b905082815260208101848484011115612afc57612afb612a88565b5b612b07848285612abe565b509392505050565b600082601f830112612b2457612b236129c6565b5b8135612b34848260208601612acd565b91505092915050565b6000612b50612b4b84612a57565b612a3c565b90508083825260208201905060208402830185811115612b7357612b72612a83565b5b835b81811015612bba57803567ffffffffffffffff811115612b9857612b976129c6565b5b808601612ba58982612b0f565b85526020850194505050602081019050612b75565b5050509392505050565b600082601f830112612bd957612bd86129c6565b5b8135612be9848260208601612b3d565b91505092915050565b600060208284031215612c0857612c07612803565b5b600082013567ffffffffffffffff811115612c2657612c25612808565b5b612c3284828501612bc4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c75578082015181840152602081019050612c5a565b83811115612c84576000848401525b50505050565b6000612c9582612c3b565b612c9f8185612c46565b9350612caf818560208601612c57565b612cb8816129cb565b840191505092915050565b60006020820190508181036000830152612cdd8184612c8a565b905092915050565b600060208284031215612cfb57612cfa612803565b5b6000612d098482850161288c565b91505092915050565b612d1b81612990565b8114612d2657600080fd5b50565b600081359050612d3881612d12565b92915050565b600060208284031215612d5457612d53612803565b5b6000612d6284828501612d29565b91505092915050565b60008060408385031215612d8257612d81612803565b5b6000612d908582860161288c565b9250506020612da18582860161288c565b9150509250929050565b612db48161282d565b82525050565b6000604082019050612dcf6000830185612dab565b612ddc60208301846128e1565b9392505050565b600067ffffffffffffffff821115612dfe57612dfd6129dc565b5b602082029050602081019050919050565b6000612e22612e1d84612de3565b612a3c565b90508083825260208201905060208402830185811115612e4557612e44612a83565b5b835b81811015612e6e5780612e5a888261288c565b845260208401935050602081019050612e47565b5050509392505050565b600082601f830112612e8d57612e8c6129c6565b5b8135612e9d848260208601612e0f565b91505092915050565b600067ffffffffffffffff821115612ec157612ec06129dc565b5b612eca826129cb565b9050602081019050919050565b6000612eea612ee584612ea6565b612a3c565b905082815260208101848484011115612f0657612f05612a88565b5b612f11848285612abe565b509392505050565b600082601f830112612f2e57612f2d6129c6565b5b8135612f3e848260208601612ed7565b91505092915050565b600080600080600060a08688031215612f6357612f62612803565b5b6000612f7188828901612856565b9550506020612f8288828901612856565b945050604086013567ffffffffffffffff811115612fa357612fa2612808565b5b612faf88828901612e78565b935050606086013567ffffffffffffffff811115612fd057612fcf612808565b5b612fdc88828901612e78565b925050608086013567ffffffffffffffff811115612ffd57612ffc612808565b5b61300988828901612f19565b9150509295509295909350565b60008060006060848603121561302f5761302e612803565b5b600061303d86828701612856565b935050602061304e8682870161288c565b925050604061305f8682870161288c565b9150509250925092565b6000819050919050565b600061308e6130896130848461280d565b613069565b61280d565b9050919050565b60006130a082613073565b9050919050565b60006130b282613095565b9050919050565b6130c2816130a7565b82525050565b60006020820190506130dd60008301846130b9565b92915050565b600067ffffffffffffffff8211156130fe576130fd6129dc565b5b602082029050602081019050919050565b600061312261311d846130e3565b612a3c565b9050808382526020820190506020840283018581111561314557613144612a83565b5b835b8181101561316e578061315a8882612856565b845260208401935050602081019050613147565b5050509392505050565b600082601f83011261318d5761318c6129c6565b5b813561319d84826020860161310f565b91505092915050565b600080604083850312156131bd576131bc612803565b5b600083013567ffffffffffffffff8111156131db576131da612808565b5b6131e785828601613178565b925050602083013567ffffffffffffffff81111561320857613207612808565b5b61321485828601612e78565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6132538161286b565b82525050565b6000613265838361324a565b60208301905092915050565b6000602082019050919050565b60006132898261321e565b6132938185613229565b935061329e8361323a565b8060005b838110156132cf5781516132b68882613259565b97506132c183613271565b9250506001810190506132a2565b5085935050505092915050565b600060208201905081810360008301526132f6818461327e565b905092915050565b60006020820190506133136000830184612dab565b92915050565b600080604083850312156133305761332f612803565b5b600061333e85828601612856565b925050602061334f85828601612d29565b9150509250929050565b60006bffffffffffffffffffffffff82169050919050565b61337a81613359565b82525050565b60006020820190506133956000830184613371565b92915050565b600080604083850312156133b2576133b1612803565b5b60006133c085828601612856565b92505060206133d185828601612856565b9150509250929050565b600080600080600060a086880312156133f7576133f6612803565b5b600061340588828901612856565b955050602061341688828901612856565b94505060406134278882890161288c565b93505060606134388882890161288c565b925050608086013567ffffffffffffffff81111561345957613458612808565b5b61346588828901612f19565b9150509295509295909350565b60006020828403121561348857613487612803565b5b600061349684828501612856565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006134fb602a83612c46565b91506135068261349f565b604082019050919050565b6000602082019050818103600083015261352a816134ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061357857607f821691505b60208210810361358b5761358a613531565b5b50919050565b600081905092915050565b60006135a782612c3b565b6135b18185613591565b93506135c1818560208601612c57565b80840191505092915050565b60006135d9828461359c565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061361e8261286b565b91506136298361286b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613662576136616135e4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136a78261286b565b91506136b28361286b565b9250826136c2576136c161366d565b5b828204905092915050565b60006040820190506136e26000830185612dab565b6136ef6020830184612dab565b9392505050565b60008151905061370581612d12565b92915050565b60006020828403121561372157613720612803565b5b600061372f848285016136f6565b91505092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613794602183612c46565b915061379f82613738565b604082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b7f63616c6c6572206973206e6f74206f776e6572206e6f72206f70657261746f72600082015250565b6000613800602083612c46565b915061380b826137ca565b602082019050919050565b6000602082019050818103600083015261382f816137f3565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613892602983612c46565b915061389d82613836565b604082019050919050565b600060208201905081810360008301526138c181613885565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006139028261286b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613934576139336135e4565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061399b602683612c46565b91506139a68261393f565b604082019050919050565b600060208201905081810360008301526139ca8161398e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a07602083612c46565b9150613a12826139d1565b602082019050919050565b60006020820190508181036000830152613a36816139fa565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613a99602f83612c46565b9150613aa482613a3d565b604082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b6000613ada8261286b565b9150613ae58361286b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b1a57613b196135e4565b5b828201905092915050565b6000604082019050613b3a60008301856128e1565b613b4760208301846128e1565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613baa602383612c46565b9150613bb582613b4e565b604082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000613c3c602483612c46565b9150613c4782613be0565b604082019050919050565b60006020820190508181036000830152613c6b81613c2f565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613cce602883612c46565b9150613cd982613c72565b604082019050919050565b60006020820190508181036000830152613cfd81613cc1565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613d60602583612c46565b9150613d6b82613d04565b604082019050919050565b60006020820190508181036000830152613d8f81613d53565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613df2602a83612c46565b9150613dfd82613d96565b604082019050919050565b60006020820190508181036000830152613e2181613de5565b9050919050565b60006040820190508181036000830152613e42818561327e565b90508181036020830152613e56818461327e565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000613e8682613e5f565b613e908185613e6a565b9350613ea0818560208601612c57565b613ea9816129cb565b840191505092915050565b600060a082019050613ec96000830188612dab565b613ed66020830187612dab565b613ee360408301866128e1565b613ef060608301856128e1565b8181036080830152613f028184613e7b565b90509695505050505050565b600081519050613f1d81612937565b92915050565b600060208284031215613f3957613f38612803565b5b6000613f4784828501613f0e565b91505092915050565b60008160e01c9050919050565b600060033d1115613f7c5760046000803e613f79600051613f50565b90505b90565b600060443d1061400c57613f916127f9565b60043d036004823e80513d602482011167ffffffffffffffff82111715613fb957505061400c565b808201805167ffffffffffffffff811115613fd7575050505061400c565b80602083010160043d038501811115613ff457505050505061400c565b61400382602001850186612a0b565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061406b603483612c46565b91506140768261400f565b604082019050919050565b6000602082019050818103600083015261409a8161405e565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006140fd602883612c46565b9150614108826140a1565b604082019050919050565b6000602082019050818103600083015261412c816140f0565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061418f602983612c46565b915061419a82614133565b604082019050919050565b600060208201905081810360008301526141be81614182565b9050919050565b600060a0820190506141da6000830188612dab565b6141e76020830187612dab565b81810360408301526141f9818661327e565b9050818103606083015261420d818561327e565b905081810360808301526142218184613e7b565b9050969550505050505056fea264697066735822122054b65a21eb0e408e4a3ea4bea6e2e2fb5c6da18dca27541e089817c361c76d5e64736f6c634300080d0033697066733a2f2f516d536a47334a70356168434646675a7054773643576a4d5a557061647479717a52587a616944334879774656662f

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061014c5760003560e01c806341f43434116100c3578063a22cb4651161007c578063a22cb465146103b2578063e86dea4a146103ce578063e985e9c5146103ec578063f242432a1461041c578063f2fde38b14610438578063f5298aca146104545761014c565b806341f43434146103005780634e1273f41461031e578063715018a61461034e57806371b9b646146103585780638da5cb5b1461037657806395d89b41146103945761014c565b806310637d8a1161011557806310637d8a1461021b5780631d2e5a3a1461024b5780632a55205a146102675780632eb2c2d614610298578063388b9fe0146102b45780633ef0ddb9146102d05761014c565b8062fdd58e1461015157806301ffc9a71461018157806305959216146101b157806306fdde03146101cd5780630e89341c146101eb575b600080fd5b61016b600480360381019061016691906128a1565b610470565b60405161017891906128f0565b60405180910390f35b61019b60048036038101906101969190612963565b610538565b6040516101a891906129ab565b60405180910390f35b6101cb60048036038101906101c69190612bf2565b61054a565b005b6101d561057a565b6040516101e29190612cc3565b60405180910390f35b61020560048036038101906102009190612ce5565b610608565b6040516102129190612cc3565b60405180910390f35b610235600480360381019061023091906128a1565b610639565b60405161024291906128f0565b60405180910390f35b61026560048036038101906102609190612d3e565b61065e565b005b610281600480360381019061027c9190612d6b565b610683565b60405161028f929190612dba565b60405180910390f35b6102b260048036038101906102ad9190612f47565b61086d565b005b6102ce60048036038101906102c99190613016565b6109c3565b005b6102ea60048036038101906102e59190612ce5565b610ae6565b6040516102f79190612cc3565b60405180910390f35b610308610b92565b60405161031591906130c8565b60405180910390f35b610338600480360381019061033391906131a6565b610ba4565b60405161034591906132dc565b60405180910390f35b610356610cbd565b005b610360610cd0565b60405161036d91906129ab565b60405180910390f35b61037e610ce3565b60405161038b91906132fe565b60405180910390f35b61039c610d0d565b6040516103a99190612cc3565b60405180910390f35b6103cc60048036038101906103c79190613319565b610d9b565b005b6103d6610ea5565b6040516103e39190613380565b60405180910390f35b6104066004803603810190610401919061339b565b610ec3565b60405161041391906129ab565b60405180910390f35b610436600480360381019061043191906133db565b610f57565b005b610452600480360381019061044d9190613472565b6110ad565b005b61046e60048036038101906104699190613016565b611130565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036104e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d790613511565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000610543826111d4565b9050919050565b61055261124e565b600960006105609190612671565b8060099080519060200190610576929190612692565b5050565b6006805461058790613560565b80601f01602080910402602001604051908101604052809291908181526020018280546105b390613560565b80156106005780601f106105d557610100808354040283529160200191610600565b820191906000526020600020905b8154815290600101906020018083116105e357829003601f168201915b505050505081565b6060610613826112cc565b60405160200161062391906135cd565b6040516020818303038152906040529050919050565b600b602052816000526040600020602052806000526040600020600091509150505481565b61066661124e565b80600a60006101000a81548160ff02191690831515021790555050565b6000806000600560008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16036108185760046040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b600061082261137c565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff168661084e9190613613565b610858919061369c565b90508160000151819350935050509250929050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156109ad573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108e1576108dc8686868686611386565b6109bb565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161092a9291906136cd565b602060405180830381865afa158015610947573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096b919061370b565b6109ac57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016109a391906132fe565b60405180910390fd5b5b6109ba8686868686611386565b5b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a29906137aa565b60405180910390fd5b610a3a610ce3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610a875750610a86610a79610ce3565b610a81611427565b610ec3565b5b610ac6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abd90613816565b60405180910390fd5b610ae18383836040518060200160405280600081525061142f565b505050565b60098181548110610af657600080fd5b906000526020600020016000915090508054610b1190613560565b80601f0160208091040260200160405190810160405280929190818152602001828054610b3d90613560565b8015610b8a5780601f10610b5f57610100808354040283529160200191610b8a565b820191906000526020600020905b815481529060010190602001808311610b6d57829003601f168201915b505050505081565b6daaeb6d7670e522a718067333cd4e81565b60608151835114610bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be1906138a8565b60405180910390fd5b6000835167ffffffffffffffff811115610c0757610c066129dc565b5b604051908082528060200260200182016040528015610c355781602001602082028036833780820191505090505b50905060005b8451811015610cb257610c82858281518110610c5a57610c596138c8565b5b6020026020010151858381518110610c7557610c746138c8565b5b6020026020010151610470565b828281518110610c9557610c946138c8565b5b60200260200101818152505080610cab906138f7565b9050610c3b565b508091505092915050565b610cc561124e565b610cce336115df565b565b600a60009054906101000a900460ff1681565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60078054610d1a90613560565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4690613560565b8015610d935780601f10610d6857610100808354040283529160200191610d93565b820191906000526020600020905b815481529060010190602001808311610d7657829003601f168201915b505050505081565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610e96576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e139291906136cd565b602060405180830381865afa158015610e30573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e54919061370b565b610e9557806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610e8c91906132fe565b60405180910390fd5b5b610ea083836116a5565b505050565b600860009054906101000a90046bffffffffffffffffffffffff1681565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b8460006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611097573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610fcb57610fc686868686866116bb565b6110a5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016110149291906136cd565b602060405180830381865afa158015611031573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611055919061370b565b61109657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161108d91906132fe565b60405180910390fd5b5b6110a486868686866116bb565b5b505050505050565b6110b561124e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611124576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161111b906139b1565b60405180910390fd5b61112d816115df565b50565b611138610ce3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806111855750611184611177610ce3565b61117f611427565b610ec3565b5b6111c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bb90613816565b60405180910390fd5b6111cf83838361175c565b505050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806112475750611246826119a2565b5b9050919050565b611256611427565b73ffffffffffffffffffffffffffffffffffffffff16611274610ce3565b73ffffffffffffffffffffffffffffffffffffffff16146112ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c190613a1d565b60405180910390fd5b565b6060600982815481106112e2576112e16138c8565b5b9060005260206000200180546112f790613560565b80601f016020809104026020016040519081016040528092919081815260200182805461132390613560565b80156113705780601f1061134557610100808354040283529160200191611370565b820191906000526020600020905b81548152906001019060200180831161135357829003601f168201915b50505050509050919050565b6000612710905090565b61138e611427565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113d457506113d3856113ce611427565b610ec3565b5b611413576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140a90613aaf565b60405180910390fd5b6114208585858585611a84565b5050505050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361149e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611495906137aa565b60405180910390fd5b60006114a8611427565b905060006114b585611da5565b905060006114c285611da5565b90506114d383600089858589611e1f565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115329190613acf565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516115b0929190613b25565b60405180910390a46115c783600089858589611e27565b6115d683600089898989611e2f565b50505050505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6116b76116b0611427565b8383612006565b5050565b6116c3611427565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611709575061170885611703611427565b610ec3565b5b611748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173f90613aaf565b60405180910390fd5b6117558585858585612172565b5050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036117cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c290613bc0565b60405180910390fd5b60006117d5611427565b905060006117e284611da5565b905060006117ef84611da5565b905061180f83876000858560405180602001604052806000815250611e1f565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613c52565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611973929190613b25565b60405180910390a461199984886000868660405180602001604052806000815250611e27565b50505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a6d57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a7d5750611a7c8261240d565b5b9050919050565b8151835114611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90613ce4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2e90613d76565b60405180910390fd5b6000611b41611427565b9050611b51818787878787611e1f565b60005b8451811015611d02576000858281518110611b7257611b716138c8565b5b602002602001015190506000858381518110611b9157611b906138c8565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2990613e08565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ce79190613acf565b9250508190555050505080611cfb906138f7565b9050611b54565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d79929190613e28565b60405180910390a4611d8f818787878787611e27565b611d9d818787878787612477565b505050505050565b60606000600167ffffffffffffffff811115611dc457611dc36129dc565b5b604051908082528060200260200182016040528015611df25781602001602082028036833780820191505090505b5090508281600081518110611e0a57611e096138c8565b5b60200260200101818152505080915050919050565b505050505050565b505050505050565b611e4e8473ffffffffffffffffffffffffffffffffffffffff1661264e565b15611ffe578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611e94959493929190613eb4565b6020604051808303816000875af1925050508015611ed057506040513d601f19601f82011682018060405250810190611ecd9190613f23565b60015b611f7557611edc613f5d565b806308c379a003611f385750611ef0613f7f565b80611efb5750611f3a565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2f9190612cc3565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6c90614081565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611ffc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff390614113565b60405180910390fd5b505b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612074576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206b906141a5565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161216591906129ab565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036121e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121d890613d76565b60405180910390fd5b60006121eb611427565b905060006121f885611da5565b9050600061220585611da5565b9050612215838989858589611e1f565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050858110156122ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a390613e08565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123619190613acf565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a6040516123de929190613b25565b60405180910390a46123f4848a8a86868a611e27565b612402848a8a8a8a8a611e2f565b505050505050505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124968473ffffffffffffffffffffffffffffffffffffffff1661264e565b15612646578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016124dc9594939291906141c5565b6020604051808303816000875af192505050801561251857506040513d601f19601f820116820180604052508101906125159190613f23565b60015b6125bd57612524613f5d565b806308c379a0036125805750612538613f7f565b806125435750612582565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125779190612cc3565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b490614081565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90614113565b60405180910390fd5b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b508054600082559060005260206000209081019061268f91906126f2565b50565b8280548282559060005260206000209081019282156126e1579160200282015b828111156126e05782518290805190602001906126d0929190612716565b50916020019190600101906126b2565b5b5090506126ee91906126f2565b5090565b5b808211156127125760008181612709919061279c565b506001016126f3565b5090565b82805461272290613560565b90600052602060002090601f016020900481019282612744576000855561278b565b82601f1061275d57805160ff191683800117855561278b565b8280016001018555821561278b579182015b8281111561278a57825182559160200191906001019061276f565b5b50905061279891906127dc565b5090565b5080546127a890613560565b6000825580601f106127ba57506127d9565b601f0160209004906000526020600020908101906127d891906127dc565b5b50565b5b808211156127f55760008160009055506001016127dd565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128388261280d565b9050919050565b6128488161282d565b811461285357600080fd5b50565b6000813590506128658161283f565b92915050565b6000819050919050565b61287e8161286b565b811461288957600080fd5b50565b60008135905061289b81612875565b92915050565b600080604083850312156128b8576128b7612803565b5b60006128c685828601612856565b92505060206128d78582860161288c565b9150509250929050565b6128ea8161286b565b82525050565b600060208201905061290560008301846128e1565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129408161290b565b811461294b57600080fd5b50565b60008135905061295d81612937565b92915050565b60006020828403121561297957612978612803565b5b60006129878482850161294e565b91505092915050565b60008115159050919050565b6129a581612990565b82525050565b60006020820190506129c0600083018461299c565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612a14826129cb565b810181811067ffffffffffffffff82111715612a3357612a326129dc565b5b80604052505050565b6000612a466127f9565b9050612a528282612a0b565b919050565b600067ffffffffffffffff821115612a7257612a716129dc565b5b602082029050602081019050919050565b600080fd5b600080fd5b600067ffffffffffffffff821115612aa857612aa76129dc565b5b612ab1826129cb565b9050602081019050919050565b82818337600083830152505050565b6000612ae0612adb84612a8d565b612a3c565b905082815260208101848484011115612afc57612afb612a88565b5b612b07848285612abe565b509392505050565b600082601f830112612b2457612b236129c6565b5b8135612b34848260208601612acd565b91505092915050565b6000612b50612b4b84612a57565b612a3c565b90508083825260208201905060208402830185811115612b7357612b72612a83565b5b835b81811015612bba57803567ffffffffffffffff811115612b9857612b976129c6565b5b808601612ba58982612b0f565b85526020850194505050602081019050612b75565b5050509392505050565b600082601f830112612bd957612bd86129c6565b5b8135612be9848260208601612b3d565b91505092915050565b600060208284031215612c0857612c07612803565b5b600082013567ffffffffffffffff811115612c2657612c25612808565b5b612c3284828501612bc4565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612c75578082015181840152602081019050612c5a565b83811115612c84576000848401525b50505050565b6000612c9582612c3b565b612c9f8185612c46565b9350612caf818560208601612c57565b612cb8816129cb565b840191505092915050565b60006020820190508181036000830152612cdd8184612c8a565b905092915050565b600060208284031215612cfb57612cfa612803565b5b6000612d098482850161288c565b91505092915050565b612d1b81612990565b8114612d2657600080fd5b50565b600081359050612d3881612d12565b92915050565b600060208284031215612d5457612d53612803565b5b6000612d6284828501612d29565b91505092915050565b60008060408385031215612d8257612d81612803565b5b6000612d908582860161288c565b9250506020612da18582860161288c565b9150509250929050565b612db48161282d565b82525050565b6000604082019050612dcf6000830185612dab565b612ddc60208301846128e1565b9392505050565b600067ffffffffffffffff821115612dfe57612dfd6129dc565b5b602082029050602081019050919050565b6000612e22612e1d84612de3565b612a3c565b90508083825260208201905060208402830185811115612e4557612e44612a83565b5b835b81811015612e6e5780612e5a888261288c565b845260208401935050602081019050612e47565b5050509392505050565b600082601f830112612e8d57612e8c6129c6565b5b8135612e9d848260208601612e0f565b91505092915050565b600067ffffffffffffffff821115612ec157612ec06129dc565b5b612eca826129cb565b9050602081019050919050565b6000612eea612ee584612ea6565b612a3c565b905082815260208101848484011115612f0657612f05612a88565b5b612f11848285612abe565b509392505050565b600082601f830112612f2e57612f2d6129c6565b5b8135612f3e848260208601612ed7565b91505092915050565b600080600080600060a08688031215612f6357612f62612803565b5b6000612f7188828901612856565b9550506020612f8288828901612856565b945050604086013567ffffffffffffffff811115612fa357612fa2612808565b5b612faf88828901612e78565b935050606086013567ffffffffffffffff811115612fd057612fcf612808565b5b612fdc88828901612e78565b925050608086013567ffffffffffffffff811115612ffd57612ffc612808565b5b61300988828901612f19565b9150509295509295909350565b60008060006060848603121561302f5761302e612803565b5b600061303d86828701612856565b935050602061304e8682870161288c565b925050604061305f8682870161288c565b9150509250925092565b6000819050919050565b600061308e6130896130848461280d565b613069565b61280d565b9050919050565b60006130a082613073565b9050919050565b60006130b282613095565b9050919050565b6130c2816130a7565b82525050565b60006020820190506130dd60008301846130b9565b92915050565b600067ffffffffffffffff8211156130fe576130fd6129dc565b5b602082029050602081019050919050565b600061312261311d846130e3565b612a3c565b9050808382526020820190506020840283018581111561314557613144612a83565b5b835b8181101561316e578061315a8882612856565b845260208401935050602081019050613147565b5050509392505050565b600082601f83011261318d5761318c6129c6565b5b813561319d84826020860161310f565b91505092915050565b600080604083850312156131bd576131bc612803565b5b600083013567ffffffffffffffff8111156131db576131da612808565b5b6131e785828601613178565b925050602083013567ffffffffffffffff81111561320857613207612808565b5b61321485828601612e78565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6132538161286b565b82525050565b6000613265838361324a565b60208301905092915050565b6000602082019050919050565b60006132898261321e565b6132938185613229565b935061329e8361323a565b8060005b838110156132cf5781516132b68882613259565b97506132c183613271565b9250506001810190506132a2565b5085935050505092915050565b600060208201905081810360008301526132f6818461327e565b905092915050565b60006020820190506133136000830184612dab565b92915050565b600080604083850312156133305761332f612803565b5b600061333e85828601612856565b925050602061334f85828601612d29565b9150509250929050565b60006bffffffffffffffffffffffff82169050919050565b61337a81613359565b82525050565b60006020820190506133956000830184613371565b92915050565b600080604083850312156133b2576133b1612803565b5b60006133c085828601612856565b92505060206133d185828601612856565b9150509250929050565b600080600080600060a086880312156133f7576133f6612803565b5b600061340588828901612856565b955050602061341688828901612856565b94505060406134278882890161288c565b93505060606134388882890161288c565b925050608086013567ffffffffffffffff81111561345957613458612808565b5b61346588828901612f19565b9150509295509295909350565b60006020828403121561348857613487612803565b5b600061349684828501612856565b91505092915050565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006134fb602a83612c46565b91506135068261349f565b604082019050919050565b6000602082019050818103600083015261352a816134ee565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061357857607f821691505b60208210810361358b5761358a613531565b5b50919050565b600081905092915050565b60006135a782612c3b565b6135b18185613591565b93506135c1818560208601612c57565b80840191505092915050565b60006135d9828461359c565b915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061361e8261286b565b91506136298361286b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613662576136616135e4565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006136a78261286b565b91506136b28361286b565b9250826136c2576136c161366d565b5b828204905092915050565b60006040820190506136e26000830185612dab565b6136ef6020830184612dab565b9392505050565b60008151905061370581612d12565b92915050565b60006020828403121561372157613720612803565b5b600061372f848285016136f6565b91505092915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000613794602183612c46565b915061379f82613738565b604082019050919050565b600060208201905081810360008301526137c381613787565b9050919050565b7f63616c6c6572206973206e6f74206f776e6572206e6f72206f70657261746f72600082015250565b6000613800602083612c46565b915061380b826137ca565b602082019050919050565b6000602082019050818103600083015261382f816137f3565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000613892602983612c46565b915061389d82613836565b604082019050919050565b600060208201905081810360008301526138c181613885565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60006139028261286b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613934576139336135e4565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061399b602683612c46565b91506139a68261393f565b604082019050919050565b600060208201905081810360008301526139ca8161398e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613a07602083612c46565b9150613a12826139d1565b602082019050919050565b60006020820190508181036000830152613a36816139fa565b9050919050565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b6000613a99602f83612c46565b9150613aa482613a3d565b604082019050919050565b60006020820190508181036000830152613ac881613a8c565b9050919050565b6000613ada8261286b565b9150613ae58361286b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b1a57613b196135e4565b5b828201905092915050565b6000604082019050613b3a60008301856128e1565b613b4760208301846128e1565b9392505050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000613baa602383612c46565b9150613bb582613b4e565b604082019050919050565b60006020820190508181036000830152613bd981613b9d565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000613c3c602483612c46565b9150613c4782613be0565b604082019050919050565b60006020820190508181036000830152613c6b81613c2f565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613cce602883612c46565b9150613cd982613c72565b604082019050919050565b60006020820190508181036000830152613cfd81613cc1565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613d60602583612c46565b9150613d6b82613d04565b604082019050919050565b60006020820190508181036000830152613d8f81613d53565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000613df2602a83612c46565b9150613dfd82613d96565b604082019050919050565b60006020820190508181036000830152613e2181613de5565b9050919050565b60006040820190508181036000830152613e42818561327e565b90508181036020830152613e56818461327e565b90509392505050565b600081519050919050565b600082825260208201905092915050565b6000613e8682613e5f565b613e908185613e6a565b9350613ea0818560208601612c57565b613ea9816129cb565b840191505092915050565b600060a082019050613ec96000830188612dab565b613ed66020830187612dab565b613ee360408301866128e1565b613ef060608301856128e1565b8181036080830152613f028184613e7b565b90509695505050505050565b600081519050613f1d81612937565b92915050565b600060208284031215613f3957613f38612803565b5b6000613f4784828501613f0e565b91505092915050565b60008160e01c9050919050565b600060033d1115613f7c5760046000803e613f79600051613f50565b90505b90565b600060443d1061400c57613f916127f9565b60043d036004823e80513d602482011167ffffffffffffffff82111715613fb957505061400c565b808201805167ffffffffffffffff811115613fd7575050505061400c565b80602083010160043d038501811115613ff457505050505061400c565b61400382602001850186612a0b565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b600061406b603483612c46565b91506140768261400f565b604082019050919050565b6000602082019050818103600083015261409a8161405e565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006140fd602883612c46565b9150614108826140a1565b604082019050919050565b6000602082019050818103600083015261412c816140f0565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b600061418f602983612c46565b915061419a82614133565b604082019050919050565b600060208201905081810360008301526141be81614182565b9050919050565b600060a0820190506141da6000830188612dab565b6141e76020830187612dab565b81810360408301526141f9818661327e565b9050818103606083015261420d818561327e565b905081810360808301526142218184613e7b565b9050969550505050505056fea264697066735822122054b65a21eb0e408e4a3ea4bea6e2e2fb5c6da18dca27541e089817c361c76d5e64736f6c634300080d0033

Deployed Bytecode Sourcemap

54039:3322:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36858:230;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57163:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57018:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54125:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56320:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54415:63;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56895:86;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24829:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;55150:302;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55494:304;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54254:84;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2924:143;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37254:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56774:113;;;:::i;:::-;;54345:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10311:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54150:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54706:176;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54214:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38078:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54890:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56501:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55840:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36858:230;36944:7;36991:1;36972:21;;:7;:21;;;36964:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37058:9;:13;37068:2;37058:13;;;;;;;;;;;:22;37072:7;37058:22;;;;;;;;;;;;;;;;37051:29;;36858:230;;;;:::o;57163:193::-;57284:4;57312:36;57336:11;57312:23;:36::i;:::-;57305:43;;57163:193;;;:::o;57018:121::-;10197:13;:11;:13::i;:::-;57098:7:::1;;57091:14;;;;:::i;:::-;57126:5;57116:7;:15;;;;;;;;;;;;:::i;:::-;;57018:121:::0;:::o;54125:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56320:138::-;56375:13;56432:16;56445:2;56432:12;:16::i;:::-;56415:34;;;;;;;;:::i;:::-;;;;;;;;;;;;;56401:49;;56320:138;;;:::o;54415:63::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56895:86::-;10197:13;:11;:13::i;:::-;56968:5:::1;56954:11;;:19;;;;;;;;;;;;;;;;;;56895:86:::0;:::o;24829:442::-;24926:7;24935;24955:26;24984:17;:27;25002:8;24984:27;;;;;;;;;;;24955:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25056:1;25028:30;;:7;:16;;;:30;;;25024:92;;25085:19;25075:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25024:92;25128:21;25193:17;:15;:17::i;:::-;25152:58;;25166:7;:23;;;25153:36;;:10;:36;;;;:::i;:::-;25152:58;;;;:::i;:::-;25128:82;;25231:7;:16;;;25249:13;25223:40;;;;;;24829:442;;;;;:::o;55150:302::-;55370:4;4220:1;3024:42;4172:45;;;:49;4168:539;;;4461:10;4453:18;;:4;:18;;;4449:85;;55387:57:::1;55415:4;55421:2;55425:3;55430:7;55439:4;55387:27;:57::i;:::-;4512:7:::0;;4449:85;3024:42;4553;;;4604:4;4611:10;4553:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4548:148;;4669:10;4650:30;;;;;;;;;;;:::i;:::-;;;;;;;;4548:148;4168:539;55387:57:::1;55415:4;55421:2;55425:3;55430:7;55439:4;55387:27;:57::i;:::-;55150:302:::0;;;;;;;:::o;55494:304::-;55595:1;55581:16;;:2;:16;;;55573:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;55668:7;:5;:7::i;:::-;55654:21;;:10;:21;;;:64;;;;55679:39;55696:7;:5;:7::i;:::-;55705:12;:10;:12::i;:::-;55679:16;:39::i;:::-;55654:64;55646:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;55766:24;55772:2;55776;55780:6;55766:24;;;;;;;;;;;;:5;:24::i;:::-;55494:304;;;:::o;54254:84::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2924:143::-;3024:42;2924:143;:::o;37254:524::-;37410:16;37471:3;:10;37452:8;:15;:29;37444:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;37540:30;37587:8;:15;37573:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37540:63;;37621:9;37616:122;37640:8;:15;37636:1;:19;37616:122;;;37696:30;37706:8;37715:1;37706:11;;;;;;;;:::i;:::-;;;;;;;;37719:3;37723:1;37719:6;;;;;;;;:::i;:::-;;;;;;;;37696:9;:30::i;:::-;37677:13;37691:1;37677:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;37657:3;;;;:::i;:::-;;;37616:122;;;;37757:13;37750:20;;;37254:524;;;;:::o;56774:113::-;10197:13;:11;:13::i;:::-;56840:39:::1;56867:10;56840:18;:39::i;:::-;56774:113::o:0;54345:31::-;;;;;;;;;;;;;:::o;10311:87::-;10357:7;10384:6;;;;;;;;;;;10377:13;;10311:87;:::o;54150:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;54706:176::-;54810:8;4966:1;3024:42;4918:45;;;:49;4914:225;;;3024:42;4989;;;5040:4;5047:8;4989:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4984:144;;5103:8;5084:28;;;;;;;;;;;:::i;:::-;;;;;;;;4984:144;4914:225;54831:43:::1;54855:8;54865;54831:23;:43::i;:::-;54706:176:::0;;;:::o;54214:33::-;;;;;;;;;;;;;:::o;38078:168::-;38177:4;38201:18;:27;38220:7;38201:27;;;;;;;;;;;;;;;:37;38229:8;38201:37;;;;;;;;;;;;;;;;;;;;;;;;;38194:44;;38078:168;;;;:::o;54890:252::-;55057:4;4220:1;3024:42;4172:45;;;:49;4168:539;;;4461:10;4453:18;;:4;:18;;;4449:85;;55079:55:::1;55102:4;55108:2;55112:7;55121:6;55129:4;55079:22;:55::i;:::-;4512:7:::0;;4449:85;3024:42;4553;;;4604:4;4611:10;4553:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4548:148;;4669:10;4650:30;;;;;;;;;;;:::i;:::-;;;;;;;;4548:148;4168:539;55079:55:::1;55102:4;55108:2;55112:7;55121:6;55129:4;55079:22;:55::i;:::-;54890:252:::0;;;;;;;:::o;56501:210::-;10197:13;:11;:13::i;:::-;56619:1:::1;56599:22;;:8;:22;;::::0;56591:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56675:28;56694:8;56675:18;:28::i;:::-;56501:210:::0;:::o;55840:227::-;55938:7;:5;:7::i;:::-;55924:21;;:10;:21;;;:64;;;;55949:39;55966:7;:5;:7::i;:::-;55975:12;:10;:12::i;:::-;55949:16;:39::i;:::-;55924:64;55916:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;56036:23;56042:4;56048:2;56052:6;56036:5;:23::i;:::-;55840:227;;;:::o;24559:215::-;24661:4;24700:26;24685:41;;;:11;:41;;;;:81;;;;24730:36;24754:11;24730:23;:36::i;:::-;24685:81;24678:88;;24559:215;;;:::o;10476:132::-;10551:12;:10;:12::i;:::-;10540:23;;:7;:5;:7::i;:::-;:23;;;10532:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10476:132::o;56152:118::-;56210:13;56247:7;56255:3;56247:12;;;;;;;;:::i;:::-;;;;;;;;;56240:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56152:118;;;:::o;25553:97::-;25611:6;25637:5;25630:12;;25553:97;:::o;38802:439::-;39043:12;:10;:12::i;:::-;39035:20;;:4;:20;;;:60;;;;39059:36;39076:4;39082:12;:10;:12::i;:::-;39059:16;:36::i;:::-;39035:60;39013:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;39181:52;39204:4;39210:2;39214:3;39219:7;39228:4;39181:22;:52::i;:::-;38802:439;;;;;:::o;8862:98::-;8915:7;8942:10;8935:17;;8862:98;:::o;43501:729::-;43668:1;43654:16;;:2;:16;;;43646:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43721:16;43740:12;:10;:12::i;:::-;43721:31;;43763:20;43786:21;43804:2;43786:17;:21::i;:::-;43763:44;;43818:24;43845:25;43863:6;43845:17;:25::i;:::-;43818:52;;43883:66;43904:8;43922:1;43926:2;43930:3;43935:7;43944:4;43883:20;:66::i;:::-;43983:6;43962:9;:13;43972:2;43962:13;;;;;;;;;;;:17;43976:2;43962:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;44042:2;44005:52;;44038:1;44005:52;;44020:8;44005:52;;;44046:2;44050:6;44005:52;;;;;;;:::i;:::-;;;;;;;;44070:65;44090:8;44108:1;44112:2;44116:3;44121:7;44130:4;44070:19;:65::i;:::-;44148:74;44179:8;44197:1;44201:2;44205;44209:6;44217:4;44148:30;:74::i;:::-;43635:595;;;43501:729;;;;:::o;11578:191::-;11652:16;11671:6;;;;;;;;;;;11652:25;;11697:8;11688:6;;:17;;;;;;;;;;;;;;;;;;11752:8;11721:40;;11742:8;11721:40;;;;;;;;;;;;11641:128;11578:191;:::o;37851:155::-;37946:52;37965:12;:10;:12::i;:::-;37979:8;37989;37946:18;:52::i;:::-;37851:155;;:::o;38318:407::-;38534:12;:10;:12::i;:::-;38526:20;;:4;:20;;;:60;;;;38550:36;38567:4;38573:12;:10;:12::i;:::-;38550:16;:36::i;:::-;38526:60;38504:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;38672:45;38690:4;38696:2;38700;38704:6;38712:4;38672:17;:45::i;:::-;38318:407;;;;;:::o;45744:808::-;45887:1;45871:18;;:4;:18;;;45863:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;45942:16;45961:12;:10;:12::i;:::-;45942:31;;45984:20;46007:21;46025:2;46007:17;:21::i;:::-;45984:44;;46039:24;46066:25;46084:6;46066:17;:25::i;:::-;46039:52;;46104:66;46125:8;46135:4;46149:1;46153:3;46158:7;46104:66;;;;;;;;;;;;:20;:66::i;:::-;46183:19;46205:9;:13;46215:2;46205:13;;;;;;;;;;;:19;46219:4;46205:19;;;;;;;;;;;;;;;;46183:41;;46258:6;46243:11;:21;;46235:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;46377:6;46363:11;:20;46341:9;:13;46351:2;46341:13;;;;;;;;;;;:19;46355:4;46341:19;;;;;;;;;;;;;;;:42;;;;46451:1;46412:54;;46437:4;46412:54;;46427:8;46412:54;;;46455:2;46459:6;46412:54;;;;;;;:::i;:::-;;;;;;;;46479:65;46499:8;46509:4;46523:1;46527:3;46532:7;46479:65;;;;;;;;;;;;:19;:65::i;:::-;45852:700;;;;45744:808;;;:::o;35881:310::-;35983:4;36035:26;36020:41;;;:11;:41;;;;:110;;;;36093:37;36078:52;;;:11;:52;;;;36020:110;:163;;;;36147:36;36171:11;36147:23;:36::i;:::-;36020:163;36000:183;;35881:310;;;:::o;41037:1146::-;41264:7;:14;41250:3;:10;:28;41242:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;41356:1;41342:16;;:2;:16;;;41334:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41413:16;41432:12;:10;:12::i;:::-;41413:31;;41457:60;41478:8;41488:4;41494:2;41498:3;41503:7;41512:4;41457:20;:60::i;:::-;41535:9;41530:421;41554:3;:10;41550:1;:14;41530:421;;;41586:10;41599:3;41603:1;41599:6;;;;;;;;:::i;:::-;;;;;;;;41586:19;;41620:14;41637:7;41645:1;41637:10;;;;;;;;:::i;:::-;;;;;;;;41620:27;;41664:19;41686:9;:13;41696:2;41686:13;;;;;;;;;;;:19;41700:4;41686:19;;;;;;;;;;;;;;;;41664:41;;41743:6;41728:11;:21;;41720:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;41876:6;41862:11;:20;41840:9;:13;41850:2;41840:13;;;;;;;;;;;:19;41854:4;41840:19;;;;;;;;;;;;;;;:42;;;;41933:6;41912:9;:13;41922:2;41912:13;;;;;;;;;;;:17;41926:2;41912:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;41571:380;;;41566:3;;;;:::i;:::-;;;41530:421;;;;41998:2;41968:47;;41992:4;41968:47;;41982:8;41968:47;;;42002:3;42007:7;41968:47;;;;;;;:::i;:::-;;;;;;;;42028:59;42048:8;42058:4;42064:2;42068:3;42073:7;42082:4;42028:19;:59::i;:::-;42100:75;42136:8;42146:4;42152:2;42156:3;42161:7;42170:4;42100:35;:75::i;:::-;41231:952;41037:1146;;;;;:::o;52180:198::-;52246:16;52275:22;52314:1;52300:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52275:41;;52338:7;52327:5;52333:1;52327:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;52365:5;52358:12;;;52180:198;;;:::o;49203:221::-;;;;;;;:::o;50379:220::-;;;;;;;:::o;50607:744::-;50822:15;:2;:13;;;:15::i;:::-;50818:526;;;50875:2;50858:38;;;50897:8;50907:4;50913:2;50917:6;50925:4;50858:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50854:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;51206:6;51199:14;;;;;;;;;;;:::i;:::-;;;;;;;;50854:479;;;51255:62;;;;;;;;;;:::i;:::-;;;;;;;;50854:479;50992:43;;;50980:55;;;:8;:55;;;;50976:154;;51060:50;;;;;;;;;;:::i;:::-;;;;;;;;50976:154;50931:214;50818:526;50607:744;;;;;;:::o;47914:331::-;48069:8;48060:17;;:5;:17;;;48052:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;48172:8;48134:18;:25;48153:5;48134:25;;;;;;;;;;;;;;;:35;48160:8;48134:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48218:8;48196:41;;48211:5;48196:41;;;48228:8;48196:41;;;;;;:::i;:::-;;;;;;;;47914:331;;;:::o;39705:974::-;39907:1;39893:16;;:2;:16;;;39885:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39964:16;39983:12;:10;:12::i;:::-;39964:31;;40006:20;40029:21;40047:2;40029:17;:21::i;:::-;40006:44;;40061:24;40088:25;40106:6;40088:17;:25::i;:::-;40061:52;;40126:60;40147:8;40157:4;40163:2;40167:3;40172:7;40181:4;40126:20;:60::i;:::-;40199:19;40221:9;:13;40231:2;40221:13;;;;;;;;;;;:19;40235:4;40221:19;;;;;;;;;;;;;;;;40199:41;;40274:6;40259:11;:21;;40251:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;40399:6;40385:11;:20;40363:9;:13;40373:2;40363:13;;;;;;;;;;;:19;40377:4;40363:19;;;;;;;;;;;;;;;:42;;;;40448:6;40427:9;:13;40437:2;40427:13;;;;;;;;;;;:17;40441:2;40427:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;40503:2;40472:46;;40497:4;40472:46;;40487:8;40472:46;;;40507:2;40511:6;40472:46;;;;;;;:::i;:::-;;;;;;;;40531:59;40551:8;40561:4;40567:2;40571:3;40576:7;40585:4;40531:19;:59::i;:::-;40603:68;40634:8;40644:4;40650:2;40654;40658:6;40666:4;40603:30;:68::i;:::-;39874:805;;;;39705:974;;;;;:::o;23009:157::-;23094:4;23133:25;23118:40;;;:11;:40;;;;23111:47;;23009:157;;;:::o;51359:813::-;51599:15;:2;:13;;;:15::i;:::-;51595:570;;;51652:2;51635:43;;;51679:8;51689:4;51695:3;51700:7;51709:4;51635:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;51631:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;52027:6;52020:14;;;;;;;;;;;:::i;:::-;;;;;;;;51631:523;;;52076:62;;;;;;;;;;:::i;:::-;;;;;;;;51631:523;51808:48;;;51796:60;;;:8;:60;;;;51792:159;;51881:50;;;;;;;;;;:::i;:::-;;;;;;;;51792:159;51715:251;51595:570;51359:813;;;;;;:::o;13009:326::-;13069:4;13326:1;13304:7;:19;;;:23;13297:30;;13009:326;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:102;3377:6;3428:2;3424:7;3419:2;3412:5;3408:14;3404:28;3394:38;;3336:102;;;:::o;3444:180::-;3492:77;3489:1;3482:88;3589:4;3586:1;3579:15;3613:4;3610:1;3603:15;3630:281;3713:27;3735:4;3713:27;:::i;:::-;3705:6;3701:40;3843:6;3831:10;3828:22;3807:18;3795:10;3792:34;3789:62;3786:88;;;3854:18;;:::i;:::-;3786:88;3894:10;3890:2;3883:22;3673:238;3630:281;;:::o;3917:129::-;3951:6;3978:20;;:::i;:::-;3968:30;;4007:33;4035:4;4027:6;4007:33;:::i;:::-;3917:129;;;:::o;4052:321::-;4139:4;4229:18;4221:6;4218:30;4215:56;;;4251:18;;:::i;:::-;4215:56;4301:4;4293:6;4289:17;4281:25;;4361:4;4355;4351:15;4343:23;;4052:321;;;:::o;4379:117::-;4488:1;4485;4478:12;4502:117;4611:1;4608;4601:12;4625:308;4687:4;4777:18;4769:6;4766:30;4763:56;;;4799:18;;:::i;:::-;4763:56;4837:29;4859:6;4837:29;:::i;:::-;4829:37;;4921:4;4915;4911:15;4903:23;;4625:308;;;:::o;4939:154::-;5023:6;5018:3;5013;5000:30;5085:1;5076:6;5071:3;5067:16;5060:27;4939:154;;;:::o;5099:412::-;5177:5;5202:66;5218:49;5260:6;5218:49;:::i;:::-;5202:66;:::i;:::-;5193:75;;5291:6;5284:5;5277:21;5329:4;5322:5;5318:16;5367:3;5358:6;5353:3;5349:16;5346:25;5343:112;;;5374:79;;:::i;:::-;5343:112;5464:41;5498:6;5493:3;5488;5464:41;:::i;:::-;5183:328;5099:412;;;;;:::o;5531:340::-;5587:5;5636:3;5629:4;5621:6;5617:17;5613:27;5603:122;;5644:79;;:::i;:::-;5603:122;5761:6;5748:20;5786:79;5861:3;5853:6;5846:4;5838:6;5834:17;5786:79;:::i;:::-;5777:88;;5593:278;5531:340;;;;:::o;5893:945::-;5999:5;6024:91;6040:74;6107:6;6040:74;:::i;:::-;6024:91;:::i;:::-;6015:100;;6135:5;6164:6;6157:5;6150:21;6198:4;6191:5;6187:16;6180:23;;6251:4;6243:6;6239:17;6231:6;6227:30;6280:3;6272:6;6269:15;6266:122;;;6299:79;;:::i;:::-;6266:122;6414:6;6397:435;6431:6;6426:3;6423:15;6397:435;;;6520:3;6507:17;6556:18;6543:11;6540:35;6537:122;;;6578:79;;:::i;:::-;6537:122;6702:11;6694:6;6690:24;6740:47;6783:3;6771:10;6740:47;:::i;:::-;6735:3;6728:60;6817:4;6812:3;6808:14;6801:21;;6473:359;;6457:4;6452:3;6448:14;6441:21;;6397:435;;;6401:21;6005:833;;5893:945;;;;;:::o;6860:390::-;6941:5;6990:3;6983:4;6975:6;6971:17;6967:27;6957:122;;6998:79;;:::i;:::-;6957:122;7115:6;7102:20;7140:104;7240:3;7232:6;7225:4;7217:6;7213:17;7140:104;:::i;:::-;7131:113;;6947:303;6860:390;;;;:::o;7256:559::-;7350:6;7399:2;7387:9;7378:7;7374:23;7370:32;7367:119;;;7405:79;;:::i;:::-;7367:119;7553:1;7542:9;7538:17;7525:31;7583:18;7575:6;7572:30;7569:117;;;7605:79;;:::i;:::-;7569:117;7710:88;7790:7;7781:6;7770:9;7766:22;7710:88;:::i;:::-;7700:98;;7496:312;7256:559;;;;:::o;7821:99::-;7873:6;7907:5;7901:12;7891:22;;7821:99;;;:::o;7926:169::-;8010:11;8044:6;8039:3;8032:19;8084:4;8079:3;8075:14;8060:29;;7926:169;;;;:::o;8101:307::-;8169:1;8179:113;8193:6;8190:1;8187:13;8179:113;;;8278:1;8273:3;8269:11;8263:18;8259:1;8254:3;8250:11;8243:39;8215:2;8212:1;8208:10;8203:15;;8179:113;;;8310:6;8307:1;8304:13;8301:101;;;8390:1;8381:6;8376:3;8372:16;8365:27;8301:101;8150:258;8101:307;;;:::o;8414:364::-;8502:3;8530:39;8563:5;8530:39;:::i;:::-;8585:71;8649:6;8644:3;8585:71;:::i;:::-;8578:78;;8665:52;8710:6;8705:3;8698:4;8691:5;8687:16;8665:52;:::i;:::-;8742:29;8764:6;8742:29;:::i;:::-;8737:3;8733:39;8726:46;;8506:272;8414:364;;;;:::o;8784:313::-;8897:4;8935:2;8924:9;8920:18;8912:26;;8984:9;8978:4;8974:20;8970:1;8959:9;8955:17;8948:47;9012:78;9085:4;9076:6;9012:78;:::i;:::-;9004:86;;8784:313;;;;:::o;9103:329::-;9162:6;9211:2;9199:9;9190:7;9186:23;9182:32;9179:119;;;9217:79;;:::i;:::-;9179:119;9337:1;9362:53;9407:7;9398:6;9387:9;9383:22;9362:53;:::i;:::-;9352:63;;9308:117;9103:329;;;;:::o;9438:116::-;9508:21;9523:5;9508:21;:::i;:::-;9501:5;9498:32;9488:60;;9544:1;9541;9534:12;9488:60;9438:116;:::o;9560:133::-;9603:5;9641:6;9628:20;9619:29;;9657:30;9681:5;9657:30;:::i;:::-;9560:133;;;;:::o;9699:323::-;9755:6;9804:2;9792:9;9783:7;9779:23;9775:32;9772:119;;;9810:79;;:::i;:::-;9772:119;9930:1;9955:50;9997:7;9988:6;9977:9;9973:22;9955:50;:::i;:::-;9945:60;;9901:114;9699:323;;;;:::o;10028:474::-;10096:6;10104;10153:2;10141:9;10132:7;10128:23;10124:32;10121:119;;;10159:79;;:::i;:::-;10121:119;10279:1;10304:53;10349:7;10340:6;10329:9;10325:22;10304:53;:::i;:::-;10294:63;;10250:117;10406:2;10432:53;10477:7;10468:6;10457:9;10453:22;10432:53;:::i;:::-;10422:63;;10377:118;10028:474;;;;;:::o;10508:118::-;10595:24;10613:5;10595:24;:::i;:::-;10590:3;10583:37;10508:118;;:::o;10632:332::-;10753:4;10791:2;10780:9;10776:18;10768:26;;10804:71;10872:1;10861:9;10857:17;10848:6;10804:71;:::i;:::-;10885:72;10953:2;10942:9;10938:18;10929:6;10885:72;:::i;:::-;10632:332;;;;;:::o;10970:311::-;11047:4;11137:18;11129:6;11126:30;11123:56;;;11159:18;;:::i;:::-;11123:56;11209:4;11201:6;11197:17;11189:25;;11269:4;11263;11259:15;11251:23;;10970:311;;;:::o;11304:710::-;11400:5;11425:81;11441:64;11498:6;11441:64;:::i;:::-;11425:81;:::i;:::-;11416:90;;11526:5;11555:6;11548:5;11541:21;11589:4;11582:5;11578:16;11571:23;;11642:4;11634:6;11630:17;11622:6;11618:30;11671:3;11663:6;11660:15;11657:122;;;11690:79;;:::i;:::-;11657:122;11805:6;11788:220;11822:6;11817:3;11814:15;11788:220;;;11897:3;11926:37;11959:3;11947:10;11926:37;:::i;:::-;11921:3;11914:50;11993:4;11988:3;11984:14;11977:21;;11864:144;11848:4;11843:3;11839:14;11832:21;;11788:220;;;11792:21;11406:608;;11304:710;;;;;:::o;12037:370::-;12108:5;12157:3;12150:4;12142:6;12138:17;12134:27;12124:122;;12165:79;;:::i;:::-;12124:122;12282:6;12269:20;12307:94;12397:3;12389:6;12382:4;12374:6;12370:17;12307:94;:::i;:::-;12298:103;;12114:293;12037:370;;;;:::o;12413:307::-;12474:4;12564:18;12556:6;12553:30;12550:56;;;12586:18;;:::i;:::-;12550:56;12624:29;12646:6;12624:29;:::i;:::-;12616:37;;12708:4;12702;12698:15;12690:23;;12413:307;;;:::o;12726:410::-;12803:5;12828:65;12844:48;12885:6;12844:48;:::i;:::-;12828:65;:::i;:::-;12819:74;;12916:6;12909:5;12902:21;12954:4;12947:5;12943:16;12992:3;12983:6;12978:3;12974:16;12971:25;12968:112;;;12999:79;;:::i;:::-;12968:112;13089:41;13123:6;13118:3;13113;13089:41;:::i;:::-;12809:327;12726:410;;;;;:::o;13155:338::-;13210:5;13259:3;13252:4;13244:6;13240:17;13236:27;13226:122;;13267:79;;:::i;:::-;13226:122;13384:6;13371:20;13409:78;13483:3;13475:6;13468:4;13460:6;13456:17;13409:78;:::i;:::-;13400:87;;13216:277;13155:338;;;;:::o;13499:1509::-;13653:6;13661;13669;13677;13685;13734:3;13722:9;13713:7;13709:23;13705:33;13702:120;;;13741:79;;:::i;:::-;13702:120;13861:1;13886:53;13931:7;13922:6;13911:9;13907:22;13886:53;:::i;:::-;13876:63;;13832:117;13988:2;14014:53;14059:7;14050:6;14039:9;14035:22;14014:53;:::i;:::-;14004:63;;13959:118;14144:2;14133:9;14129:18;14116:32;14175:18;14167:6;14164:30;14161:117;;;14197:79;;:::i;:::-;14161:117;14302:78;14372:7;14363:6;14352:9;14348:22;14302:78;:::i;:::-;14292:88;;14087:303;14457:2;14446:9;14442:18;14429:32;14488:18;14480:6;14477:30;14474:117;;;14510:79;;:::i;:::-;14474:117;14615:78;14685:7;14676:6;14665:9;14661:22;14615:78;:::i;:::-;14605:88;;14400:303;14770:3;14759:9;14755:19;14742:33;14802:18;14794:6;14791:30;14788:117;;;14824:79;;:::i;:::-;14788:117;14929:62;14983:7;14974:6;14963:9;14959:22;14929:62;:::i;:::-;14919:72;;14713:288;13499:1509;;;;;;;;:::o;15014:619::-;15091:6;15099;15107;15156:2;15144:9;15135:7;15131:23;15127:32;15124:119;;;15162:79;;:::i;:::-;15124:119;15282:1;15307:53;15352:7;15343:6;15332:9;15328:22;15307:53;:::i;:::-;15297:63;;15253:117;15409:2;15435:53;15480:7;15471:6;15460:9;15456:22;15435:53;:::i;:::-;15425:63;;15380:118;15537:2;15563:53;15608:7;15599:6;15588:9;15584:22;15563:53;:::i;:::-;15553:63;;15508:118;15014:619;;;;;:::o;15639:60::-;15667:3;15688:5;15681:12;;15639:60;;;:::o;15705:142::-;15755:9;15788:53;15806:34;15815:24;15833:5;15815:24;:::i;:::-;15806:34;:::i;:::-;15788:53;:::i;:::-;15775:66;;15705:142;;;:::o;15853:126::-;15903:9;15936:37;15967:5;15936:37;:::i;:::-;15923:50;;15853:126;;;:::o;15985:157::-;16066:9;16099:37;16130:5;16099:37;:::i;:::-;16086:50;;15985:157;;;:::o;16148:193::-;16266:68;16328:5;16266:68;:::i;:::-;16261:3;16254:81;16148:193;;:::o;16347:284::-;16471:4;16509:2;16498:9;16494:18;16486:26;;16522:102;16621:1;16610:9;16606:17;16597:6;16522:102;:::i;:::-;16347:284;;;;:::o;16637:311::-;16714:4;16804:18;16796:6;16793:30;16790:56;;;16826:18;;:::i;:::-;16790:56;16876:4;16868:6;16864:17;16856:25;;16936:4;16930;16926:15;16918:23;;16637:311;;;:::o;16971:710::-;17067:5;17092:81;17108:64;17165:6;17108:64;:::i;:::-;17092:81;:::i;:::-;17083:90;;17193:5;17222:6;17215:5;17208:21;17256:4;17249:5;17245:16;17238:23;;17309:4;17301:6;17297:17;17289:6;17285:30;17338:3;17330:6;17327:15;17324:122;;;17357:79;;:::i;:::-;17324:122;17472:6;17455:220;17489:6;17484:3;17481:15;17455:220;;;17564:3;17593:37;17626:3;17614:10;17593:37;:::i;:::-;17588:3;17581:50;17660:4;17655:3;17651:14;17644:21;;17531:144;17515:4;17510:3;17506:14;17499:21;;17455:220;;;17459:21;17073:608;;16971:710;;;;;:::o;17704:370::-;17775:5;17824:3;17817:4;17809:6;17805:17;17801:27;17791:122;;17832:79;;:::i;:::-;17791:122;17949:6;17936:20;17974:94;18064:3;18056:6;18049:4;18041:6;18037:17;17974:94;:::i;:::-;17965:103;;17781:293;17704:370;;;;:::o;18080:894::-;18198:6;18206;18255:2;18243:9;18234:7;18230:23;18226:32;18223:119;;;18261:79;;:::i;:::-;18223:119;18409:1;18398:9;18394:17;18381:31;18439:18;18431:6;18428:30;18425:117;;;18461:79;;:::i;:::-;18425:117;18566:78;18636:7;18627:6;18616:9;18612:22;18566:78;:::i;:::-;18556:88;;18352:302;18721:2;18710:9;18706:18;18693:32;18752:18;18744:6;18741:30;18738:117;;;18774:79;;:::i;:::-;18738:117;18879:78;18949:7;18940:6;18929:9;18925:22;18879:78;:::i;:::-;18869:88;;18664:303;18080:894;;;;;:::o;18980:114::-;19047:6;19081:5;19075:12;19065:22;;18980:114;;;:::o;19100:184::-;19199:11;19233:6;19228:3;19221:19;19273:4;19268:3;19264:14;19249:29;;19100:184;;;;:::o;19290:132::-;19357:4;19380:3;19372:11;;19410:4;19405:3;19401:14;19393:22;;19290:132;;;:::o;19428:108::-;19505:24;19523:5;19505:24;:::i;:::-;19500:3;19493:37;19428:108;;:::o;19542:179::-;19611:10;19632:46;19674:3;19666:6;19632:46;:::i;:::-;19710:4;19705:3;19701:14;19687:28;;19542:179;;;;:::o;19727:113::-;19797:4;19829;19824:3;19820:14;19812:22;;19727:113;;;:::o;19876:732::-;19995:3;20024:54;20072:5;20024:54;:::i;:::-;20094:86;20173:6;20168:3;20094:86;:::i;:::-;20087:93;;20204:56;20254:5;20204:56;:::i;:::-;20283:7;20314:1;20299:284;20324:6;20321:1;20318:13;20299:284;;;20400:6;20394:13;20427:63;20486:3;20471:13;20427:63;:::i;:::-;20420:70;;20513:60;20566:6;20513:60;:::i;:::-;20503:70;;20359:224;20346:1;20343;20339:9;20334:14;;20299:284;;;20303:14;20599:3;20592:10;;20000:608;;;19876:732;;;;:::o;20614:373::-;20757:4;20795:2;20784:9;20780:18;20772:26;;20844:9;20838:4;20834:20;20830:1;20819:9;20815:17;20808:47;20872:108;20975:4;20966:6;20872:108;:::i;:::-;20864:116;;20614:373;;;;:::o;20993:222::-;21086:4;21124:2;21113:9;21109:18;21101:26;;21137:71;21205:1;21194:9;21190:17;21181:6;21137:71;:::i;:::-;20993:222;;;;:::o;21221:468::-;21286:6;21294;21343:2;21331:9;21322:7;21318:23;21314:32;21311:119;;;21349:79;;:::i;:::-;21311:119;21469:1;21494:53;21539:7;21530:6;21519:9;21515:22;21494:53;:::i;:::-;21484:63;;21440:117;21596:2;21622:50;21664:7;21655:6;21644:9;21640:22;21622:50;:::i;:::-;21612:60;;21567:115;21221:468;;;;;:::o;21695:109::-;21731:7;21771:26;21764:5;21760:38;21749:49;;21695:109;;;:::o;21810:115::-;21895:23;21912:5;21895:23;:::i;:::-;21890:3;21883:36;21810:115;;:::o;21931:218::-;22022:4;22060:2;22049:9;22045:18;22037:26;;22073:69;22139:1;22128:9;22124:17;22115:6;22073:69;:::i;:::-;21931:218;;;;:::o;22155:474::-;22223:6;22231;22280:2;22268:9;22259:7;22255:23;22251:32;22248:119;;;22286:79;;:::i;:::-;22248:119;22406:1;22431:53;22476:7;22467:6;22456:9;22452:22;22431:53;:::i;:::-;22421:63;;22377:117;22533:2;22559:53;22604:7;22595:6;22584:9;22580:22;22559:53;:::i;:::-;22549:63;;22504:118;22155:474;;;;;:::o;22635:1089::-;22739:6;22747;22755;22763;22771;22820:3;22808:9;22799:7;22795:23;22791:33;22788:120;;;22827:79;;:::i;:::-;22788:120;22947:1;22972:53;23017:7;23008:6;22997:9;22993:22;22972:53;:::i;:::-;22962:63;;22918:117;23074:2;23100:53;23145:7;23136:6;23125:9;23121:22;23100:53;:::i;:::-;23090:63;;23045:118;23202:2;23228:53;23273:7;23264:6;23253:9;23249:22;23228:53;:::i;:::-;23218:63;;23173:118;23330:2;23356:53;23401:7;23392:6;23381:9;23377:22;23356:53;:::i;:::-;23346:63;;23301:118;23486:3;23475:9;23471:19;23458:33;23518:18;23510:6;23507:30;23504:117;;;23540:79;;:::i;:::-;23504:117;23645:62;23699:7;23690:6;23679:9;23675:22;23645:62;:::i;:::-;23635:72;;23429:288;22635:1089;;;;;;;;:::o;23730:329::-;23789:6;23838:2;23826:9;23817:7;23813:23;23809:32;23806:119;;;23844:79;;:::i;:::-;23806:119;23964:1;23989:53;24034:7;24025:6;24014:9;24010:22;23989:53;:::i;:::-;23979:63;;23935:117;23730:329;;;;:::o;24065:229::-;24205:34;24201:1;24193:6;24189:14;24182:58;24274:12;24269:2;24261:6;24257:15;24250:37;24065:229;:::o;24300:366::-;24442:3;24463:67;24527:2;24522:3;24463:67;:::i;:::-;24456:74;;24539:93;24628:3;24539:93;:::i;:::-;24657:2;24652:3;24648:12;24641:19;;24300:366;;;:::o;24672:419::-;24838:4;24876:2;24865:9;24861:18;24853:26;;24925:9;24919:4;24915:20;24911:1;24900:9;24896:17;24889:47;24953:131;25079:4;24953:131;:::i;:::-;24945:139;;24672:419;;;:::o;25097:180::-;25145:77;25142:1;25135:88;25242:4;25239:1;25232:15;25266:4;25263:1;25256:15;25283:320;25327:6;25364:1;25358:4;25354:12;25344:22;;25411:1;25405:4;25401:12;25432:18;25422:81;;25488:4;25480:6;25476:17;25466:27;;25422:81;25550:2;25542:6;25539:14;25519:18;25516:38;25513:84;;25569:18;;:::i;:::-;25513:84;25334:269;25283:320;;;:::o;25609:148::-;25711:11;25748:3;25733:18;;25609:148;;;;:::o;25763:377::-;25869:3;25897:39;25930:5;25897:39;:::i;:::-;25952:89;26034:6;26029:3;25952:89;:::i;:::-;25945:96;;26050:52;26095:6;26090:3;26083:4;26076:5;26072:16;26050:52;:::i;:::-;26127:6;26122:3;26118:16;26111:23;;25873:267;25763:377;;;;:::o;26146:275::-;26278:3;26300:95;26391:3;26382:6;26300:95;:::i;:::-;26293:102;;26412:3;26405:10;;26146:275;;;;:::o;26427:180::-;26475:77;26472:1;26465:88;26572:4;26569:1;26562:15;26596:4;26593:1;26586:15;26613:348;26653:7;26676:20;26694:1;26676:20;:::i;:::-;26671:25;;26710:20;26728:1;26710:20;:::i;:::-;26705:25;;26898:1;26830:66;26826:74;26823:1;26820:81;26815:1;26808:9;26801:17;26797:105;26794:131;;;26905:18;;:::i;:::-;26794:131;26953:1;26950;26946:9;26935:20;;26613:348;;;;:::o;26967:180::-;27015:77;27012:1;27005:88;27112:4;27109:1;27102:15;27136:4;27133:1;27126:15;27153:185;27193:1;27210:20;27228:1;27210:20;:::i;:::-;27205:25;;27244:20;27262:1;27244:20;:::i;:::-;27239:25;;27283:1;27273:35;;27288:18;;:::i;:::-;27273:35;27330:1;27327;27323:9;27318:14;;27153:185;;;;:::o;27344:332::-;27465:4;27503:2;27492:9;27488:18;27480:26;;27516:71;27584:1;27573:9;27569:17;27560:6;27516:71;:::i;:::-;27597:72;27665:2;27654:9;27650:18;27641:6;27597:72;:::i;:::-;27344:332;;;;;:::o;27682:137::-;27736:5;27767:6;27761:13;27752:22;;27783:30;27807:5;27783:30;:::i;:::-;27682:137;;;;:::o;27825:345::-;27892:6;27941:2;27929:9;27920:7;27916:23;27912:32;27909:119;;;27947:79;;:::i;:::-;27909:119;28067:1;28092:61;28145:7;28136:6;28125:9;28121:22;28092:61;:::i;:::-;28082:71;;28038:125;27825:345;;;;:::o;28176:220::-;28316:34;28312:1;28304:6;28300:14;28293:58;28385:3;28380:2;28372:6;28368:15;28361:28;28176:220;:::o;28402:366::-;28544:3;28565:67;28629:2;28624:3;28565:67;:::i;:::-;28558:74;;28641:93;28730:3;28641:93;:::i;:::-;28759:2;28754:3;28750:12;28743:19;;28402:366;;;:::o;28774:419::-;28940:4;28978:2;28967:9;28963:18;28955:26;;29027:9;29021:4;29017:20;29013:1;29002:9;28998:17;28991:47;29055:131;29181:4;29055:131;:::i;:::-;29047:139;;28774:419;;;:::o;29199:182::-;29339:34;29335:1;29327:6;29323:14;29316:58;29199:182;:::o;29387:366::-;29529:3;29550:67;29614:2;29609:3;29550:67;:::i;:::-;29543:74;;29626:93;29715:3;29626:93;:::i;:::-;29744:2;29739:3;29735:12;29728:19;;29387:366;;;:::o;29759:419::-;29925:4;29963:2;29952:9;29948:18;29940:26;;30012:9;30006:4;30002:20;29998:1;29987:9;29983:17;29976:47;30040:131;30166:4;30040:131;:::i;:::-;30032:139;;29759:419;;;:::o;30184:228::-;30324:34;30320:1;30312:6;30308:14;30301:58;30393:11;30388:2;30380:6;30376:15;30369:36;30184:228;:::o;30418:366::-;30560:3;30581:67;30645:2;30640:3;30581:67;:::i;:::-;30574:74;;30657:93;30746:3;30657:93;:::i;:::-;30775:2;30770:3;30766:12;30759:19;;30418:366;;;:::o;30790:419::-;30956:4;30994:2;30983:9;30979:18;30971:26;;31043:9;31037:4;31033:20;31029:1;31018:9;31014:17;31007:47;31071:131;31197:4;31071:131;:::i;:::-;31063:139;;30790:419;;;:::o;31215:180::-;31263:77;31260:1;31253:88;31360:4;31357:1;31350:15;31384:4;31381:1;31374:15;31401:233;31440:3;31463:24;31481:5;31463:24;:::i;:::-;31454:33;;31509:66;31502:5;31499:77;31496:103;;31579:18;;:::i;:::-;31496:103;31626:1;31619:5;31615:13;31608:20;;31401:233;;;:::o;31640:225::-;31780:34;31776:1;31768:6;31764:14;31757:58;31849:8;31844:2;31836:6;31832:15;31825:33;31640:225;:::o;31871:366::-;32013:3;32034:67;32098:2;32093:3;32034:67;:::i;:::-;32027:74;;32110:93;32199:3;32110:93;:::i;:::-;32228:2;32223:3;32219:12;32212:19;;31871:366;;;:::o;32243:419::-;32409:4;32447:2;32436:9;32432:18;32424:26;;32496:9;32490:4;32486:20;32482:1;32471:9;32467:17;32460:47;32524:131;32650:4;32524:131;:::i;:::-;32516:139;;32243:419;;;:::o;32668:182::-;32808:34;32804:1;32796:6;32792:14;32785:58;32668:182;:::o;32856:366::-;32998:3;33019:67;33083:2;33078:3;33019:67;:::i;:::-;33012:74;;33095:93;33184:3;33095:93;:::i;:::-;33213:2;33208:3;33204:12;33197:19;;32856:366;;;:::o;33228:419::-;33394:4;33432:2;33421:9;33417:18;33409:26;;33481:9;33475:4;33471:20;33467:1;33456:9;33452:17;33445:47;33509:131;33635:4;33509:131;:::i;:::-;33501:139;;33228:419;;;:::o;33653:234::-;33793:34;33789:1;33781:6;33777:14;33770:58;33862:17;33857:2;33849:6;33845:15;33838:42;33653:234;:::o;33893:366::-;34035:3;34056:67;34120:2;34115:3;34056:67;:::i;:::-;34049:74;;34132:93;34221:3;34132:93;:::i;:::-;34250:2;34245:3;34241:12;34234:19;;33893:366;;;:::o;34265:419::-;34431:4;34469:2;34458:9;34454:18;34446:26;;34518:9;34512:4;34508:20;34504:1;34493:9;34489:17;34482:47;34546:131;34672:4;34546:131;:::i;:::-;34538:139;;34265:419;;;:::o;34690:305::-;34730:3;34749:20;34767:1;34749:20;:::i;:::-;34744:25;;34783:20;34801:1;34783:20;:::i;:::-;34778:25;;34937:1;34869:66;34865:74;34862:1;34859:81;34856:107;;;34943:18;;:::i;:::-;34856:107;34987:1;34984;34980:9;34973:16;;34690:305;;;;:::o;35001:332::-;35122:4;35160:2;35149:9;35145:18;35137:26;;35173:71;35241:1;35230:9;35226:17;35217:6;35173:71;:::i;:::-;35254:72;35322:2;35311:9;35307:18;35298:6;35254:72;:::i;:::-;35001:332;;;;;:::o;35339:222::-;35479:34;35475:1;35467:6;35463:14;35456:58;35548:5;35543:2;35535:6;35531:15;35524:30;35339:222;:::o;35567:366::-;35709:3;35730:67;35794:2;35789:3;35730:67;:::i;:::-;35723:74;;35806:93;35895:3;35806:93;:::i;:::-;35924:2;35919:3;35915:12;35908:19;;35567:366;;;:::o;35939:419::-;36105:4;36143:2;36132:9;36128:18;36120:26;;36192:9;36186:4;36182:20;36178:1;36167:9;36163:17;36156:47;36220:131;36346:4;36220:131;:::i;:::-;36212:139;;35939:419;;;:::o;36364:223::-;36504:34;36500:1;36492:6;36488:14;36481:58;36573:6;36568:2;36560:6;36556:15;36549:31;36364:223;:::o;36593:366::-;36735:3;36756:67;36820:2;36815:3;36756:67;:::i;:::-;36749:74;;36832:93;36921:3;36832:93;:::i;:::-;36950:2;36945:3;36941:12;36934:19;;36593:366;;;:::o;36965:419::-;37131:4;37169:2;37158:9;37154:18;37146:26;;37218:9;37212:4;37208:20;37204:1;37193:9;37189:17;37182:47;37246:131;37372:4;37246:131;:::i;:::-;37238:139;;36965:419;;;:::o;37390:227::-;37530:34;37526:1;37518:6;37514:14;37507:58;37599:10;37594:2;37586:6;37582:15;37575:35;37390:227;:::o;37623:366::-;37765:3;37786:67;37850:2;37845:3;37786:67;:::i;:::-;37779:74;;37862:93;37951:3;37862:93;:::i;:::-;37980:2;37975:3;37971:12;37964:19;;37623:366;;;:::o;37995:419::-;38161:4;38199:2;38188:9;38184:18;38176:26;;38248:9;38242:4;38238:20;38234:1;38223:9;38219:17;38212:47;38276:131;38402:4;38276:131;:::i;:::-;38268:139;;37995:419;;;:::o;38420:224::-;38560:34;38556:1;38548:6;38544:14;38537:58;38629:7;38624:2;38616:6;38612:15;38605:32;38420:224;:::o;38650:366::-;38792:3;38813:67;38877:2;38872:3;38813:67;:::i;:::-;38806:74;;38889:93;38978:3;38889:93;:::i;:::-;39007:2;39002:3;38998:12;38991:19;;38650:366;;;:::o;39022:419::-;39188:4;39226:2;39215:9;39211:18;39203:26;;39275:9;39269:4;39265:20;39261:1;39250:9;39246:17;39239:47;39303:131;39429:4;39303:131;:::i;:::-;39295:139;;39022:419;;;:::o;39447:229::-;39587:34;39583:1;39575:6;39571:14;39564:58;39656:12;39651:2;39643:6;39639:15;39632:37;39447:229;:::o;39682:366::-;39824:3;39845:67;39909:2;39904:3;39845:67;:::i;:::-;39838:74;;39921:93;40010:3;39921:93;:::i;:::-;40039:2;40034:3;40030:12;40023:19;;39682:366;;;:::o;40054:419::-;40220:4;40258:2;40247:9;40243:18;40235:26;;40307:9;40301:4;40297:20;40293:1;40282:9;40278:17;40271:47;40335:131;40461:4;40335:131;:::i;:::-;40327:139;;40054:419;;;:::o;40479:634::-;40700:4;40738:2;40727:9;40723:18;40715:26;;40787:9;40781:4;40777:20;40773:1;40762:9;40758:17;40751:47;40815:108;40918:4;40909:6;40815:108;:::i;:::-;40807:116;;40970:9;40964:4;40960:20;40955:2;40944:9;40940:18;40933:48;40998:108;41101:4;41092:6;40998:108;:::i;:::-;40990:116;;40479:634;;;;;:::o;41119:98::-;41170:6;41204:5;41198:12;41188:22;;41119:98;;;:::o;41223:168::-;41306:11;41340:6;41335:3;41328:19;41380:4;41375:3;41371:14;41356:29;;41223:168;;;;:::o;41397:360::-;41483:3;41511:38;41543:5;41511:38;:::i;:::-;41565:70;41628:6;41623:3;41565:70;:::i;:::-;41558:77;;41644:52;41689:6;41684:3;41677:4;41670:5;41666:16;41644:52;:::i;:::-;41721:29;41743:6;41721:29;:::i;:::-;41716:3;41712:39;41705:46;;41487:270;41397:360;;;;:::o;41763:751::-;41986:4;42024:3;42013:9;42009:19;42001:27;;42038:71;42106:1;42095:9;42091:17;42082:6;42038:71;:::i;:::-;42119:72;42187:2;42176:9;42172:18;42163:6;42119:72;:::i;:::-;42201;42269:2;42258:9;42254:18;42245:6;42201:72;:::i;:::-;42283;42351:2;42340:9;42336:18;42327:6;42283:72;:::i;:::-;42403:9;42397:4;42393:20;42387:3;42376:9;42372:19;42365:49;42431:76;42502:4;42493:6;42431:76;:::i;:::-;42423:84;;41763:751;;;;;;;;:::o;42520:141::-;42576:5;42607:6;42601:13;42592:22;;42623:32;42649:5;42623:32;:::i;:::-;42520:141;;;;:::o;42667:349::-;42736:6;42785:2;42773:9;42764:7;42760:23;42756:32;42753:119;;;42791:79;;:::i;:::-;42753:119;42911:1;42936:63;42991:7;42982:6;42971:9;42967:22;42936:63;:::i;:::-;42926:73;;42882:127;42667:349;;;;:::o;43022:106::-;43066:8;43115:5;43110:3;43106:15;43085:36;;43022:106;;;:::o;43134:183::-;43169:3;43207:1;43189:16;43186:23;43183:128;;;43245:1;43242;43239;43224:23;43267:34;43298:1;43292:8;43267:34;:::i;:::-;43260:41;;43183:128;43134:183;:::o;43323:711::-;43362:3;43400:4;43382:16;43379:26;43408:5;43376:39;43437:20;;:::i;:::-;43512:1;43494:16;43490:24;43487:1;43481:4;43466:49;43545:4;43539:11;43644:16;43637:4;43629:6;43625:17;43622:39;43589:18;43581:6;43578:30;43562:113;43559:146;;;43690:5;;;;43559:146;43736:6;43730:4;43726:17;43772:3;43766:10;43799:18;43791:6;43788:30;43785:43;;;43821:5;;;;;;43785:43;43869:6;43862:4;43857:3;43853:14;43849:27;43928:1;43910:16;43906:24;43900:4;43896:35;43891:3;43888:44;43885:57;;;43935:5;;;;;;;43885:57;43952;44000:6;43994:4;43990:17;43982:6;43978:30;43972:4;43952:57;:::i;:::-;44025:3;44018:10;;43366:668;;;;;43323:711;;:::o;44040:239::-;44180:34;44176:1;44168:6;44164:14;44157:58;44249:22;44244:2;44236:6;44232:15;44225:47;44040:239;:::o;44285:366::-;44427:3;44448:67;44512:2;44507:3;44448:67;:::i;:::-;44441:74;;44524:93;44613:3;44524:93;:::i;:::-;44642:2;44637:3;44633:12;44626:19;;44285:366;;;:::o;44657:419::-;44823:4;44861:2;44850:9;44846:18;44838:26;;44910:9;44904:4;44900:20;44896:1;44885:9;44881:17;44874:47;44938:131;45064:4;44938:131;:::i;:::-;44930:139;;44657:419;;;:::o;45082:227::-;45222:34;45218:1;45210:6;45206:14;45199:58;45291:10;45286:2;45278:6;45274:15;45267:35;45082:227;:::o;45315:366::-;45457:3;45478:67;45542:2;45537:3;45478:67;:::i;:::-;45471:74;;45554:93;45643:3;45554:93;:::i;:::-;45672:2;45667:3;45663:12;45656:19;;45315:366;;;:::o;45687:419::-;45853:4;45891:2;45880:9;45876:18;45868:26;;45940:9;45934:4;45930:20;45926:1;45915:9;45911:17;45904:47;45968:131;46094:4;45968:131;:::i;:::-;45960:139;;45687:419;;;:::o;46112:228::-;46252:34;46248:1;46240:6;46236:14;46229:58;46321:11;46316:2;46308:6;46304:15;46297:36;46112:228;:::o;46346:366::-;46488:3;46509:67;46573:2;46568:3;46509:67;:::i;:::-;46502:74;;46585:93;46674:3;46585:93;:::i;:::-;46703:2;46698:3;46694:12;46687:19;;46346:366;;;:::o;46718:419::-;46884:4;46922:2;46911:9;46907:18;46899:26;;46971:9;46965:4;46961:20;46957:1;46946:9;46942:17;46935:47;46999:131;47125:4;46999:131;:::i;:::-;46991:139;;46718:419;;;:::o;47143:1053::-;47466:4;47504:3;47493:9;47489:19;47481:27;;47518:71;47586:1;47575:9;47571:17;47562:6;47518:71;:::i;:::-;47599:72;47667:2;47656:9;47652:18;47643:6;47599:72;:::i;:::-;47718:9;47712:4;47708:20;47703:2;47692:9;47688:18;47681:48;47746:108;47849:4;47840:6;47746:108;:::i;:::-;47738:116;;47901:9;47895:4;47891:20;47886:2;47875:9;47871:18;47864:48;47929:108;48032:4;48023:6;47929:108;:::i;:::-;47921:116;;48085:9;48079:4;48075:20;48069:3;48058:9;48054:19;48047:49;48113:76;48184:4;48175:6;48113:76;:::i;:::-;48105:84;;47143:1053;;;;;;;;:::o

Swarm Source

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