ETH Price: $3,356.67 (-0.95%)

Token

Digits Agents (DA)
 

Overview

Max Total Supply

9,999 DA

Holders

3,258

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 DA
0x303af56890f4296b29189650027dea2715313168
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

- 9999 supply - Get access to DigitsEcosystem - Access FCFS round on DigitsPad (decentralized VC / launchpad) - Access to DigitsMarketplace (whitelist & NFT marketplace) - Access to DigitClub private community on Discord. - Get a 10 weeks free airdrop of Digits Coins.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DigitsAgents

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-05
*/

// SPDX-License-Identifier: MIT
pragma solidity 0.8.9;

/// @title Digits Agents
/// @author André Costa @ DigitsBrands


// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


// OpenZeppelin Contracts v4.4.0 (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 v4.4.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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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


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

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

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

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

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

interface IDigitsRedeemer {
    /**
     * @dev Returns if the `tokenId` has been staked and therefore blocking transfers.
     */
    function isStaked(uint tokenId) external view returns (bool);
}


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

pragma solidity ^0.8.9;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.9;

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Does not support burning tokens to address(0).
 *
 * Assumes that an owner cannot have more than the 2**128 - 1 (max value of uint128) of supply
 */
contract ERC721A is Ownable, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

    //connects to the redeemer contract
    IDigitsRedeemer public DigitsRedeemer;

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

    /**
        To set the address of the digits redeemer contract
     */
    function setDigitsRedeemer(address newRedeemer) public onlyOwner {
        DigitsRedeemer = IDigitsRedeemer(newRedeemer);
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        require(index < balanceOf(owner), 'ERC721A: owner index out of bounds');
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        revert('ERC721A: unable to get token of owner by index');
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        require(!DigitsRedeemer.isStaked(tokenId), "Token is Staked!");
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                if (_exists(nextTokenId)) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

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

contract DigitsAgents is ERC721A, ReentrancyGuard {
    using Strings for uint256;

    //NOTE Token values incremented for gas efficiency
    uint256 private maxSalePlusOne = 10000;

    uint public mintAllowancePlusOne = 4;

    enum ContractState {
        OFF,
        PRESALE,
        PUBLIC
    }
    ContractState public contractState;

    string public placeholderURI;
    string public baseURI;

    address public recipient;

    //sigmer address that we use to sign the mint transaction to make sure it is valid
    address private signer = 0x80E4929c869102140E69550BBECC20bEd61B080c;

    constructor() ERC721A("Digits Agents", "DA") {
        placeholderURI = "ipfs://QmfZY5nzyyFubPPXSdb8RBsxV66ZrN8CrdTW89r1jvxE9T";
    
    }

    //
    // Modifiers
    //

    /**
     * Do not allow calls from other contracts.
     */
    modifier noBots() {
        require(msg.sender == tx.origin, "No bots!");
        _;
    }

    /**
     * Ensure current state is correct for this method.
     */
    modifier isContractState(ContractState contractState_) {
        require(contractState == contractState_, "Invalid state");
        _;
    }

    /**
     * Ensure amount of tokens to mint is within the limit.
     */
    modifier withinMintLimit(uint256 quantity) {
        require((totalSupply() + quantity) < maxSalePlusOne, "Exceeds available tokens");
        _;
    }

    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return signer == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }

    //
    // Mint
    //

    /**
     * Public mint.
     * @param quantity Amount of tokens to mint.
     */
    function mintPublic(uint256 quantity)
        external
        payable
        noBots
        isContractState(ContractState.PUBLIC)
        withinMintLimit(quantity)
    {
        require(_numberMinted(msg.sender) + quantity < mintAllowancePlusOne, "Maximum number of NFTs allowed to Mint reached!");
        _safeMint(msg.sender, quantity);
    }

    /**
     * Mint tokens during the presale.
     * @notice This function is only available to those on the allowlist.
     * @param quantity The number of tokens to mint.
     */
    function mintPresale(uint256 quantity, uint8 _v, bytes32 _r, bytes32 _s)
        external
        payable
        noBots
        isContractState(ContractState.PRESALE)
        withinMintLimit(quantity)
        onlyValidAccess(_v,  _r, _s)
    {
        require(_numberMinted(msg.sender) + quantity < mintAllowancePlusOne, "Maximum number of NFTs allowed to Mint reached!");
        _safeMint(msg.sender, quantity);
    }

    /**
     * Team reserved mint.
     * @param to Address to mint to.
     * @param quantity Amount of tokens to mint.
     */
    function mintReserved(address to, uint256 quantity) external onlyOwner withinMintLimit(quantity) {
        _safeMint(to, quantity);
    }

    //
    // Admin
    //

    /**
     * Set contract state.
     * @param contractState_ The new state of the contract.
     */
    function setContractState(uint contractState_) external onlyOwner {
        require(contractState_ < 3, "Invalid Contract State!");
        if (contractState_ == 0) {
            contractState = ContractState.OFF;
        }
        else if (contractState_ == 1) {
            contractState = ContractState.PRESALE;
        }
        else {
            contractState = ContractState.PUBLIC;
        }
        
    }

    //set signer public address
    function setSigner(address newSigner) external onlyOwner {
        signer = newSigner;
    }

    /**
     * Update maximum number of tokens for sale.
     * @param maxSale The maximum number of tokens available for sale.
     */
    function setMaxSale(uint256 maxSale) external onlyOwner {
        uint256 maxSalePlusOne_ = maxSale + 1;
        require(maxSalePlusOne_ < maxSalePlusOne, "Can only reduce supply");
        maxSalePlusOne = maxSalePlusOne_;
    }

    /**
     * Sets base URI.
     * @param baseURI_ The base URI
     */
    function setBaseURI(string memory baseURI_) external onlyOwner {
        baseURI = baseURI_;
    }

    /**
     * Sets placeholder URI.
     * @param placeholderURI_ The placeholder URI
     */
    function setPlaceholderURI(string memory placeholderURI_) external onlyOwner {
        placeholderURI = placeholderURI_;
    }

    /**
     * Update wallet that will recieve funds.
     * @param newRecipient The new address that will recieve funds
     */
    function setRecipient(address newRecipient) external onlyOwner {
        require(newRecipient != address(0), "Cannot be the 0 address!");
        recipient = newRecipient;
    }

    /**
     * Sets mint allowance.
     * @param newAllowance the new allowance
     */
    function setMintAllowance(uint newAllowance) external onlyOwner {
        mintAllowancePlusOne = newAllowance + 1;
    }


    //retrieve all funds recieved from minting
    function withdraw() public onlyOwner {
        uint256 balance = accountBalance();
        require(balance > 0, 'No Funds to withdraw, Balance is 0');

        _withdraw(payable(recipient), balance); 
    }
    
    //send the percentage of funds to a shareholder´s wallet
    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }

    //
    // Views
    //

    /**
     * The block.timestamp when this token was transferred to the current owner.
     * @param tokenId The token id to query
     */
    function ownedSince(uint256 tokenId) public view returns (uint256) {
        return _ownerships[tokenId].startTimestamp;
    }

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

        return
            bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString(), ".json")) : placeholderURI;
    }
    /**
     * Get the current amount of Eth stored
     */
    function accountBalance() public view returns(uint) {
        return address(this).balance;
    }

    /**
     * See how many mints an address has executed in one of the sales
     * @param minter the address of the person that
     */
    function getMintsPerAddress(address minter) public view returns(uint) {
        return _numberMinted(minter);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DigitsRedeemer","outputs":[{"internalType":"contract IDigitsRedeemer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractState","outputs":[{"internalType":"enum DigitsAgents.ContractState","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"getMintsPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAllowancePlusOne","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"mintPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mintReserved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownedSince","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"placeholderURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"contractState_","type":"uint256"}],"name":"setContractState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRedeemer","type":"address"}],"name":"setDigitsRedeemer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"maxSale","type":"uint256"}],"name":"setMaxSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newAllowance","type":"uint256"}],"name":"setMintAllowance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"placeholderURI_","type":"string"}],"name":"setPlaceholderURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newRecipient","type":"address"}],"name":"setRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSigner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600a556004600b557380e4929c869102140e69550bbecc20bed61b080c601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007157600080fd5b506040518060400160405280600d81526020017f446967697473204167656e7473000000000000000000000000000000000000008152506040518060400160405280600281526020017f4441000000000000000000000000000000000000000000000000000000000000815250620000fe620000f26200017260201b60201c565b6200017a60201b60201c565b8160029080519060200190620001169291906200023e565b5080600390805190602001906200012f9291906200023e565b505050600160098190555060405180606001604052806035815260200162005b1160359139600d90805190602001906200016b9291906200023e565b5062000353565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200024c906200031d565b90600052602060002090601f016020900481019282620002705760008555620002bc565b82601f106200028b57805160ff1916838001178555620002bc565b82800160010185558215620002bc579182015b82811115620002bb5782518255916020019190600101906200029e565b5b509050620002cb9190620002cf565b5090565b5b80821115620002ea576000816000905550600101620002d0565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033657607f821691505b602082108114156200034d576200034c620002ee565b5b50919050565b6157ae80620003636000396000f3fe6080604052600436106102465760003560e01c80636c19e78311610139578063acf080d1116100b6578063cf388e9e1161007a578063cf388e9e1461088c578063e985e9c5146108a8578063efd0cbf9146108e5578063f2fde38b14610901578063fae965711461092a578063fb7265ff1461096757610246565b8063acf080d1146107a7578063b0a1c1c4146107d0578063b3912a4c146107fb578063b88d4fde14610826578063c87b56dd1461084f57610246565b806385209ee0116100fd57806385209ee0146106d45780638da5cb5b146106ff57806395d89b411461072a578063a22cb46514610755578063a58b34f81461077e57610246565b80636c19e7831461060357806370a082311461062c578063715018a6146106695780637313cba9146106805780637de55fe1146106ab57610246565b80633574a2dd116101c757806355f804b31161018b57806355f804b31461050a5780635a485599146105335780636352211e1461057057806366d003ac146105ad5780636c0360eb146105d857610246565b80633574a2dd1461043b5780633bbed4a0146104645780633ccfd60b1461048d57806342842e0e146104a45780634f6ccce7146104cd57610246565b80630f5eda9e1161020e5780630f5eda9e1461034257806318160ddd1461036d57806323b872dd146103985780632f745c59146103c157806332624114146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b357806308290dc5146102f0578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138c5565b610990565b60405161027f919061390d565b60405180910390f35b34801561029457600080fd5b5061029d610ada565b6040516102aa91906139c1565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a19565b610b6c565b6040516102e79190613a87565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613a19565b610bf1565b005b34801561032557600080fd5b50610340600480360381019061033b9190613ace565b610ccd565b005b34801561034e57600080fd5b50610357610de6565b6040516103649190613b1d565b60405180910390f35b34801561037957600080fd5b50610382610dec565b60405161038f9190613b1d565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613b38565b610df6565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613ace565b610e06565b6040516103f59190613b1d565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613bfa565b610ff8565b604051610432919061390d565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613d96565b6110f6565b005b34801561047057600080fd5b5061048b60048036038101906104869190613ddf565b61118c565b005b34801561049957600080fd5b506104a26112bc565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613b38565b6113b6565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613a19565b6113d6565b6040516105019190613b1d565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190613d96565b611429565b005b34801561053f57600080fd5b5061055a60048036038101906105559190613a19565b6114bf565b6040516105679190613b1d565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190613a19565b6114fd565b6040516105a49190613a87565b60405180910390f35b3480156105b957600080fd5b506105c2611513565b6040516105cf9190613a87565b60405180910390f35b3480156105e457600080fd5b506105ed611539565b6040516105fa91906139c1565b60405180910390f35b34801561060f57600080fd5b5061062a60048036038101906106259190613ddf565b6115c7565b005b34801561063857600080fd5b50610653600480360381019061064e9190613ddf565b611687565b6040516106609190613b1d565b60405180910390f35b34801561067557600080fd5b5061067e611770565b005b34801561068c57600080fd5b506106956117f8565b6040516106a291906139c1565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190613ace565b611886565b005b3480156106e057600080fd5b506106e9611968565b6040516106f69190613e83565b60405180910390f35b34801561070b57600080fd5b5061071461197b565b6040516107219190613a87565b60405180910390f35b34801561073657600080fd5b5061073f6119a4565b60405161074c91906139c1565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613eca565b611a36565b005b34801561078a57600080fd5b506107a560048036038101906107a09190613ddf565b611bb7565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190613a19565b611c77565b005b3480156107dc57600080fd5b506107e5611d09565b6040516107f29190613b1d565b60405180910390f35b34801561080757600080fd5b50610810611d11565b60405161081d9190613f69565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190614025565b611d37565b005b34801561085b57600080fd5b5061087660048036038101906108719190613a19565b611d93565b60405161088391906139c1565b60405180910390f35b6108a660048036038101906108a191906140a8565b611eba565b005b3480156108b457600080fd5b506108cf60048036038101906108ca919061410f565b6120b0565b6040516108dc919061390d565b60405180910390f35b6108ff60048036038101906108fa9190613a19565b612144565b005b34801561090d57600080fd5b5061092860048036038101906109239190613ddf565b6122e6565b005b34801561093657600080fd5b50610951600480360381019061094c9190613ddf565b6123de565b60405161095e9190613b1d565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190613a19565b6123f0565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad35750610ad282612551565b5b9050919050565b606060028054610ae99061417e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b159061417e565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905090565b6000610b77826125bb565b610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90614222565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610bf96125c9565b73ffffffffffffffffffffffffffffffffffffffff16610c1761197b565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c649061428e565b60405180910390fd5b6000600182610c7c91906142dd565b9050600a548110610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb99061437f565b60405180910390fd5b80600a819055505050565b6000610cd8826114fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090614411565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d686125c9565b73ffffffffffffffffffffffffffffffffffffffff161480610d975750610d9681610d916125c9565b6120b0565b5b610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd906144a3565b60405180910390fd5b610de18383836125d1565b505050565b600b5481565b6000600154905090565b610e01838383612683565b505050565b6000610e1183611687565b8210610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990614535565b60405180910390fd5b6000610e5c610dec565b905060008060005b83811015610fb6576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f5657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fa85786841415610f9f578195505050505050610ff2565b83806001019450505b508080600101915050610e64565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe9906145c7565b60405180910390fd5b92915050565b600080308660405160200161100e92919061462f565b60405160208183030381529060405280519060200120905060018160405160200161103991906146d3565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161106f9493929190614717565b6020604051602081039080840390855afa158015611091573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6110fe6125c9565b73ffffffffffffffffffffffffffffffffffffffff1661111c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111699061428e565b60405180910390fd5b80600d908051906020019061118892919061377c565b5050565b6111946125c9565b73ffffffffffffffffffffffffffffffffffffffff166111b261197b565b73ffffffffffffffffffffffffffffffffffffffff1614611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff9061428e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f906147a8565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112c46125c9565b73ffffffffffffffffffffffffffffffffffffffff166112e261197b565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f9061428e565b60405180910390fd5b6000611342611d09565b905060008111611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e9061483a565b60405180910390fd5b6113b3600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612cae565b50565b6113d183838360405180602001604052806000815250611d37565b505050565b60006113e0610dec565b8210611421576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611418906148cc565b60405180910390fd5b819050919050565b6114316125c9565b73ffffffffffffffffffffffffffffffffffffffff1661144f61197b565b73ffffffffffffffffffffffffffffffffffffffff16146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c9061428e565b60405180910390fd5b80600e90805190602001906114bb92919061377c565b5050565b60006004600083815260200190815260200160002060000160149054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600061150882612d5f565b600001519050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e80546115469061417e565b80601f01602080910402602001604051908101604052809291908181526020018280546115729061417e565b80156115bf5780601f10611594576101008083540402835291602001916115bf565b820191906000526020600020905b8154815290600101906020018083116115a257829003601f168201915b505050505081565b6115cf6125c9565b73ffffffffffffffffffffffffffffffffffffffff166115ed61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a9061428e565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef9061495e565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117786125c9565b73ffffffffffffffffffffffffffffffffffffffff1661179661197b565b73ffffffffffffffffffffffffffffffffffffffff16146117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e39061428e565b60405180910390fd5b6117f66000612ef9565b565b600d80546118059061417e565b80601f01602080910402602001604051908101604052809291908181526020018280546118319061417e565b801561187e5780601f106118535761010080835404028352916020019161187e565b820191906000526020600020905b81548152906001019060200180831161186157829003601f168201915b505050505081565b61188e6125c9565b73ffffffffffffffffffffffffffffffffffffffff166118ac61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f99061428e565b60405180910390fd5b80600a548161190f610dec565b61191991906142dd565b10611959576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611950906149ca565b60405180910390fd5b6119638383612fbd565b505050565b600c60009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546119b39061417e565b80601f01602080910402602001604051908101604052809291908181526020018280546119df9061417e565b8015611a2c5780601f10611a0157610100808354040283529160200191611a2c565b820191906000526020600020905b815481529060010190602001808311611a0f57829003601f168201915b5050505050905090565b611a3e6125c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390614a36565b60405180910390fd5b8060076000611ab96125c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b666125c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bab919061390d565b60405180910390a35050565b611bbf6125c9565b73ffffffffffffffffffffffffffffffffffffffff16611bdd61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a9061428e565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c7f6125c9565b73ffffffffffffffffffffffffffffffffffffffff16611c9d61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea9061428e565b60405180910390fd5b600181611d0091906142dd565b600b8190555050565b600047905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d42848484612683565b611d4e84848484612fdb565b611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8490614ac8565b60405180910390fd5b50505050565b6060611da28261ffff166125bb565b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614b34565b60405180910390fd5b6000600e8054611df09061417e565b905011611e8757600d8054611e049061417e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e309061417e565b8015611e7d5780601f10611e5257610100808354040283529160200191611e7d565b820191906000526020600020905b815481529060010190602001808311611e6057829003601f168201915b5050505050611eb3565b600e611e9283613172565b604051602001611ea3929190614c65565b6040516020818303038152906040525b9050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f90614ce0565b60405180910390fd5b6001806002811115611f3d57611f3c613e0c565b5b600c60009054906101000a900460ff166002811115611f5f57611f5e613e0c565b5b14611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614d4c565b60405180910390fd5b84600a5481611fac610dec565b611fb691906142dd565b10611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed906149ca565b60405180910390fd5b84848461200533848484610ff8565b612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614db8565b60405180910390fd5b600b5489612051336132d3565b61205b91906142dd565b1061209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290614e4a565b60405180910390fd5b6120a5338a612fbd565b505050505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614ce0565b60405180910390fd5b60028060028111156121c7576121c6613e0c565b5b600c60009054906101000a900460ff1660028111156121e9576121e8613e0c565b5b14612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614d4c565b60405180910390fd5b81600a5481612236610dec565b61224091906142dd565b10612280576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612277906149ca565b60405180910390fd5b600b548361228d336132d3565b61229791906142dd565b106122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90614e4a565b60405180910390fd5b6122e13384612fbd565b505050565b6122ee6125c9565b73ffffffffffffffffffffffffffffffffffffffff1661230c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614612362576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123599061428e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614edc565b60405180910390fd5b6123db81612ef9565b50565b60006123e9826132d3565b9050919050565b6123f86125c9565b73ffffffffffffffffffffffffffffffffffffffff1661241661197b565b73ffffffffffffffffffffffffffffffffffffffff161461246c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124639061428e565b60405180910390fd5b600381106124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690614f48565b60405180910390fd5b60008114156124e8576000600c60006101000a81548160ff021916908360028111156124de576124dd613e0c565b5b021790555061254e565b6001811415612521576001600c60006101000a81548160ff0219169083600281111561251757612516613e0c565b5b021790555061254d565b6002600c60006101000a81548160ff0219169083600281111561254757612546613e0c565b5b02179055505b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663baa51f86826040518263ffffffff1660e01b81526004016126de9190613b1d565b60206040518083038186803b1580156126f657600080fd5b505afa15801561270a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272e9190614f7d565b1561276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614ff6565b60405180910390fd5b600061277982612d5f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127a06125c9565b73ffffffffffffffffffffffffffffffffffffffff1614806127fc57506127c56125c9565b73ffffffffffffffffffffffffffffffffffffffff166127e484610b6c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612818575061281782600001516128126125c9565b6120b0565b5b90508061285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285190615088565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c39061511a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906151ac565b60405180910390fd5b61294985858560016133bc565b61295960008484600001516125d1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c3e57612b9d816125bb565b15612c3d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca785858560016133c2565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612cd4906151fd565b60006040518083038185875af1925050503d8060008114612d11576040519150601f19603f3d011682016040523d82523d6000602084013e612d16565b606091505b5050905080612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d519061525e565b60405180910390fd5b505050565b612d67613802565b612d70826125bb565b612daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da6906152f0565b60405180910390fd5b60008290505b60008110612eb8576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea9578092505050612ef4565b50808060019003915050612db5565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eeb90615382565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fd78282604051806020016040528060008152506133c8565b5050565b6000612ffc8473ffffffffffffffffffffffffffffffffffffffff166133da565b15613165578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130256125c9565b8786866040518563ffffffff1660e01b815260040161304794939291906153f7565b602060405180830381600087803b15801561306157600080fd5b505af192505050801561309257506040513d601f19601f8201168201806040525081019061308f9190615458565b60015b613115573d80600081146130c2576040519150601f19603f3d011682016040523d82523d6000602084013e6130c7565b606091505b5060008151141561310d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310490614ac8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061316a565b600190505b949350505050565b606060008214156131ba576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132ce565b600082905060005b600082146131ec5780806131d590615485565b915050600a826131e591906154fd565b91506131c2565b60008167ffffffffffffffff81111561320857613207613c6b565b5b6040519080825280601f01601f19166020018201604052801561323a5781602001600182028036833780820191505090505b5090505b600085146132c757600182613253919061552e565b9150600a856132629190615562565b603061326e91906142dd565b60f81b81838151811061328457613283615593565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132c091906154fd565b945061323e565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333b90615634565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6133d583838360016133fd565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b906156c6565b60405180910390fd5b60008414156134b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134af90615758565b60405180910390fd5b6134c560008683876133bc565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561375f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561374a5761370a6000888488612fdb565b613749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374090614ac8565b60405180910390fd5b5b81806001019250508080600101915050613693565b50806001819055505061377560008683876133c2565b5050505050565b8280546137889061417e565b90600052602060002090601f0160209004810192826137aa57600085556137f1565b82601f106137c357805160ff19168380011785556137f1565b828001600101855582156137f1579182015b828111156137f05782518255916020019190600101906137d5565b5b5090506137fe919061383c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561385557600081600090555060010161383d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138a28161386d565b81146138ad57600080fd5b50565b6000813590506138bf81613899565b92915050565b6000602082840312156138db576138da613863565b5b60006138e9848285016138b0565b91505092915050565b60008115159050919050565b613907816138f2565b82525050565b600060208201905061392260008301846138fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613962578082015181840152602081019050613947565b83811115613971576000848401525b50505050565b6000601f19601f8301169050919050565b600061399382613928565b61399d8185613933565b93506139ad818560208601613944565b6139b681613977565b840191505092915050565b600060208201905081810360008301526139db8184613988565b905092915050565b6000819050919050565b6139f6816139e3565b8114613a0157600080fd5b50565b600081359050613a13816139ed565b92915050565b600060208284031215613a2f57613a2e613863565b5b6000613a3d84828501613a04565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7182613a46565b9050919050565b613a8181613a66565b82525050565b6000602082019050613a9c6000830184613a78565b92915050565b613aab81613a66565b8114613ab657600080fd5b50565b600081359050613ac881613aa2565b92915050565b60008060408385031215613ae557613ae4613863565b5b6000613af385828601613ab9565b9250506020613b0485828601613a04565b9150509250929050565b613b17816139e3565b82525050565b6000602082019050613b326000830184613b0e565b92915050565b600080600060608486031215613b5157613b50613863565b5b6000613b5f86828701613ab9565b9350506020613b7086828701613ab9565b9250506040613b8186828701613a04565b9150509250925092565b600060ff82169050919050565b613ba181613b8b565b8114613bac57600080fd5b50565b600081359050613bbe81613b98565b92915050565b6000819050919050565b613bd781613bc4565b8114613be257600080fd5b50565b600081359050613bf481613bce565b92915050565b60008060008060808587031215613c1457613c13613863565b5b6000613c2287828801613ab9565b9450506020613c3387828801613baf565b9350506040613c4487828801613be5565b9250506060613c5587828801613be5565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ca382613977565b810181811067ffffffffffffffff82111715613cc257613cc1613c6b565b5b80604052505050565b6000613cd5613859565b9050613ce18282613c9a565b919050565b600067ffffffffffffffff821115613d0157613d00613c6b565b5b613d0a82613977565b9050602081019050919050565b82818337600083830152505050565b6000613d39613d3484613ce6565b613ccb565b905082815260208101848484011115613d5557613d54613c66565b5b613d60848285613d17565b509392505050565b600082601f830112613d7d57613d7c613c61565b5b8135613d8d848260208601613d26565b91505092915050565b600060208284031215613dac57613dab613863565b5b600082013567ffffffffffffffff811115613dca57613dc9613868565b5b613dd684828501613d68565b91505092915050565b600060208284031215613df557613df4613863565b5b6000613e0384828501613ab9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613e4c57613e4b613e0c565b5b50565b6000819050613e5d82613e3b565b919050565b6000613e6d82613e4f565b9050919050565b613e7d81613e62565b82525050565b6000602082019050613e986000830184613e74565b92915050565b613ea7816138f2565b8114613eb257600080fd5b50565b600081359050613ec481613e9e565b92915050565b60008060408385031215613ee157613ee0613863565b5b6000613eef85828601613ab9565b9250506020613f0085828601613eb5565b9150509250929050565b6000819050919050565b6000613f2f613f2a613f2584613a46565b613f0a565b613a46565b9050919050565b6000613f4182613f14565b9050919050565b6000613f5382613f36565b9050919050565b613f6381613f48565b82525050565b6000602082019050613f7e6000830184613f5a565b92915050565b600067ffffffffffffffff821115613f9f57613f9e613c6b565b5b613fa882613977565b9050602081019050919050565b6000613fc8613fc384613f84565b613ccb565b905082815260208101848484011115613fe457613fe3613c66565b5b613fef848285613d17565b509392505050565b600082601f83011261400c5761400b613c61565b5b813561401c848260208601613fb5565b91505092915050565b6000806000806080858703121561403f5761403e613863565b5b600061404d87828801613ab9565b945050602061405e87828801613ab9565b935050604061406f87828801613a04565b925050606085013567ffffffffffffffff8111156140905761408f613868565b5b61409c87828801613ff7565b91505092959194509250565b600080600080608085870312156140c2576140c1613863565b5b60006140d087828801613a04565b94505060206140e187828801613baf565b93505060406140f287828801613be5565b925050606061410387828801613be5565b91505092959194509250565b6000806040838503121561412657614125613863565b5b600061413485828601613ab9565b925050602061414585828601613ab9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419657607f821691505b602082108114156141aa576141a961414f565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061420c602d83613933565b9150614217826141b0565b604082019050919050565b6000602082019050818103600083015261423b816141ff565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614278602083613933565b915061428382614242565b602082019050919050565b600060208201905081810360008301526142a78161426b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142e8826139e3565b91506142f3836139e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614328576143276142ae565b5b828201905092915050565b7f43616e206f6e6c792072656475636520737570706c7900000000000000000000600082015250565b6000614369601683613933565b915061437482614333565b602082019050919050565b600060208201905081810360008301526143988161435c565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143fb602283613933565b91506144068261439f565b604082019050919050565b6000602082019050818103600083015261442a816143ee565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061448d603983613933565b915061449882614431565b604082019050919050565b600060208201905081810360008301526144bc81614480565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061451f602283613933565b915061452a826144c3565b604082019050919050565b6000602082019050818103600083015261454e81614512565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006145b1602e83613933565b91506145bc82614555565b604082019050919050565b600060208201905081810360008301526145e0816145a4565b9050919050565b60008160601b9050919050565b60006145ff826145e7565b9050919050565b6000614611826145f4565b9050919050565b61462961462482613a66565b614606565b82525050565b600061463b8285614618565b60148201915061464b8284614618565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061469c601c8361465b565b91506146a782614666565b601c82019050919050565b6000819050919050565b6146cd6146c882613bc4565b6146b2565b82525050565b60006146de8261468f565b91506146ea82846146bc565b60208201915081905092915050565b61470281613bc4565b82525050565b61471181613b8b565b82525050565b600060808201905061472c60008301876146f9565b6147396020830186614708565b61474660408301856146f9565b61475360608301846146f9565b95945050505050565b7f43616e6e6f742062652074686520302061646472657373210000000000000000600082015250565b6000614792601883613933565b915061479d8261475c565b602082019050919050565b600060208201905081810360008301526147c181614785565b9050919050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6000614824602283613933565b915061482f826147c8565b604082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006148b6602383613933565b91506148c18261485a565b604082019050919050565b600060208201905081810360008301526148e5816148a9565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614948602b83613933565b9150614953826148ec565b604082019050919050565b600060208201905081810360008301526149778161493b565b9050919050565b7f4578636565647320617661696c61626c6520746f6b656e730000000000000000600082015250565b60006149b4601883613933565b91506149bf8261497e565b602082019050919050565b600060208201905081810360008301526149e3816149a7565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614a20601a83613933565b9150614a2b826149ea565b602082019050919050565b60006020820190508181036000830152614a4f81614a13565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614ab2603383613933565b9150614abd82614a56565b604082019050919050565b60006020820190508181036000830152614ae181614aa5565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614b1e601f83613933565b9150614b2982614ae8565b602082019050919050565b60006020820190508181036000830152614b4d81614b11565b9050919050565b60008190508160005260206000209050919050565b60008154614b768161417e565b614b80818661465b565b94506001821660008114614b9b5760018114614bac57614bdf565b60ff19831686528186019350614bdf565b614bb585614b54565b60005b83811015614bd757815481890152600182019150602081019050614bb8565b838801955050505b50505092915050565b6000614bf382613928565b614bfd818561465b565b9350614c0d818560208601613944565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614c4f60058361465b565b9150614c5a82614c19565b600582019050919050565b6000614c718285614b69565b9150614c7d8284614be8565b9150614c8882614c42565b91508190509392505050565b7f4e6f20626f747321000000000000000000000000000000000000000000000000600082015250565b6000614cca600883613933565b9150614cd582614c94565b602082019050919050565b60006020820190508181036000830152614cf981614cbd565b9050919050565b7f496e76616c696420737461746500000000000000000000000000000000000000600082015250565b6000614d36600d83613933565b9150614d4182614d00565b602082019050919050565b60006020820190508181036000830152614d6581614d29565b9050919050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b6000614da2601183613933565b9150614dad82614d6c565b602082019050919050565b60006020820190508181036000830152614dd181614d95565b9050919050565b7f4d6178696d756d206e756d626572206f66204e46547320616c6c6f776564207460008201527f6f204d696e742072656163686564210000000000000000000000000000000000602082015250565b6000614e34602f83613933565b9150614e3f82614dd8565b604082019050919050565b60006020820190508181036000830152614e6381614e27565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ec6602683613933565b9150614ed182614e6a565b604082019050919050565b60006020820190508181036000830152614ef581614eb9565b9050919050565b7f496e76616c696420436f6e747261637420537461746521000000000000000000600082015250565b6000614f32601783613933565b9150614f3d82614efc565b602082019050919050565b60006020820190508181036000830152614f6181614f25565b9050919050565b600081519050614f7781613e9e565b92915050565b600060208284031215614f9357614f92613863565b5b6000614fa184828501614f68565b91505092915050565b7f546f6b656e206973205374616b65642100000000000000000000000000000000600082015250565b6000614fe0601083613933565b9150614feb82614faa565b602082019050919050565b6000602082019050818103600083015261500f81614fd3565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615072603283613933565b915061507d82615016565b604082019050919050565b600060208201905081810360008301526150a181615065565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615104602683613933565b915061510f826150a8565b604082019050919050565b60006020820190508181036000830152615133816150f7565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615196602583613933565b91506151a18261513a565b604082019050919050565b600060208201905081810360008301526151c581615189565b9050919050565b600081905092915050565b50565b60006151e76000836151cc565b91506151f2826151d7565b600082019050919050565b6000615208826151da565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000615248601483613933565b915061525382615212565b602082019050919050565b600060208201905081810360008301526152778161523b565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006152da602a83613933565b91506152e58261527e565b604082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061536c602f83613933565b915061537782615310565b604082019050919050565b6000602082019050818103600083015261539b8161535f565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153c9826153a2565b6153d381856153ad565b93506153e3818560208601613944565b6153ec81613977565b840191505092915050565b600060808201905061540c6000830187613a78565b6154196020830186613a78565b6154266040830185613b0e565b818103606083015261543881846153be565b905095945050505050565b60008151905061545281613899565b92915050565b60006020828403121561546e5761546d613863565b5b600061547c84828501615443565b91505092915050565b6000615490826139e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154c3576154c26142ae565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615508826139e3565b9150615513836139e3565b925082615523576155226154ce565b5b828204905092915050565b6000615539826139e3565b9150615544836139e3565b925082821015615557576155566142ae565b5b828203905092915050565b600061556d826139e3565b9150615578836139e3565b925082615588576155876154ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b600061561e603183613933565b9150615629826155c2565b604082019050919050565b6000602082019050818103600083015261564d81615611565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006156b0602183613933565b91506156bb82615654565b604082019050919050565b600060208201905081810360008301526156df816156a3565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615742602883613933565b915061574d826156e6565b604082019050919050565b6000602082019050818103600083015261577181615735565b905091905056fea26469706673582212204fc370ab98e8e3b19f00121411611a90fe348f331189b5cb2f141b7e572bb8d464736f6c63430008090033697066733a2f2f516d665a59356e7a797946756250505853646238524273785636365a724e384372645457383972316a7678453954

Deployed Bytecode

0x6080604052600436106102465760003560e01c80636c19e78311610139578063acf080d1116100b6578063cf388e9e1161007a578063cf388e9e1461088c578063e985e9c5146108a8578063efd0cbf9146108e5578063f2fde38b14610901578063fae965711461092a578063fb7265ff1461096757610246565b8063acf080d1146107a7578063b0a1c1c4146107d0578063b3912a4c146107fb578063b88d4fde14610826578063c87b56dd1461084f57610246565b806385209ee0116100fd57806385209ee0146106d45780638da5cb5b146106ff57806395d89b411461072a578063a22cb46514610755578063a58b34f81461077e57610246565b80636c19e7831461060357806370a082311461062c578063715018a6146106695780637313cba9146106805780637de55fe1146106ab57610246565b80633574a2dd116101c757806355f804b31161018b57806355f804b31461050a5780635a485599146105335780636352211e1461057057806366d003ac146105ad5780636c0360eb146105d857610246565b80633574a2dd1461043b5780633bbed4a0146104645780633ccfd60b1461048d57806342842e0e146104a45780634f6ccce7146104cd57610246565b80630f5eda9e1161020e5780630f5eda9e1461034257806318160ddd1461036d57806323b872dd146103985780632f745c59146103c157806332624114146103fe57610246565b806301ffc9a71461024b57806306fdde0314610288578063081812fc146102b357806308290dc5146102f0578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906138c5565b610990565b60405161027f919061390d565b60405180910390f35b34801561029457600080fd5b5061029d610ada565b6040516102aa91906139c1565b60405180910390f35b3480156102bf57600080fd5b506102da60048036038101906102d59190613a19565b610b6c565b6040516102e79190613a87565b60405180910390f35b3480156102fc57600080fd5b5061031760048036038101906103129190613a19565b610bf1565b005b34801561032557600080fd5b50610340600480360381019061033b9190613ace565b610ccd565b005b34801561034e57600080fd5b50610357610de6565b6040516103649190613b1d565b60405180910390f35b34801561037957600080fd5b50610382610dec565b60405161038f9190613b1d565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190613b38565b610df6565b005b3480156103cd57600080fd5b506103e860048036038101906103e39190613ace565b610e06565b6040516103f59190613b1d565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613bfa565b610ff8565b604051610432919061390d565b60405180910390f35b34801561044757600080fd5b50610462600480360381019061045d9190613d96565b6110f6565b005b34801561047057600080fd5b5061048b60048036038101906104869190613ddf565b61118c565b005b34801561049957600080fd5b506104a26112bc565b005b3480156104b057600080fd5b506104cb60048036038101906104c69190613b38565b6113b6565b005b3480156104d957600080fd5b506104f460048036038101906104ef9190613a19565b6113d6565b6040516105019190613b1d565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c9190613d96565b611429565b005b34801561053f57600080fd5b5061055a60048036038101906105559190613a19565b6114bf565b6040516105679190613b1d565b60405180910390f35b34801561057c57600080fd5b5061059760048036038101906105929190613a19565b6114fd565b6040516105a49190613a87565b60405180910390f35b3480156105b957600080fd5b506105c2611513565b6040516105cf9190613a87565b60405180910390f35b3480156105e457600080fd5b506105ed611539565b6040516105fa91906139c1565b60405180910390f35b34801561060f57600080fd5b5061062a60048036038101906106259190613ddf565b6115c7565b005b34801561063857600080fd5b50610653600480360381019061064e9190613ddf565b611687565b6040516106609190613b1d565b60405180910390f35b34801561067557600080fd5b5061067e611770565b005b34801561068c57600080fd5b506106956117f8565b6040516106a291906139c1565b60405180910390f35b3480156106b757600080fd5b506106d260048036038101906106cd9190613ace565b611886565b005b3480156106e057600080fd5b506106e9611968565b6040516106f69190613e83565b60405180910390f35b34801561070b57600080fd5b5061071461197b565b6040516107219190613a87565b60405180910390f35b34801561073657600080fd5b5061073f6119a4565b60405161074c91906139c1565b60405180910390f35b34801561076157600080fd5b5061077c60048036038101906107779190613eca565b611a36565b005b34801561078a57600080fd5b506107a560048036038101906107a09190613ddf565b611bb7565b005b3480156107b357600080fd5b506107ce60048036038101906107c99190613a19565b611c77565b005b3480156107dc57600080fd5b506107e5611d09565b6040516107f29190613b1d565b60405180910390f35b34801561080757600080fd5b50610810611d11565b60405161081d9190613f69565b60405180910390f35b34801561083257600080fd5b5061084d60048036038101906108489190614025565b611d37565b005b34801561085b57600080fd5b5061087660048036038101906108719190613a19565b611d93565b60405161088391906139c1565b60405180910390f35b6108a660048036038101906108a191906140a8565b611eba565b005b3480156108b457600080fd5b506108cf60048036038101906108ca919061410f565b6120b0565b6040516108dc919061390d565b60405180910390f35b6108ff60048036038101906108fa9190613a19565b612144565b005b34801561090d57600080fd5b5061092860048036038101906109239190613ddf565b6122e6565b005b34801561093657600080fd5b50610951600480360381019061094c9190613ddf565b6123de565b60405161095e9190613b1d565b60405180910390f35b34801561097357600080fd5b5061098e60048036038101906109899190613a19565b6123f0565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ac357507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ad35750610ad282612551565b5b9050919050565b606060028054610ae99061417e565b80601f0160208091040260200160405190810160405280929190818152602001828054610b159061417e565b8015610b625780601f10610b3757610100808354040283529160200191610b62565b820191906000526020600020905b815481529060010190602001808311610b4557829003601f168201915b5050505050905090565b6000610b77826125bb565b610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad90614222565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610bf96125c9565b73ffffffffffffffffffffffffffffffffffffffff16610c1761197b565b73ffffffffffffffffffffffffffffffffffffffff1614610c6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c649061428e565b60405180910390fd5b6000600182610c7c91906142dd565b9050600a548110610cc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cb99061437f565b60405180910390fd5b80600a819055505050565b6000610cd8826114fd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4090614411565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d686125c9565b73ffffffffffffffffffffffffffffffffffffffff161480610d975750610d9681610d916125c9565b6120b0565b5b610dd6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcd906144a3565b60405180910390fd5b610de18383836125d1565b505050565b600b5481565b6000600154905090565b610e01838383612683565b505050565b6000610e1183611687565b8210610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4990614535565b60405180910390fd5b6000610e5c610dec565b905060008060005b83811015610fb6576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610f5657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610fa85786841415610f9f578195505050505050610ff2565b83806001019450505b508080600101915050610e64565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe9906145c7565b60405180910390fd5b92915050565b600080308660405160200161100e92919061462f565b60405160208183030381529060405280519060200120905060018160405160200161103991906146d3565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161106f9493929190614717565b6020604051602081039080840390855afa158015611091573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6110fe6125c9565b73ffffffffffffffffffffffffffffffffffffffff1661111c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611172576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111699061428e565b60405180910390fd5b80600d908051906020019061118892919061377c565b5050565b6111946125c9565b73ffffffffffffffffffffffffffffffffffffffff166111b261197b565b73ffffffffffffffffffffffffffffffffffffffff1614611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff9061428e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611278576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126f906147a8565b60405180910390fd5b80600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6112c46125c9565b73ffffffffffffffffffffffffffffffffffffffff166112e261197b565b73ffffffffffffffffffffffffffffffffffffffff1614611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f9061428e565b60405180910390fd5b6000611342611d09565b905060008111611387576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137e9061483a565b60405180910390fd5b6113b3600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682612cae565b50565b6113d183838360405180602001604052806000815250611d37565b505050565b60006113e0610dec565b8210611421576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611418906148cc565b60405180910390fd5b819050919050565b6114316125c9565b73ffffffffffffffffffffffffffffffffffffffff1661144f61197b565b73ffffffffffffffffffffffffffffffffffffffff16146114a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149c9061428e565b60405180910390fd5b80600e90805190602001906114bb92919061377c565b5050565b60006004600083815260200190815260200160002060000160149054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b600061150882612d5f565b600001519050919050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600e80546115469061417e565b80601f01602080910402602001604051908101604052809291908181526020018280546115729061417e565b80156115bf5780601f10611594576101008083540402835291602001916115bf565b820191906000526020600020905b8154815290600101906020018083116115a257829003601f168201915b505050505081565b6115cf6125c9565b73ffffffffffffffffffffffffffffffffffffffff166115ed61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611643576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163a9061428e565b60405180910390fd5b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ef9061495e565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6117786125c9565b73ffffffffffffffffffffffffffffffffffffffff1661179661197b565b73ffffffffffffffffffffffffffffffffffffffff16146117ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e39061428e565b60405180910390fd5b6117f66000612ef9565b565b600d80546118059061417e565b80601f01602080910402602001604051908101604052809291908181526020018280546118319061417e565b801561187e5780601f106118535761010080835404028352916020019161187e565b820191906000526020600020905b81548152906001019060200180831161186157829003601f168201915b505050505081565b61188e6125c9565b73ffffffffffffffffffffffffffffffffffffffff166118ac61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f99061428e565b60405180910390fd5b80600a548161190f610dec565b61191991906142dd565b10611959576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611950906149ca565b60405180910390fd5b6119638383612fbd565b505050565b600c60009054906101000a900460ff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546119b39061417e565b80601f01602080910402602001604051908101604052809291908181526020018280546119df9061417e565b8015611a2c5780601f10611a0157610100808354040283529160200191611a2c565b820191906000526020600020905b815481529060010190602001808311611a0f57829003601f168201915b5050505050905090565b611a3e6125c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa390614a36565b60405180910390fd5b8060076000611ab96125c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611b666125c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bab919061390d565b60405180910390a35050565b611bbf6125c9565b73ffffffffffffffffffffffffffffffffffffffff16611bdd61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a9061428e565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611c7f6125c9565b73ffffffffffffffffffffffffffffffffffffffff16611c9d61197b565b73ffffffffffffffffffffffffffffffffffffffff1614611cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cea9061428e565b60405180910390fd5b600181611d0091906142dd565b600b8190555050565b600047905090565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611d42848484612683565b611d4e84848484612fdb565b611d8d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8490614ac8565b60405180910390fd5b50505050565b6060611da28261ffff166125bb565b611de1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd890614b34565b60405180910390fd5b6000600e8054611df09061417e565b905011611e8757600d8054611e049061417e565b80601f0160208091040260200160405190810160405280929190818152602001828054611e309061417e565b8015611e7d5780601f10611e5257610100808354040283529160200191611e7d565b820191906000526020600020905b815481529060010190602001808311611e6057829003601f168201915b5050505050611eb3565b600e611e9283613172565b604051602001611ea3929190614c65565b6040516020818303038152906040525b9050919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611f28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1f90614ce0565b60405180910390fd5b6001806002811115611f3d57611f3c613e0c565b5b600c60009054906101000a900460ff166002811115611f5f57611f5e613e0c565b5b14611f9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9690614d4c565b60405180910390fd5b84600a5481611fac610dec565b611fb691906142dd565b10611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed906149ca565b60405180910390fd5b84848461200533848484610ff8565b612044576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203b90614db8565b60405180910390fd5b600b5489612051336132d3565b61205b91906142dd565b1061209b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209290614e4a565b60405180910390fd5b6120a5338a612fbd565b505050505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a990614ce0565b60405180910390fd5b60028060028111156121c7576121c6613e0c565b5b600c60009054906101000a900460ff1660028111156121e9576121e8613e0c565b5b14612229576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222090614d4c565b60405180910390fd5b81600a5481612236610dec565b61224091906142dd565b10612280576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612277906149ca565b60405180910390fd5b600b548361228d336132d3565b61229791906142dd565b106122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122ce90614e4a565b60405180910390fd5b6122e13384612fbd565b505050565b6122ee6125c9565b73ffffffffffffffffffffffffffffffffffffffff1661230c61197b565b73ffffffffffffffffffffffffffffffffffffffff1614612362576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123599061428e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614edc565b60405180910390fd5b6123db81612ef9565b50565b60006123e9826132d3565b9050919050565b6123f86125c9565b73ffffffffffffffffffffffffffffffffffffffff1661241661197b565b73ffffffffffffffffffffffffffffffffffffffff161461246c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124639061428e565b60405180910390fd5b600381106124af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a690614f48565b60405180910390fd5b60008114156124e8576000600c60006101000a81548160ff021916908360028111156124de576124dd613e0c565b5b021790555061254e565b6001811415612521576001600c60006101000a81548160ff0219169083600281111561251757612516613e0c565b5b021790555061254d565b6002600c60006101000a81548160ff0219169083600281111561254757612546613e0c565b5b02179055505b5b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663baa51f86826040518263ffffffff1660e01b81526004016126de9190613b1d565b60206040518083038186803b1580156126f657600080fd5b505afa15801561270a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061272e9190614f7d565b1561276e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276590614ff6565b60405180910390fd5b600061277982612d5f565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166127a06125c9565b73ffffffffffffffffffffffffffffffffffffffff1614806127fc57506127c56125c9565b73ffffffffffffffffffffffffffffffffffffffff166127e484610b6c565b73ffffffffffffffffffffffffffffffffffffffff16145b80612818575061281782600001516128126125c9565b6120b0565b5b90508061285a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285190615088565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146128cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128c39061511a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561293c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612933906151ac565b60405180910390fd5b61294985858560016133bc565b61295960008484600001516125d1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612c3e57612b9d816125bb565b15612c3d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612ca785858560016133c2565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612cd4906151fd565b60006040518083038185875af1925050503d8060008114612d11576040519150601f19603f3d011682016040523d82523d6000602084013e612d16565b606091505b5050905080612d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d519061525e565b60405180910390fd5b505050565b612d67613802565b612d70826125bb565b612daf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612da6906152f0565b60405180910390fd5b60008290505b60008110612eb8576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612ea9578092505050612ef4565b50808060019003915050612db5565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eeb90615382565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612fd78282604051806020016040528060008152506133c8565b5050565b6000612ffc8473ffffffffffffffffffffffffffffffffffffffff166133da565b15613165578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130256125c9565b8786866040518563ffffffff1660e01b815260040161304794939291906153f7565b602060405180830381600087803b15801561306157600080fd5b505af192505050801561309257506040513d601f19601f8201168201806040525081019061308f9190615458565b60015b613115573d80600081146130c2576040519150601f19603f3d011682016040523d82523d6000602084013e6130c7565b606091505b5060008151141561310d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310490614ac8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061316a565b600190505b949350505050565b606060008214156131ba576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506132ce565b600082905060005b600082146131ec5780806131d590615485565b915050600a826131e591906154fd565b91506131c2565b60008167ffffffffffffffff81111561320857613207613c6b565b5b6040519080825280601f01601f19166020018201604052801561323a5781602001600182028036833780820191505090505b5090505b600085146132c757600182613253919061552e565b9150600a856132629190615562565b603061326e91906142dd565b60f81b81838151811061328457613283615593565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132c091906154fd565b945061323e565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613344576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333b90615634565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b50505050565b50505050565b6133d583838360016133fd565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161346b906156c6565b60405180910390fd5b60008414156134b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134af90615758565b60405180910390fd5b6134c560008683876133bc565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b8581101561375f57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4831561374a5761370a6000888488612fdb565b613749576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161374090614ac8565b60405180910390fd5b5b81806001019250508080600101915050613693565b50806001819055505061377560008683876133c2565b5050505050565b8280546137889061417e565b90600052602060002090601f0160209004810192826137aa57600085556137f1565b82601f106137c357805160ff19168380011785556137f1565b828001600101855582156137f1579182015b828111156137f05782518255916020019190600101906137d5565b5b5090506137fe919061383c565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b8082111561385557600081600090555060010161383d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6138a28161386d565b81146138ad57600080fd5b50565b6000813590506138bf81613899565b92915050565b6000602082840312156138db576138da613863565b5b60006138e9848285016138b0565b91505092915050565b60008115159050919050565b613907816138f2565b82525050565b600060208201905061392260008301846138fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613962578082015181840152602081019050613947565b83811115613971576000848401525b50505050565b6000601f19601f8301169050919050565b600061399382613928565b61399d8185613933565b93506139ad818560208601613944565b6139b681613977565b840191505092915050565b600060208201905081810360008301526139db8184613988565b905092915050565b6000819050919050565b6139f6816139e3565b8114613a0157600080fd5b50565b600081359050613a13816139ed565b92915050565b600060208284031215613a2f57613a2e613863565b5b6000613a3d84828501613a04565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a7182613a46565b9050919050565b613a8181613a66565b82525050565b6000602082019050613a9c6000830184613a78565b92915050565b613aab81613a66565b8114613ab657600080fd5b50565b600081359050613ac881613aa2565b92915050565b60008060408385031215613ae557613ae4613863565b5b6000613af385828601613ab9565b9250506020613b0485828601613a04565b9150509250929050565b613b17816139e3565b82525050565b6000602082019050613b326000830184613b0e565b92915050565b600080600060608486031215613b5157613b50613863565b5b6000613b5f86828701613ab9565b9350506020613b7086828701613ab9565b9250506040613b8186828701613a04565b9150509250925092565b600060ff82169050919050565b613ba181613b8b565b8114613bac57600080fd5b50565b600081359050613bbe81613b98565b92915050565b6000819050919050565b613bd781613bc4565b8114613be257600080fd5b50565b600081359050613bf481613bce565b92915050565b60008060008060808587031215613c1457613c13613863565b5b6000613c2287828801613ab9565b9450506020613c3387828801613baf565b9350506040613c4487828801613be5565b9250506060613c5587828801613be5565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613ca382613977565b810181811067ffffffffffffffff82111715613cc257613cc1613c6b565b5b80604052505050565b6000613cd5613859565b9050613ce18282613c9a565b919050565b600067ffffffffffffffff821115613d0157613d00613c6b565b5b613d0a82613977565b9050602081019050919050565b82818337600083830152505050565b6000613d39613d3484613ce6565b613ccb565b905082815260208101848484011115613d5557613d54613c66565b5b613d60848285613d17565b509392505050565b600082601f830112613d7d57613d7c613c61565b5b8135613d8d848260208601613d26565b91505092915050565b600060208284031215613dac57613dab613863565b5b600082013567ffffffffffffffff811115613dca57613dc9613868565b5b613dd684828501613d68565b91505092915050565b600060208284031215613df557613df4613863565b5b6000613e0384828501613ab9565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613e4c57613e4b613e0c565b5b50565b6000819050613e5d82613e3b565b919050565b6000613e6d82613e4f565b9050919050565b613e7d81613e62565b82525050565b6000602082019050613e986000830184613e74565b92915050565b613ea7816138f2565b8114613eb257600080fd5b50565b600081359050613ec481613e9e565b92915050565b60008060408385031215613ee157613ee0613863565b5b6000613eef85828601613ab9565b9250506020613f0085828601613eb5565b9150509250929050565b6000819050919050565b6000613f2f613f2a613f2584613a46565b613f0a565b613a46565b9050919050565b6000613f4182613f14565b9050919050565b6000613f5382613f36565b9050919050565b613f6381613f48565b82525050565b6000602082019050613f7e6000830184613f5a565b92915050565b600067ffffffffffffffff821115613f9f57613f9e613c6b565b5b613fa882613977565b9050602081019050919050565b6000613fc8613fc384613f84565b613ccb565b905082815260208101848484011115613fe457613fe3613c66565b5b613fef848285613d17565b509392505050565b600082601f83011261400c5761400b613c61565b5b813561401c848260208601613fb5565b91505092915050565b6000806000806080858703121561403f5761403e613863565b5b600061404d87828801613ab9565b945050602061405e87828801613ab9565b935050604061406f87828801613a04565b925050606085013567ffffffffffffffff8111156140905761408f613868565b5b61409c87828801613ff7565b91505092959194509250565b600080600080608085870312156140c2576140c1613863565b5b60006140d087828801613a04565b94505060206140e187828801613baf565b93505060406140f287828801613be5565b925050606061410387828801613be5565b91505092959194509250565b6000806040838503121561412657614125613863565b5b600061413485828601613ab9565b925050602061414585828601613ab9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061419657607f821691505b602082108114156141aa576141a961414f565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b600061420c602d83613933565b9150614217826141b0565b604082019050919050565b6000602082019050818103600083015261423b816141ff565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614278602083613933565b915061428382614242565b602082019050919050565b600060208201905081810360008301526142a78161426b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006142e8826139e3565b91506142f3836139e3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614328576143276142ae565b5b828201905092915050565b7f43616e206f6e6c792072656475636520737570706c7900000000000000000000600082015250565b6000614369601683613933565b915061437482614333565b602082019050919050565b600060208201905081810360008301526143988161435c565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b60006143fb602283613933565b91506144068261439f565b604082019050919050565b6000602082019050818103600083015261442a816143ee565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b600061448d603983613933565b915061449882614431565b604082019050919050565b600060208201905081810360008301526144bc81614480565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061451f602283613933565b915061452a826144c3565b604082019050919050565b6000602082019050818103600083015261454e81614512565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b60006145b1602e83613933565b91506145bc82614555565b604082019050919050565b600060208201905081810360008301526145e0816145a4565b9050919050565b60008160601b9050919050565b60006145ff826145e7565b9050919050565b6000614611826145f4565b9050919050565b61462961462482613a66565b614606565b82525050565b600061463b8285614618565b60148201915061464b8284614618565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b600061469c601c8361465b565b91506146a782614666565b601c82019050919050565b6000819050919050565b6146cd6146c882613bc4565b6146b2565b82525050565b60006146de8261468f565b91506146ea82846146bc565b60208201915081905092915050565b61470281613bc4565b82525050565b61471181613b8b565b82525050565b600060808201905061472c60008301876146f9565b6147396020830186614708565b61474660408301856146f9565b61475360608301846146f9565b95945050505050565b7f43616e6e6f742062652074686520302061646472657373210000000000000000600082015250565b6000614792601883613933565b915061479d8261475c565b602082019050919050565b600060208201905081810360008301526147c181614785565b9050919050565b7f4e6f2046756e647320746f2077697468647261772c2042616c616e636520697360008201527f2030000000000000000000000000000000000000000000000000000000000000602082015250565b6000614824602283613933565b915061482f826147c8565b604082019050919050565b6000602082019050818103600083015261485381614817565b9050919050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b60006148b6602383613933565b91506148c18261485a565b604082019050919050565b600060208201905081810360008301526148e5816148a9565b9050919050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000614948602b83613933565b9150614953826148ec565b604082019050919050565b600060208201905081810360008301526149778161493b565b9050919050565b7f4578636565647320617661696c61626c6520746f6b656e730000000000000000600082015250565b60006149b4601883613933565b91506149bf8261497e565b602082019050919050565b600060208201905081810360008301526149e3816149a7565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000614a20601a83613933565b9150614a2b826149ea565b602082019050919050565b60006020820190508181036000830152614a4f81614a13565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614ab2603383613933565b9150614abd82614a56565b604082019050919050565b60006020820190508181036000830152614ae181614aa5565b9050919050565b7f55524920717565727920666f72206e6f6e6578697374656e7420746f6b656e00600082015250565b6000614b1e601f83613933565b9150614b2982614ae8565b602082019050919050565b60006020820190508181036000830152614b4d81614b11565b9050919050565b60008190508160005260206000209050919050565b60008154614b768161417e565b614b80818661465b565b94506001821660008114614b9b5760018114614bac57614bdf565b60ff19831686528186019350614bdf565b614bb585614b54565b60005b83811015614bd757815481890152600182019150602081019050614bb8565b838801955050505b50505092915050565b6000614bf382613928565b614bfd818561465b565b9350614c0d818560208601613944565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614c4f60058361465b565b9150614c5a82614c19565b600582019050919050565b6000614c718285614b69565b9150614c7d8284614be8565b9150614c8882614c42565b91508190509392505050565b7f4e6f20626f747321000000000000000000000000000000000000000000000000600082015250565b6000614cca600883613933565b9150614cd582614c94565b602082019050919050565b60006020820190508181036000830152614cf981614cbd565b9050919050565b7f496e76616c696420737461746500000000000000000000000000000000000000600082015250565b6000614d36600d83613933565b9150614d4182614d00565b602082019050919050565b60006020820190508181036000830152614d6581614d29565b9050919050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b6000614da2601183613933565b9150614dad82614d6c565b602082019050919050565b60006020820190508181036000830152614dd181614d95565b9050919050565b7f4d6178696d756d206e756d626572206f66204e46547320616c6c6f776564207460008201527f6f204d696e742072656163686564210000000000000000000000000000000000602082015250565b6000614e34602f83613933565b9150614e3f82614dd8565b604082019050919050565b60006020820190508181036000830152614e6381614e27565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614ec6602683613933565b9150614ed182614e6a565b604082019050919050565b60006020820190508181036000830152614ef581614eb9565b9050919050565b7f496e76616c696420436f6e747261637420537461746521000000000000000000600082015250565b6000614f32601783613933565b9150614f3d82614efc565b602082019050919050565b60006020820190508181036000830152614f6181614f25565b9050919050565b600081519050614f7781613e9e565b92915050565b600060208284031215614f9357614f92613863565b5b6000614fa184828501614f68565b91505092915050565b7f546f6b656e206973205374616b65642100000000000000000000000000000000600082015250565b6000614fe0601083613933565b9150614feb82614faa565b602082019050919050565b6000602082019050818103600083015261500f81614fd3565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615072603283613933565b915061507d82615016565b604082019050919050565b600060208201905081810360008301526150a181615065565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b6000615104602683613933565b915061510f826150a8565b604082019050919050565b60006020820190508181036000830152615133816150f7565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615196602583613933565b91506151a18261513a565b604082019050919050565b600060208201905081810360008301526151c581615189565b9050919050565b600081905092915050565b50565b60006151e76000836151cc565b91506151f2826151d7565b600082019050919050565b6000615208826151da565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000615248601483613933565b915061525382615212565b602082019050919050565b600060208201905081810360008301526152778161523b565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b60006152da602a83613933565b91506152e58261527e565b604082019050919050565b60006020820190508181036000830152615309816152cd565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061536c602f83613933565b915061537782615310565b604082019050919050565b6000602082019050818103600083015261539b8161535f565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006153c9826153a2565b6153d381856153ad565b93506153e3818560208601613944565b6153ec81613977565b840191505092915050565b600060808201905061540c6000830187613a78565b6154196020830186613a78565b6154266040830185613b0e565b818103606083015261543881846153be565b905095945050505050565b60008151905061545281613899565b92915050565b60006020828403121561546e5761546d613863565b5b600061547c84828501615443565b91505092915050565b6000615490826139e3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156154c3576154c26142ae565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000615508826139e3565b9150615513836139e3565b925082615523576155226154ce565b5b828204905092915050565b6000615539826139e3565b9150615544836139e3565b925082821015615557576155566142ae565b5b828203905092915050565b600061556d826139e3565b9150615578836139e3565b925082615588576155876154ce565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206e756d626572206d696e74656420717565727920666f7260008201527f20746865207a65726f2061646472657373000000000000000000000000000000602082015250565b600061561e603183613933565b9150615629826155c2565b604082019050919050565b6000602082019050818103600083015261564d81615611565b9050919050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006156b0602183613933565b91506156bb82615654565b604082019050919050565b600060208201905081810360008301526156df816156a3565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b6000615742602883613933565b915061574d826156e6565b604082019050919050565b6000602082019050818103600083015261577181615735565b905091905056fea26469706673582212204fc370ab98e8e3b19f00121411611a90fe348f331189b5cb2f141b7e572bb8d464736f6c63430008090033

Deployed Bytecode Sourcemap

44067:7438:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30854:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32740:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34302:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48643:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33823:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44261:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29103:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35178:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29775:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46090:307;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49169:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49438:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49899:211;;;;;;;;;;;;;:::i;:::-;;35419:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29288:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48962:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50553:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32549:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44495:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44465:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48401:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31290:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5495:103;;;;;;;;;;;;;:::i;:::-;;44430:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47648:139;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44387:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4844:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32909:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34588:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28898:129;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49719:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51136:99;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28650:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35675:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50752:315;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47076:430;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34947:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46525:356;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5753:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51385:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47934:426;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30854:372;30956:4;31008:25;30993:40;;;:11;:40;;;;:105;;;;31065:33;31050:48;;;:11;:48;;;;30993:105;:172;;;;31130:35;31115:50;;;:11;:50;;;;30993:172;:225;;;;31182:36;31206:11;31182:23;:36::i;:::-;30993:225;30973:245;;30854:372;;;:::o;32740:100::-;32794:13;32827:5;32820:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32740:100;:::o;34302:214::-;34370:7;34398:16;34406:7;34398;:16::i;:::-;34390:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;34484:15;:24;34500:7;34484:24;;;;;;;;;;;;;;;;;;;;;34477:31;;34302:214;;;:::o;48643:233::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48710:23:::1;48746:1;48736:7;:11;;;;:::i;:::-;48710:37;;48784:14;;48766:15;:32;48758:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;48853:15;48836:14;:32;;;;48699:177;48643:233:::0;:::o;33823:413::-;33896:13;33912:24;33928:7;33912:15;:24::i;:::-;33896:40;;33961:5;33955:11;;:2;:11;;;;33947:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34056:5;34040:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;34065:37;34082:5;34089:12;:10;:12::i;:::-;34065:16;:37::i;:::-;34040:62;34018:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;34200:28;34209:2;34213:7;34222:5;34200:8;:28::i;:::-;33885:351;33823:413;;:::o;44261:36::-;;;;:::o;29103:108::-;29164:7;29191:12;;29184:19;;29103:108;:::o;35178:170::-;35312:28;35322:4;35328:2;35332:7;35312:9;:28::i;:::-;35178:170;;;:::o;29775:1007::-;29864:7;29900:16;29910:5;29900:9;:16::i;:::-;29892:5;:24;29884:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;29966:22;29991:13;:11;:13::i;:::-;29966:38;;30015:19;30045:25;30234:9;30229:466;30249:14;30245:1;:18;30229:466;;;30289:31;30323:11;:14;30335:1;30323:14;;;;;;;;;;;30289:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30386:1;30360:28;;:9;:14;;;:28;;;30356:111;;30433:9;:14;;;30413:34;;30356:111;30510:5;30489:26;;:17;:26;;;30485:195;;;30559:5;30544:11;:20;30540:85;;;30600:1;30593:8;;;;;;;;;30540:85;30647:13;;;;;;;30485:195;30270:425;30265:3;;;;;;;30229:466;;;;30718:56;;;;;;;;;;:::i;:::-;;;;;;;;29775:1007;;;;;:::o;46090:307::-;46189:4;46206:12;46256:4;46263;46231:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46221:48;;;;;;46206:63;;46297:92;46370:4;46317:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;46307:69;;;;;;46378:2;46382;46386;46297:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46287:102;;:6;;;;;;;;;;;:102;;;46280:109;;;46090:307;;;;;;:::o;49169:128::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49274:15:::1;49257:14;:32;;;;;;;;;;;;:::i;:::-;;49169:128:::0;:::o;49438:180::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49544:1:::1;49520:26;;:12;:26;;;;49512:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49598:12;49586:9;;:24;;;;;;;;;;;;;;;;;;49438:180:::0;:::o;49899:211::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49947:15:::1;49965:16;:14;:16::i;:::-;49947:34;;50010:1;50000:7;:11;49992:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;50063:38;50081:9;;;;;;;;;;;50093:7;50063:9;:38::i;:::-;49936:174;49899:211::o:0;35419:185::-;35557:39;35574:4;35580:2;35584:7;35557:39;;;;;;;;;;;;:16;:39::i;:::-;35419:185;;;:::o;29288:187::-;29355:7;29391:13;:11;:13::i;:::-;29383:5;:21;29375:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;29462:5;29455:12;;29288:187;;;:::o;48962:100::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49046:8:::1;49036:7;:18;;;;;;;;;;;;:::i;:::-;;48962:100:::0;:::o;50553:128::-;50611:7;50638:11;:20;50650:7;50638:20;;;;;;;;;;;:35;;;;;;;;;;;;50631:42;;;;50553:128;;;:::o;32549:124::-;32613:7;32640:20;32652:7;32640:11;:20::i;:::-;:25;;;32633:32;;32549:124;;;:::o;44495:24::-;;;;;;;;;;;;;:::o;44465:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48401:94::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48478:9:::1;48469:6;;:18;;;;;;;;;;;;;;;;;;48401:94:::0;:::o;31290:221::-;31354:7;31399:1;31382:19;;:5;:19;;;;31374:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;31475:12;:19;31488:5;31475:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;31467:36;;31460:43;;31290:221;;;:::o;5495:103::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5560:30:::1;5587:1;5560:18;:30::i;:::-;5495:103::o:0;44430:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;47648:139::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47735:8:::1;45442:14;;45430:8;45414:13;:11;:13::i;:::-;:24;;;;:::i;:::-;45413:43;45405:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;47756:23:::2;47766:2;47770:8;47756:9;:23::i;:::-;5135:1:::1;47648:139:::0;;:::o;44387:34::-;;;;;;;;;;;;;:::o;4844:87::-;4890:7;4917:6;;;;;;;;;;;4910:13;;4844:87;:::o;32909:104::-;32965:13;32998:7;32991:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32909:104;:::o;34588:288::-;34695:12;:10;:12::i;:::-;34683:24;;:8;:24;;;;34675:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;34796:8;34751:18;:32;34770:12;:10;:12::i;:::-;34751:32;;;;;;;;;;;;;;;:42;34784:8;34751:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34849:8;34820:48;;34835:12;:10;:12::i;:::-;34820:48;;;34859:8;34820:48;;;;;;:::i;:::-;;;;;;;;34588:288;;:::o;28898:129::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;29007:11:::1;28974:14;;:45;;;;;;;;;;;;;;;;;;28898:129:::0;:::o;49719:122::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49832:1:::1;49817:12;:16;;;;:::i;:::-;49794:20;:39;;;;49719:122:::0;:::o;51136:99::-;51182:4;51206:21;51199:28;;51136:99;:::o;28650:37::-;;;;;;;;;;;;;:::o;35675:355::-;35834:28;35844:4;35850:2;35854:7;35834:9;:28::i;:::-;35895:48;35918:4;35924:2;35928:7;35937:5;35895:22;:48::i;:::-;35873:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;35675:355;;;;:::o;50752:315::-;50825:13;50859:24;50874:7;50859:24;;:7;:24::i;:::-;50851:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50976:1;50958:7;50952:21;;;;;:::i;:::-;;;:25;:107;;51045:14;50952:107;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51004:7;51013:18;:7;:16;:18::i;:::-;50987:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50952:107;50932:127;;50752:315;;;:::o;47076:430::-;44996:9;44982:23;;:10;:23;;;44974:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;47225:21:::1;45212:14;45195:31;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;45187:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47273:8:::2;45442:14;;45430:8;45414:13;:11;:13::i;:::-;:24;;;;:::i;:::-;45413:43;45405:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;47308:2:::3;47313;47317;45592:41;45613:10;45624:2;45627;45630;45592:20;:41::i;:::-;45583:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47384:20:::4;;47373:8;47345:25;47359:10;47345:13;:25::i;:::-;:36;;;;:::i;:::-;:59;47337:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;47467:31;47477:10;47489:8;47467:9;:31::i;:::-;45496:1:::3;;;45255::::2;45029::::1;47076:430:::0;;;;:::o;34947:164::-;35044:4;35068:18;:25;35087:5;35068:25;;;;;;;;;;;;;;;:35;35094:8;35068:35;;;;;;;;;;;;;;;;;;;;;;;;;35061:42;;34947:164;;;;:::o;46525:356::-;44996:9;44982:23;;:10;:23;;;44974:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;46639:20:::1;45212:14;45195:31;;;;;;;;:::i;:::-;;:13;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;45187:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;46686:8:::2;45442:14;;45430:8;45414:13;:11;:13::i;:::-;:24;;;;:::i;:::-;45413:43;45405:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;46759:20:::3;;46748:8;46720:25;46734:10;46720:13;:25::i;:::-;:36;;;;:::i;:::-;:59;46712:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;46842:31;46852:10;46864:8;46842:9;:31::i;:::-;45255:1:::2;45029::::1;46525:356:::0;:::o;5753:201::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5862:1:::1;5842:22;;:8;:22;;;;5834:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5918:28;5937:8;5918:18;:28::i;:::-;5753:201:::0;:::o;51385:117::-;51449:4;51473:21;51487:6;51473:13;:21::i;:::-;51466:28;;51385:117;;;:::o;47934:426::-;5075:12;:10;:12::i;:::-;5064:23;;:7;:5;:7::i;:::-;:23;;;5056:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48036:1:::1;48019:14;:18;48011:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;48098:1;48080:14;:19;48076:267;;;48132:17;48116:13;;:33;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;48076:267;;;48198:1;48180:14;:19;48176:167;;;48232:21;48216:13;;:37;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;48176:167;;;48311:20;48295:13;;:36;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;48176:167;48076:267;47934:426:::0;:::o;17628:157::-;17713:4;17752:25;17737:40;;;:11;:40;;;;17730:47;;17628:157;;;:::o;36285:111::-;36342:4;36376:12;;36366:7;:22;36359:29;;36285:111;;;:::o;3568:98::-;3621:7;3648:10;3641:17;;3568:98;:::o;41278:196::-;41420:2;41393:15;:24;41409:7;41393:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41458:7;41454:2;41438:28;;41447:5;41438:28;;;;;;;;;;;;41278:196;;;:::o;39085:2075::-;39209:14;;;;;;;;;;;:23;;;39233:7;39209:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;39208:33;39200:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;39273:35;39311:20;39323:7;39311:11;:20::i;:::-;39273:58;;39344:22;39386:13;:18;;;39370:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;39445:12;:10;:12::i;:::-;39421:36;;:20;39433:7;39421:11;:20::i;:::-;:36;;;39370:87;:154;;;;39474:50;39491:13;:18;;;39511:12;:10;:12::i;:::-;39474:16;:50::i;:::-;39370:154;39344:181;;39546:17;39538:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;39661:4;39639:26;;:13;:18;;;:26;;;39631:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;39741:1;39727:16;;:2;:16;;;;39719:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39798:43;39820:4;39826:2;39830:7;39839:1;39798:21;:43::i;:::-;39906:49;39923:1;39927:7;39936:13;:18;;;39906:8;:49::i;:::-;40281:1;40251:12;:18;40264:4;40251:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40325:1;40297:12;:16;40310:2;40297:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40371:2;40343:11;:20;40355:7;40343:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;40433:15;40388:11;:20;40400:7;40388:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;40701:19;40733:1;40723:7;:11;40701:33;;40794:1;40753:43;;:11;:24;40765:11;40753:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;40749:295;;;40821:20;40829:11;40821:7;:20::i;:::-;40817:212;;;40898:13;:18;;;40866:11;:24;40878:11;40866:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;40981:13;:28;;;40939:11;:24;40951:11;40939:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;40817:212;40749:295;40226:829;41091:7;41087:2;41072:27;;41081:4;41072:27;;;;;;;;;;;;41110:42;41131:4;41137:2;41141:7;41150:1;41110:20;:42::i;:::-;39189:1971;;39085:2075;;;:::o;50185:183::-;50266:9;50281:7;:12;;50301:6;50281:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50265:47;;;50331:4;50323:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;50254:114;50185:183;;:::o;31950:537::-;32011:21;;:::i;:::-;32053:16;32061:7;32053;:16::i;:::-;32045:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;32159:12;32174:7;32159:22;;32154:245;32191:1;32183:4;:9;32154:245;;32221:31;32255:11;:17;32267:4;32255:17;;;;;;;;;;;32221:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32321:1;32295:28;;:9;:14;;;:28;;;32291:93;;32355:9;32348:16;;;;;;32291:93;32202:197;32194:6;;;;;;;;32154:245;;;;32422:57;;;;;;;;;;:::i;:::-;;;;;;;;31950:537;;;;:::o;6114:191::-;6188:16;6207:6;;;;;;;;;;;6188:25;;6233:8;6224:6;;:17;;;;;;;;;;;;;;;;;;6288:8;6257:40;;6278:8;6257:40;;;;;;;;;;;;6177:128;6114:191;:::o;36404:104::-;36473:27;36483:2;36487:8;36473:27;;;;;;;;;;;;:9;:27::i;:::-;36404:104;;:::o;42039:804::-;42194:4;42215:15;:2;:13;;;:15::i;:::-;42211:625;;;42267:2;42251:36;;;42288:12;:10;:12::i;:::-;42302:4;42308:7;42317:5;42251:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42247:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42514:1;42497:6;:13;:18;42493:273;;;42540:61;;;;;;;;;;:::i;:::-;;;;;;;;42493:273;42716:6;42710:13;42701:6;42697:2;42693:15;42686:38;42247:534;42384:45;;;42374:55;;;:6;:55;;;;42367:62;;;;;42211:625;42820:4;42813:11;;42039:804;;;;;;;:::o;23695:723::-;23751:13;23981:1;23972:5;:10;23968:53;;;23999:10;;;;;;;;;;;;;;;;;;;;;23968:53;24031:12;24046:5;24031:20;;24062:14;24087:78;24102:1;24094:4;:9;24087:78;;24120:8;;;;;:::i;:::-;;;;24151:2;24143:10;;;;;:::i;:::-;;;24087:78;;;24175:19;24207:6;24197:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24175:39;;24225:154;24241:1;24232:5;:10;24225:154;;24269:1;24259:11;;;;;:::i;:::-;;;24336:2;24328:5;:10;;;;:::i;:::-;24315:2;:24;;;;:::i;:::-;24302:39;;24285:6;24292;24285:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;24365:2;24356:11;;;;;:::i;:::-;;;24225:154;;;24403:6;24389:21;;;;;23695:723;;;;:::o;31519:229::-;31580:7;31625:1;31608:19;;:5;:19;;;;31600:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;31707:12;:19;31720:5;31707:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;31699:41;;31692:48;;31519:229;;;:::o;43331:159::-;;;;;:::o;43902:158::-;;;;;:::o;36871:163::-;36994:32;37000:2;37004:8;37014:5;37021:4;36994:5;:32::i;:::-;36871:163;;;:::o;7545:326::-;7605:4;7862:1;7840:7;:19;;;:23;7833:30;;7545:326;;;:::o;37293:1538::-;37432:20;37455:12;;37432:35;;37500:1;37486:16;;:2;:16;;;;37478:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37571:1;37559:8;:13;;37551:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;37630:61;37660:1;37664:2;37668:12;37682:8;37630:21;:61::i;:::-;38005:8;37969:12;:16;37982:2;37969:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38070:8;38029:12;:16;38042:2;38029:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38129:2;38096:11;:25;38108:12;38096:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;38196:15;38146:11;:25;38158:12;38146:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;38229:20;38252:12;38229:35;;38286:9;38281:415;38301:8;38297:1;:12;38281:415;;;38365:12;38361:2;38340:38;;38357:1;38340:38;;;;;;;;;;;;38401:4;38397:249;;;38464:59;38495:1;38499:2;38503:12;38517:5;38464:22;:59::i;:::-;38430:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;38397:249;38666:14;;;;;;;38311:3;;;;;;;38281:415;;;;38727:12;38712;:27;;;;37944:807;38763:60;38792:1;38796:2;38800:12;38814:8;38763:20;:60::i;:::-;37421:1410;37293:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:86::-;5950:7;5990:4;5983:5;5979:16;5968:27;;5915:86;;;:::o;6007:118::-;6078:22;6094:5;6078:22;:::i;:::-;6071:5;6068:33;6058:61;;6115:1;6112;6105:12;6058:61;6007:118;:::o;6131:135::-;6175:5;6213:6;6200:20;6191:29;;6229:31;6254:5;6229:31;:::i;:::-;6131:135;;;;:::o;6272:77::-;6309:7;6338:5;6327:16;;6272:77;;;:::o;6355:122::-;6428:24;6446:5;6428:24;:::i;:::-;6421:5;6418:35;6408:63;;6467:1;6464;6457:12;6408:63;6355:122;:::o;6483:139::-;6529:5;6567:6;6554:20;6545:29;;6583:33;6610:5;6583:33;:::i;:::-;6483:139;;;;:::o;6628:761::-;6712:6;6720;6728;6736;6785:3;6773:9;6764:7;6760:23;6756:33;6753:120;;;6792:79;;:::i;:::-;6753:120;6912:1;6937:53;6982:7;6973:6;6962:9;6958:22;6937:53;:::i;:::-;6927:63;;6883:117;7039:2;7065:51;7108:7;7099:6;7088:9;7084:22;7065:51;:::i;:::-;7055:61;;7010:116;7165:2;7191:53;7236:7;7227:6;7216:9;7212:22;7191:53;:::i;:::-;7181:63;;7136:118;7293:2;7319:53;7364:7;7355:6;7344:9;7340:22;7319:53;:::i;:::-;7309:63;;7264:118;6628:761;;;;;;;:::o;7395:117::-;7504:1;7501;7494:12;7518:117;7627:1;7624;7617:12;7641:180;7689:77;7686:1;7679:88;7786:4;7783:1;7776:15;7810:4;7807:1;7800:15;7827:281;7910:27;7932:4;7910:27;:::i;:::-;7902:6;7898:40;8040:6;8028:10;8025:22;8004:18;7992:10;7989:34;7986:62;7983:88;;;8051:18;;:::i;:::-;7983:88;8091:10;8087:2;8080:22;7870:238;7827:281;;:::o;8114:129::-;8148:6;8175:20;;:::i;:::-;8165:30;;8204:33;8232:4;8224:6;8204:33;:::i;:::-;8114:129;;;:::o;8249:308::-;8311:4;8401:18;8393:6;8390:30;8387:56;;;8423:18;;:::i;:::-;8387:56;8461:29;8483:6;8461:29;:::i;:::-;8453:37;;8545:4;8539;8535:15;8527:23;;8249:308;;;:::o;8563:154::-;8647:6;8642:3;8637;8624:30;8709:1;8700:6;8695:3;8691:16;8684:27;8563:154;;;:::o;8723:412::-;8801:5;8826:66;8842:49;8884:6;8842:49;:::i;:::-;8826:66;:::i;:::-;8817:75;;8915:6;8908:5;8901:21;8953:4;8946:5;8942:16;8991:3;8982:6;8977:3;8973:16;8970:25;8967:112;;;8998:79;;:::i;:::-;8967:112;9088:41;9122:6;9117:3;9112;9088:41;:::i;:::-;8807:328;8723:412;;;;;:::o;9155:340::-;9211:5;9260:3;9253:4;9245:6;9241:17;9237:27;9227:122;;9268:79;;:::i;:::-;9227:122;9385:6;9372:20;9410:79;9485:3;9477:6;9470:4;9462:6;9458:17;9410:79;:::i;:::-;9401:88;;9217:278;9155:340;;;;:::o;9501:509::-;9570:6;9619:2;9607:9;9598:7;9594:23;9590:32;9587:119;;;9625:79;;:::i;:::-;9587:119;9773:1;9762:9;9758:17;9745:31;9803:18;9795:6;9792:30;9789:117;;;9825:79;;:::i;:::-;9789:117;9930:63;9985:7;9976:6;9965:9;9961:22;9930:63;:::i;:::-;9920:73;;9716:287;9501:509;;;;:::o;10016:329::-;10075:6;10124:2;10112:9;10103:7;10099:23;10095:32;10092:119;;;10130:79;;:::i;:::-;10092:119;10250:1;10275:53;10320:7;10311:6;10300:9;10296:22;10275:53;:::i;:::-;10265:63;;10221:117;10016:329;;;;:::o;10351:180::-;10399:77;10396:1;10389:88;10496:4;10493:1;10486:15;10520:4;10517:1;10510:15;10537:123;10628:1;10621:5;10618:12;10608:46;;10634:18;;:::i;:::-;10608:46;10537:123;:::o;10666:147::-;10721:7;10750:5;10739:16;;10756:51;10801:5;10756:51;:::i;:::-;10666:147;;;:::o;10819:::-;10885:9;10918:42;10954:5;10918:42;:::i;:::-;10905:55;;10819:147;;;:::o;10972:163::-;11075:53;11122:5;11075:53;:::i;:::-;11070:3;11063:66;10972:163;;:::o;11141:254::-;11250:4;11288:2;11277:9;11273:18;11265:26;;11301:87;11385:1;11374:9;11370:17;11361:6;11301:87;:::i;:::-;11141:254;;;;:::o;11401:116::-;11471:21;11486:5;11471:21;:::i;:::-;11464:5;11461:32;11451:60;;11507:1;11504;11497:12;11451:60;11401:116;:::o;11523:133::-;11566:5;11604:6;11591:20;11582:29;;11620:30;11644:5;11620:30;:::i;:::-;11523:133;;;;:::o;11662:468::-;11727:6;11735;11784:2;11772:9;11763:7;11759:23;11755:32;11752:119;;;11790:79;;:::i;:::-;11752:119;11910:1;11935:53;11980:7;11971:6;11960:9;11956:22;11935:53;:::i;:::-;11925:63;;11881:117;12037:2;12063:50;12105:7;12096:6;12085:9;12081:22;12063:50;:::i;:::-;12053:60;;12008:115;11662:468;;;;;:::o;12136:60::-;12164:3;12185:5;12178:12;;12136:60;;;:::o;12202:142::-;12252:9;12285:53;12303:34;12312:24;12330:5;12312:24;:::i;:::-;12303:34;:::i;:::-;12285:53;:::i;:::-;12272:66;;12202:142;;;:::o;12350:126::-;12400:9;12433:37;12464:5;12433:37;:::i;:::-;12420:50;;12350:126;;;:::o;12482:149::-;12555:9;12588:37;12619:5;12588:37;:::i;:::-;12575:50;;12482:149;;;:::o;12637:177::-;12747:60;12801:5;12747:60;:::i;:::-;12742:3;12735:73;12637:177;;:::o;12820:268::-;12936:4;12974:2;12963:9;12959:18;12951:26;;12987:94;13078:1;13067:9;13063:17;13054:6;12987:94;:::i;:::-;12820:268;;;;:::o;13094:307::-;13155:4;13245:18;13237:6;13234:30;13231:56;;;13267:18;;:::i;:::-;13231:56;13305:29;13327:6;13305:29;:::i;:::-;13297:37;;13389:4;13383;13379:15;13371:23;;13094:307;;;:::o;13407:410::-;13484:5;13509:65;13525:48;13566:6;13525:48;:::i;:::-;13509:65;:::i;:::-;13500:74;;13597:6;13590:5;13583:21;13635:4;13628:5;13624:16;13673:3;13664:6;13659:3;13655:16;13652:25;13649:112;;;13680:79;;:::i;:::-;13649:112;13770:41;13804:6;13799:3;13794;13770:41;:::i;:::-;13490:327;13407:410;;;;;:::o;13836:338::-;13891:5;13940:3;13933:4;13925:6;13921:17;13917:27;13907:122;;13948:79;;:::i;:::-;13907:122;14065:6;14052:20;14090:78;14164:3;14156:6;14149:4;14141:6;14137:17;14090:78;:::i;:::-;14081:87;;13897:277;13836:338;;;;:::o;14180:943::-;14275:6;14283;14291;14299;14348:3;14336:9;14327:7;14323:23;14319:33;14316:120;;;14355:79;;:::i;:::-;14316:120;14475:1;14500:53;14545:7;14536:6;14525:9;14521:22;14500:53;:::i;:::-;14490:63;;14446:117;14602:2;14628:53;14673:7;14664:6;14653:9;14649:22;14628:53;:::i;:::-;14618:63;;14573:118;14730:2;14756:53;14801:7;14792:6;14781:9;14777:22;14756:53;:::i;:::-;14746:63;;14701:118;14886:2;14875:9;14871:18;14858:32;14917:18;14909:6;14906:30;14903:117;;;14939:79;;:::i;:::-;14903:117;15044:62;15098:7;15089:6;15078:9;15074:22;15044:62;:::i;:::-;15034:72;;14829:287;14180:943;;;;;;;:::o;15129:761::-;15213:6;15221;15229;15237;15286:3;15274:9;15265:7;15261:23;15257:33;15254:120;;;15293:79;;:::i;:::-;15254:120;15413:1;15438:53;15483:7;15474:6;15463:9;15459:22;15438:53;:::i;:::-;15428:63;;15384:117;15540:2;15566:51;15609:7;15600:6;15589:9;15585:22;15566:51;:::i;:::-;15556:61;;15511:116;15666:2;15692:53;15737:7;15728:6;15717:9;15713:22;15692:53;:::i;:::-;15682:63;;15637:118;15794:2;15820:53;15865:7;15856:6;15845:9;15841:22;15820:53;:::i;:::-;15810:63;;15765:118;15129:761;;;;;;;:::o;15896:474::-;15964:6;15972;16021:2;16009:9;16000:7;15996:23;15992:32;15989:119;;;16027:79;;:::i;:::-;15989:119;16147:1;16172:53;16217:7;16208:6;16197:9;16193:22;16172:53;:::i;:::-;16162:63;;16118:117;16274:2;16300:53;16345:7;16336:6;16325:9;16321:22;16300:53;:::i;:::-;16290:63;;16245:118;15896:474;;;;;:::o;16376:180::-;16424:77;16421:1;16414:88;16521:4;16518:1;16511:15;16545:4;16542:1;16535:15;16562:320;16606:6;16643:1;16637:4;16633:12;16623:22;;16690:1;16684:4;16680:12;16711:18;16701:81;;16767:4;16759:6;16755:17;16745:27;;16701:81;16829:2;16821:6;16818:14;16798:18;16795:38;16792:84;;;16848:18;;:::i;:::-;16792:84;16613:269;16562:320;;;:::o;16888:232::-;17028:34;17024:1;17016:6;17012:14;17005:58;17097:15;17092:2;17084:6;17080:15;17073:40;16888:232;:::o;17126:366::-;17268:3;17289:67;17353:2;17348:3;17289:67;:::i;:::-;17282:74;;17365:93;17454:3;17365:93;:::i;:::-;17483:2;17478:3;17474:12;17467:19;;17126:366;;;:::o;17498:419::-;17664:4;17702:2;17691:9;17687:18;17679:26;;17751:9;17745:4;17741:20;17737:1;17726:9;17722:17;17715:47;17779:131;17905:4;17779:131;:::i;:::-;17771:139;;17498:419;;;:::o;17923:182::-;18063:34;18059:1;18051:6;18047:14;18040:58;17923:182;:::o;18111:366::-;18253:3;18274:67;18338:2;18333:3;18274:67;:::i;:::-;18267:74;;18350:93;18439:3;18350:93;:::i;:::-;18468:2;18463:3;18459:12;18452:19;;18111:366;;;:::o;18483:419::-;18649:4;18687:2;18676:9;18672:18;18664:26;;18736:9;18730:4;18726:20;18722:1;18711:9;18707:17;18700:47;18764:131;18890:4;18764:131;:::i;:::-;18756:139;;18483:419;;;:::o;18908:180::-;18956:77;18953:1;18946:88;19053:4;19050:1;19043:15;19077:4;19074:1;19067:15;19094:305;19134:3;19153:20;19171:1;19153:20;:::i;:::-;19148:25;;19187:20;19205:1;19187:20;:::i;:::-;19182:25;;19341:1;19273:66;19269:74;19266:1;19263:81;19260:107;;;19347:18;;:::i;:::-;19260:107;19391:1;19388;19384:9;19377:16;;19094:305;;;;:::o;19405:172::-;19545:24;19541:1;19533:6;19529:14;19522:48;19405:172;:::o;19583:366::-;19725:3;19746:67;19810:2;19805:3;19746:67;:::i;:::-;19739:74;;19822:93;19911:3;19822:93;:::i;:::-;19940:2;19935:3;19931:12;19924:19;;19583:366;;;:::o;19955:419::-;20121:4;20159:2;20148:9;20144:18;20136:26;;20208:9;20202:4;20198:20;20194:1;20183:9;20179:17;20172:47;20236:131;20362:4;20236:131;:::i;:::-;20228:139;;19955:419;;;:::o;20380:221::-;20520:34;20516:1;20508:6;20504:14;20497:58;20589:4;20584:2;20576:6;20572:15;20565:29;20380:221;:::o;20607:366::-;20749:3;20770:67;20834:2;20829:3;20770:67;:::i;:::-;20763:74;;20846:93;20935:3;20846:93;:::i;:::-;20964:2;20959:3;20955:12;20948:19;;20607:366;;;:::o;20979:419::-;21145:4;21183:2;21172:9;21168:18;21160:26;;21232:9;21226:4;21222:20;21218:1;21207:9;21203:17;21196:47;21260:131;21386:4;21260:131;:::i;:::-;21252:139;;20979:419;;;:::o;21404:244::-;21544:34;21540:1;21532:6;21528:14;21521:58;21613:27;21608:2;21600:6;21596:15;21589:52;21404:244;:::o;21654:366::-;21796:3;21817:67;21881:2;21876:3;21817:67;:::i;:::-;21810:74;;21893:93;21982:3;21893:93;:::i;:::-;22011:2;22006:3;22002:12;21995:19;;21654:366;;;:::o;22026:419::-;22192:4;22230:2;22219:9;22215:18;22207:26;;22279:9;22273:4;22269:20;22265:1;22254:9;22250:17;22243:47;22307:131;22433:4;22307:131;:::i;:::-;22299:139;;22026:419;;;:::o;22451:221::-;22591:34;22587:1;22579:6;22575:14;22568:58;22660:4;22655:2;22647:6;22643:15;22636:29;22451:221;:::o;22678:366::-;22820:3;22841:67;22905:2;22900:3;22841:67;:::i;:::-;22834:74;;22917:93;23006:3;22917:93;:::i;:::-;23035:2;23030:3;23026:12;23019:19;;22678:366;;;:::o;23050:419::-;23216:4;23254:2;23243:9;23239:18;23231:26;;23303:9;23297:4;23293:20;23289:1;23278:9;23274:17;23267:47;23331:131;23457:4;23331:131;:::i;:::-;23323:139;;23050:419;;;:::o;23475:233::-;23615:34;23611:1;23603:6;23599:14;23592:58;23684:16;23679:2;23671:6;23667:15;23660:41;23475:233;:::o;23714:366::-;23856:3;23877:67;23941:2;23936:3;23877:67;:::i;:::-;23870:74;;23953:93;24042:3;23953:93;:::i;:::-;24071:2;24066:3;24062:12;24055:19;;23714:366;;;:::o;24086:419::-;24252:4;24290:2;24279:9;24275:18;24267:26;;24339:9;24333:4;24329:20;24325:1;24314:9;24310:17;24303:47;24367:131;24493:4;24367:131;:::i;:::-;24359:139;;24086:419;;;:::o;24511:94::-;24544:8;24592:5;24588:2;24584:14;24563:35;;24511:94;;;:::o;24611:::-;24650:7;24679:20;24693:5;24679:20;:::i;:::-;24668:31;;24611:94;;;:::o;24711:100::-;24750:7;24779:26;24799:5;24779:26;:::i;:::-;24768:37;;24711:100;;;:::o;24817:157::-;24922:45;24942:24;24960:5;24942:24;:::i;:::-;24922:45;:::i;:::-;24917:3;24910:58;24817:157;;:::o;24980:397::-;25120:3;25135:75;25206:3;25197:6;25135:75;:::i;:::-;25235:2;25230:3;25226:12;25219:19;;25248:75;25319:3;25310:6;25248:75;:::i;:::-;25348:2;25343:3;25339:12;25332:19;;25368:3;25361:10;;24980:397;;;;;:::o;25383:148::-;25485:11;25522:3;25507:18;;25383:148;;;;:::o;25537:214::-;25677:66;25673:1;25665:6;25661:14;25654:90;25537:214;:::o;25757:402::-;25917:3;25938:85;26020:2;26015:3;25938:85;:::i;:::-;25931:92;;26032:93;26121:3;26032:93;:::i;:::-;26150:2;26145:3;26141:12;26134:19;;25757:402;;;:::o;26165:79::-;26204:7;26233:5;26222:16;;26165:79;;;:::o;26250:157::-;26355:45;26375:24;26393:5;26375:24;:::i;:::-;26355:45;:::i;:::-;26350:3;26343:58;26250:157;;:::o;26413:522::-;26626:3;26648:148;26792:3;26648:148;:::i;:::-;26641:155;;26806:75;26877:3;26868:6;26806:75;:::i;:::-;26906:2;26901:3;26897:12;26890:19;;26926:3;26919:10;;26413:522;;;;:::o;26941:118::-;27028:24;27046:5;27028:24;:::i;:::-;27023:3;27016:37;26941:118;;:::o;27065:112::-;27148:22;27164:5;27148:22;:::i;:::-;27143:3;27136:35;27065:112;;:::o;27183:545::-;27356:4;27394:3;27383:9;27379:19;27371:27;;27408:71;27476:1;27465:9;27461:17;27452:6;27408:71;:::i;:::-;27489:68;27553:2;27542:9;27538:18;27529:6;27489:68;:::i;:::-;27567:72;27635:2;27624:9;27620:18;27611:6;27567:72;:::i;:::-;27649;27717:2;27706:9;27702:18;27693:6;27649:72;:::i;:::-;27183:545;;;;;;;:::o;27734:174::-;27874:26;27870:1;27862:6;27858:14;27851:50;27734:174;:::o;27914:366::-;28056:3;28077:67;28141:2;28136:3;28077:67;:::i;:::-;28070:74;;28153:93;28242:3;28153:93;:::i;:::-;28271:2;28266:3;28262:12;28255:19;;27914:366;;;:::o;28286:419::-;28452:4;28490:2;28479:9;28475:18;28467:26;;28539:9;28533:4;28529:20;28525:1;28514:9;28510:17;28503:47;28567:131;28693:4;28567:131;:::i;:::-;28559:139;;28286:419;;;:::o;28711:221::-;28851:34;28847:1;28839:6;28835:14;28828:58;28920:4;28915:2;28907:6;28903:15;28896:29;28711:221;:::o;28938:366::-;29080:3;29101:67;29165:2;29160:3;29101:67;:::i;:::-;29094:74;;29177:93;29266:3;29177:93;:::i;:::-;29295:2;29290:3;29286:12;29279:19;;28938:366;;;:::o;29310:419::-;29476:4;29514:2;29503:9;29499:18;29491:26;;29563:9;29557:4;29553:20;29549:1;29538:9;29534:17;29527:47;29591:131;29717:4;29591:131;:::i;:::-;29583:139;;29310:419;;;:::o;29735:222::-;29875:34;29871:1;29863:6;29859:14;29852:58;29944:5;29939:2;29931:6;29927:15;29920:30;29735:222;:::o;29963:366::-;30105:3;30126:67;30190:2;30185:3;30126:67;:::i;:::-;30119:74;;30202:93;30291:3;30202:93;:::i;:::-;30320:2;30315:3;30311:12;30304:19;;29963:366;;;:::o;30335:419::-;30501:4;30539:2;30528:9;30524:18;30516:26;;30588:9;30582:4;30578:20;30574:1;30563:9;30559:17;30552:47;30616:131;30742:4;30616:131;:::i;:::-;30608:139;;30335:419;;;:::o;30760:230::-;30900:34;30896:1;30888:6;30884:14;30877:58;30969:13;30964:2;30956:6;30952:15;30945:38;30760:230;:::o;30996:366::-;31138:3;31159:67;31223:2;31218:3;31159:67;:::i;:::-;31152:74;;31235:93;31324:3;31235:93;:::i;:::-;31353:2;31348:3;31344:12;31337:19;;30996:366;;;:::o;31368:419::-;31534:4;31572:2;31561:9;31557:18;31549:26;;31621:9;31615:4;31611:20;31607:1;31596:9;31592:17;31585:47;31649:131;31775:4;31649:131;:::i;:::-;31641:139;;31368:419;;;:::o;31793:174::-;31933:26;31929:1;31921:6;31917:14;31910:50;31793:174;:::o;31973:366::-;32115:3;32136:67;32200:2;32195:3;32136:67;:::i;:::-;32129:74;;32212:93;32301:3;32212:93;:::i;:::-;32330:2;32325:3;32321:12;32314:19;;31973:366;;;:::o;32345:419::-;32511:4;32549:2;32538:9;32534:18;32526:26;;32598:9;32592:4;32588:20;32584:1;32573:9;32569:17;32562:47;32626:131;32752:4;32626:131;:::i;:::-;32618:139;;32345:419;;;:::o;32770:176::-;32910:28;32906:1;32898:6;32894:14;32887:52;32770:176;:::o;32952:366::-;33094:3;33115:67;33179:2;33174:3;33115:67;:::i;:::-;33108:74;;33191:93;33280:3;33191:93;:::i;:::-;33309:2;33304:3;33300:12;33293:19;;32952:366;;;:::o;33324:419::-;33490:4;33528:2;33517:9;33513:18;33505:26;;33577:9;33571:4;33567:20;33563:1;33552:9;33548:17;33541:47;33605:131;33731:4;33605:131;:::i;:::-;33597:139;;33324:419;;;:::o;33749:238::-;33889:34;33885:1;33877:6;33873:14;33866:58;33958:21;33953:2;33945:6;33941:15;33934:46;33749:238;:::o;33993:366::-;34135:3;34156:67;34220:2;34215:3;34156:67;:::i;:::-;34149:74;;34232:93;34321:3;34232:93;:::i;:::-;34350:2;34345:3;34341:12;34334:19;;33993:366;;;:::o;34365:419::-;34531:4;34569:2;34558:9;34554:18;34546:26;;34618:9;34612:4;34608:20;34604:1;34593:9;34589:17;34582:47;34646:131;34772:4;34646:131;:::i;:::-;34638:139;;34365:419;;;:::o;34790:181::-;34930:33;34926:1;34918:6;34914:14;34907:57;34790:181;:::o;34977:366::-;35119:3;35140:67;35204:2;35199:3;35140:67;:::i;:::-;35133:74;;35216:93;35305:3;35216:93;:::i;:::-;35334:2;35329:3;35325:12;35318:19;;34977:366;;;:::o;35349:419::-;35515:4;35553:2;35542:9;35538:18;35530:26;;35602:9;35596:4;35592:20;35588:1;35577:9;35573:17;35566:47;35630:131;35756:4;35630:131;:::i;:::-;35622:139;;35349:419;;;:::o;35774:141::-;35823:4;35846:3;35838:11;;35869:3;35866:1;35859:14;35903:4;35900:1;35890:18;35882:26;;35774:141;;;:::o;35945:845::-;36048:3;36085:5;36079:12;36114:36;36140:9;36114:36;:::i;:::-;36166:89;36248:6;36243:3;36166:89;:::i;:::-;36159:96;;36286:1;36275:9;36271:17;36302:1;36297:137;;;;36448:1;36443:341;;;;36264:520;;36297:137;36381:4;36377:9;36366;36362:25;36357:3;36350:38;36417:6;36412:3;36408:16;36401:23;;36297:137;;36443:341;36510:38;36542:5;36510:38;:::i;:::-;36570:1;36584:154;36598:6;36595:1;36592:13;36584:154;;;36672:7;36666:14;36662:1;36657:3;36653:11;36646:35;36722:1;36713:7;36709:15;36698:26;;36620:4;36617:1;36613:12;36608:17;;36584:154;;;36767:6;36762:3;36758:16;36751:23;;36450:334;;36264:520;;36052:738;;35945:845;;;;:::o;36796:377::-;36902:3;36930:39;36963:5;36930:39;:::i;:::-;36985:89;37067:6;37062:3;36985:89;:::i;:::-;36978:96;;37083:52;37128:6;37123:3;37116:4;37109:5;37105:16;37083:52;:::i;:::-;37160:6;37155:3;37151:16;37144:23;;36906:267;36796:377;;;;:::o;37179:155::-;37319:7;37315:1;37307:6;37303:14;37296:31;37179:155;:::o;37340:400::-;37500:3;37521:84;37603:1;37598:3;37521:84;:::i;:::-;37514:91;;37614:93;37703:3;37614:93;:::i;:::-;37732:1;37727:3;37723:11;37716:18;;37340:400;;;:::o;37746:695::-;38024:3;38046:92;38134:3;38125:6;38046:92;:::i;:::-;38039:99;;38155:95;38246:3;38237:6;38155:95;:::i;:::-;38148:102;;38267:148;38411:3;38267:148;:::i;:::-;38260:155;;38432:3;38425:10;;37746:695;;;;;:::o;38447:158::-;38587:10;38583:1;38575:6;38571:14;38564:34;38447:158;:::o;38611:365::-;38753:3;38774:66;38838:1;38833:3;38774:66;:::i;:::-;38767:73;;38849:93;38938:3;38849:93;:::i;:::-;38967:2;38962:3;38958:12;38951:19;;38611:365;;;:::o;38982:419::-;39148:4;39186:2;39175:9;39171:18;39163:26;;39235:9;39229:4;39225:20;39221:1;39210:9;39206:17;39199:47;39263:131;39389:4;39263:131;:::i;:::-;39255:139;;38982:419;;;:::o;39407:163::-;39547:15;39543:1;39535:6;39531:14;39524:39;39407:163;:::o;39576:366::-;39718:3;39739:67;39803:2;39798:3;39739:67;:::i;:::-;39732:74;;39815:93;39904:3;39815:93;:::i;:::-;39933:2;39928:3;39924:12;39917:19;;39576:366;;;:::o;39948:419::-;40114:4;40152:2;40141:9;40137:18;40129:26;;40201:9;40195:4;40191:20;40187:1;40176:9;40172:17;40165:47;40229:131;40355:4;40229:131;:::i;:::-;40221:139;;39948:419;;;:::o;40373:167::-;40513:19;40509:1;40501:6;40497:14;40490:43;40373:167;:::o;40546:366::-;40688:3;40709:67;40773:2;40768:3;40709:67;:::i;:::-;40702:74;;40785:93;40874:3;40785:93;:::i;:::-;40903:2;40898:3;40894:12;40887:19;;40546:366;;;:::o;40918:419::-;41084:4;41122:2;41111:9;41107:18;41099:26;;41171:9;41165:4;41161:20;41157:1;41146:9;41142:17;41135:47;41199:131;41325:4;41199:131;:::i;:::-;41191:139;;40918:419;;;:::o;41343:234::-;41483:34;41479:1;41471:6;41467:14;41460:58;41552:17;41547:2;41539:6;41535:15;41528:42;41343:234;:::o;41583:366::-;41725:3;41746:67;41810:2;41805:3;41746:67;:::i;:::-;41739:74;;41822:93;41911:3;41822:93;:::i;:::-;41940:2;41935:3;41931:12;41924:19;;41583:366;;;:::o;41955:419::-;42121:4;42159:2;42148:9;42144:18;42136:26;;42208:9;42202:4;42198:20;42194:1;42183:9;42179:17;42172:47;42236:131;42362:4;42236:131;:::i;:::-;42228:139;;41955:419;;;:::o;42380:225::-;42520:34;42516:1;42508:6;42504:14;42497:58;42589:8;42584:2;42576:6;42572:15;42565:33;42380:225;:::o;42611:366::-;42753:3;42774:67;42838:2;42833:3;42774:67;:::i;:::-;42767:74;;42850:93;42939:3;42850:93;:::i;:::-;42968:2;42963:3;42959:12;42952:19;;42611:366;;;:::o;42983:419::-;43149:4;43187:2;43176:9;43172:18;43164:26;;43236:9;43230:4;43226:20;43222:1;43211:9;43207:17;43200:47;43264:131;43390:4;43264:131;:::i;:::-;43256:139;;42983:419;;;:::o;43408:173::-;43548:25;43544:1;43536:6;43532:14;43525:49;43408:173;:::o;43587:366::-;43729:3;43750:67;43814:2;43809:3;43750:67;:::i;:::-;43743:74;;43826:93;43915:3;43826:93;:::i;:::-;43944:2;43939:3;43935:12;43928:19;;43587:366;;;:::o;43959:419::-;44125:4;44163:2;44152:9;44148:18;44140:26;;44212:9;44206:4;44202:20;44198:1;44187:9;44183:17;44176:47;44240:131;44366:4;44240:131;:::i;:::-;44232:139;;43959:419;;;:::o;44384:137::-;44438:5;44469:6;44463:13;44454:22;;44485:30;44509:5;44485:30;:::i;:::-;44384:137;;;;:::o;44527:345::-;44594:6;44643:2;44631:9;44622:7;44618:23;44614:32;44611:119;;;44649:79;;:::i;:::-;44611:119;44769:1;44794:61;44847:7;44838:6;44827:9;44823:22;44794:61;:::i;:::-;44784:71;;44740:125;44527:345;;;;:::o;44878:166::-;45018:18;45014:1;45006:6;45002:14;44995:42;44878:166;:::o;45050:366::-;45192:3;45213:67;45277:2;45272:3;45213:67;:::i;:::-;45206:74;;45289:93;45378:3;45289:93;:::i;:::-;45407:2;45402:3;45398:12;45391:19;;45050:366;;;:::o;45422:419::-;45588:4;45626:2;45615:9;45611:18;45603:26;;45675:9;45669:4;45665:20;45661:1;45650:9;45646:17;45639:47;45703:131;45829:4;45703:131;:::i;:::-;45695:139;;45422:419;;;:::o;45847:237::-;45987:34;45983:1;45975:6;45971:14;45964:58;46056:20;46051:2;46043:6;46039:15;46032:45;45847:237;:::o;46090:366::-;46232:3;46253:67;46317:2;46312:3;46253:67;:::i;:::-;46246:74;;46329:93;46418:3;46329:93;:::i;:::-;46447:2;46442:3;46438:12;46431:19;;46090:366;;;:::o;46462:419::-;46628:4;46666:2;46655:9;46651:18;46643:26;;46715:9;46709:4;46705:20;46701:1;46690:9;46686:17;46679:47;46743:131;46869:4;46743:131;:::i;:::-;46735:139;;46462:419;;;:::o;46887:225::-;47027:34;47023:1;47015:6;47011:14;47004:58;47096:8;47091:2;47083:6;47079:15;47072:33;46887:225;:::o;47118:366::-;47260:3;47281:67;47345:2;47340:3;47281:67;:::i;:::-;47274:74;;47357:93;47446:3;47357:93;:::i;:::-;47475:2;47470:3;47466:12;47459:19;;47118:366;;;:::o;47490:419::-;47656:4;47694:2;47683:9;47679:18;47671:26;;47743:9;47737:4;47733:20;47729:1;47718:9;47714:17;47707:47;47771:131;47897:4;47771:131;:::i;:::-;47763:139;;47490:419;;;:::o;47915:224::-;48055:34;48051:1;48043:6;48039:14;48032:58;48124:7;48119:2;48111:6;48107:15;48100:32;47915:224;:::o;48145:366::-;48287:3;48308:67;48372:2;48367:3;48308:67;:::i;:::-;48301:74;;48384:93;48473:3;48384:93;:::i;:::-;48502:2;48497:3;48493:12;48486:19;;48145:366;;;:::o;48517:419::-;48683:4;48721:2;48710:9;48706:18;48698:26;;48770:9;48764:4;48760:20;48756:1;48745:9;48741:17;48734:47;48798:131;48924:4;48798:131;:::i;:::-;48790:139;;48517:419;;;:::o;48942:147::-;49043:11;49080:3;49065:18;;48942:147;;;;:::o;49095:114::-;;:::o;49215:398::-;49374:3;49395:83;49476:1;49471:3;49395:83;:::i;:::-;49388:90;;49487:93;49576:3;49487:93;:::i;:::-;49605:1;49600:3;49596:11;49589:18;;49215:398;;;:::o;49619:379::-;49803:3;49825:147;49968:3;49825:147;:::i;:::-;49818:154;;49989:3;49982:10;;49619:379;;;:::o;50004:170::-;50144:22;50140:1;50132:6;50128:14;50121:46;50004:170;:::o;50180:366::-;50322:3;50343:67;50407:2;50402:3;50343:67;:::i;:::-;50336:74;;50419:93;50508:3;50419:93;:::i;:::-;50537:2;50532:3;50528:12;50521:19;;50180:366;;;:::o;50552:419::-;50718:4;50756:2;50745:9;50741:18;50733:26;;50805:9;50799:4;50795:20;50791:1;50780:9;50776:17;50769:47;50833:131;50959:4;50833:131;:::i;:::-;50825:139;;50552:419;;;:::o;50977:229::-;51117:34;51113:1;51105:6;51101:14;51094:58;51186:12;51181:2;51173:6;51169:15;51162:37;50977:229;:::o;51212:366::-;51354:3;51375:67;51439:2;51434:3;51375:67;:::i;:::-;51368:74;;51451:93;51540:3;51451:93;:::i;:::-;51569:2;51564:3;51560:12;51553:19;;51212:366;;;:::o;51584:419::-;51750:4;51788:2;51777:9;51773:18;51765:26;;51837:9;51831:4;51827:20;51823:1;51812:9;51808:17;51801:47;51865:131;51991:4;51865:131;:::i;:::-;51857:139;;51584:419;;;:::o;52009:234::-;52149:34;52145:1;52137:6;52133:14;52126:58;52218:17;52213:2;52205:6;52201:15;52194:42;52009:234;:::o;52249:366::-;52391:3;52412:67;52476:2;52471:3;52412:67;:::i;:::-;52405:74;;52488:93;52577:3;52488:93;:::i;:::-;52606:2;52601:3;52597:12;52590:19;;52249:366;;;:::o;52621:419::-;52787:4;52825:2;52814:9;52810:18;52802:26;;52874:9;52868:4;52864:20;52860:1;52849:9;52845:17;52838:47;52902:131;53028:4;52902:131;:::i;:::-;52894:139;;52621:419;;;:::o;53046:98::-;53097:6;53131:5;53125:12;53115:22;;53046:98;;;:::o;53150:168::-;53233:11;53267:6;53262:3;53255:19;53307:4;53302:3;53298:14;53283:29;;53150:168;;;;:::o;53324:360::-;53410:3;53438:38;53470:5;53438:38;:::i;:::-;53492:70;53555:6;53550:3;53492:70;:::i;:::-;53485:77;;53571:52;53616:6;53611:3;53604:4;53597:5;53593:16;53571:52;:::i;:::-;53648:29;53670:6;53648:29;:::i;:::-;53643:3;53639:39;53632:46;;53414:270;53324:360;;;;:::o;53690:640::-;53885:4;53923:3;53912:9;53908:19;53900:27;;53937:71;54005:1;53994:9;53990:17;53981:6;53937:71;:::i;:::-;54018:72;54086:2;54075:9;54071:18;54062:6;54018:72;:::i;:::-;54100;54168:2;54157:9;54153:18;54144:6;54100:72;:::i;:::-;54219:9;54213:4;54209:20;54204:2;54193:9;54189:18;54182:48;54247:76;54318:4;54309:6;54247:76;:::i;:::-;54239:84;;53690:640;;;;;;;:::o;54336:141::-;54392:5;54423:6;54417:13;54408:22;;54439:32;54465:5;54439:32;:::i;:::-;54336:141;;;;:::o;54483:349::-;54552:6;54601:2;54589:9;54580:7;54576:23;54572:32;54569:119;;;54607:79;;:::i;:::-;54569:119;54727:1;54752:63;54807:7;54798:6;54787:9;54783:22;54752:63;:::i;:::-;54742:73;;54698:127;54483:349;;;;:::o;54838:233::-;54877:3;54900:24;54918:5;54900:24;:::i;:::-;54891:33;;54946:66;54939:5;54936:77;54933:103;;;55016:18;;:::i;:::-;54933:103;55063:1;55056:5;55052:13;55045:20;;54838:233;;;:::o;55077:180::-;55125:77;55122:1;55115:88;55222:4;55219:1;55212:15;55246:4;55243:1;55236:15;55263:185;55303:1;55320:20;55338:1;55320:20;:::i;:::-;55315:25;;55354:20;55372:1;55354:20;:::i;:::-;55349:25;;55393:1;55383:35;;55398:18;;:::i;:::-;55383:35;55440:1;55437;55433:9;55428:14;;55263:185;;;;:::o;55454:191::-;55494:4;55514:20;55532:1;55514:20;:::i;:::-;55509:25;;55548:20;55566:1;55548:20;:::i;:::-;55543:25;;55587:1;55584;55581:8;55578:34;;;55592:18;;:::i;:::-;55578:34;55637:1;55634;55630:9;55622:17;;55454:191;;;;:::o;55651:176::-;55683:1;55700:20;55718:1;55700:20;:::i;:::-;55695:25;;55734:20;55752:1;55734:20;:::i;:::-;55729:25;;55773:1;55763:35;;55778:18;;:::i;:::-;55763:35;55819:1;55816;55812:9;55807:14;;55651:176;;;;:::o;55833:180::-;55881:77;55878:1;55871:88;55978:4;55975:1;55968:15;56002:4;55999:1;55992:15;56019:236;56159:34;56155:1;56147:6;56143:14;56136:58;56228:19;56223:2;56215:6;56211:15;56204:44;56019:236;:::o;56261:366::-;56403:3;56424:67;56488:2;56483:3;56424:67;:::i;:::-;56417:74;;56500:93;56589:3;56500:93;:::i;:::-;56618:2;56613:3;56609:12;56602:19;;56261:366;;;:::o;56633:419::-;56799:4;56837:2;56826:9;56822:18;56814:26;;56886:9;56880:4;56876:20;56872:1;56861:9;56857:17;56850:47;56914:131;57040:4;56914:131;:::i;:::-;56906:139;;56633:419;;;:::o;57058:220::-;57198:34;57194:1;57186:6;57182:14;57175:58;57267:3;57262:2;57254:6;57250:15;57243:28;57058:220;:::o;57284:366::-;57426:3;57447:67;57511:2;57506:3;57447:67;:::i;:::-;57440:74;;57523:93;57612:3;57523:93;:::i;:::-;57641:2;57636:3;57632:12;57625:19;;57284:366;;;:::o;57656:419::-;57822:4;57860:2;57849:9;57845:18;57837:26;;57909:9;57903:4;57899:20;57895:1;57884:9;57880:17;57873:47;57937:131;58063:4;57937:131;:::i;:::-;57929:139;;57656:419;;;:::o;58081:227::-;58221:34;58217:1;58209:6;58205:14;58198:58;58290:10;58285:2;58277:6;58273:15;58266:35;58081:227;:::o;58314:366::-;58456:3;58477:67;58541:2;58536:3;58477:67;:::i;:::-;58470:74;;58553:93;58642:3;58553:93;:::i;:::-;58671:2;58666:3;58662:12;58655:19;;58314:366;;;:::o;58686:419::-;58852:4;58890:2;58879:9;58875:18;58867:26;;58939:9;58933:4;58929:20;58925:1;58914:9;58910:17;58903:47;58967:131;59093:4;58967:131;:::i;:::-;58959:139;;58686:419;;;:::o

Swarm Source

ipfs://4fc370ab98e8e3b19f00121411611a90fe348f331189b5cb2f141b7e572bb8d4
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.