ETH Price: $3,249.49 (-0.65%)

Token

Dixels (DIXELS)
 

Overview

Max Total Supply

365 DIXELS

Holders

35

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 DIXELS
0x532bb8b92e0c781dfc361d3fe26e004339517815
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Dixels

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/access/[email protected]


// OpenZeppelin Contracts v4.4.1 (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/introspection/[email protected]


// 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/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (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`.
     *
     * 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;

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);
}


// File @openzeppelin/contracts/security/[email protected]


// 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/token/ERC721/[email protected]


// OpenZeppelin Contracts (last updated v4.6.0) (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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]


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

pragma solidity ^0.8.0;

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

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

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


// File @openzeppelin/contracts/utils/[email protected]


// 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/utils/[email protected]


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

pragma solidity ^0.8.0;

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

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

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

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

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


// File @openzeppelin/contracts/utils/introspection/[email protected]


// 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 contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 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 Context, ERC165, IERC721, IERC721Metadata {
    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;

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

    function totalSupply() public view returns (uint256) {
        return currentIndex;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        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 override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public 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 {
        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 {}
}

pragma solidity ^0.8.0;

contract Dixels is Ownable, ERC721A, ReentrancyGuard {
    string public baseURI = "https://dixels.xyz/metadata/";
	uint256 public price = 0.0069 ether;
    uint256 public maxSupply = 10000;
	uint256 public maxPerTx = 20;
	uint256 public maxPerWallet = 20;
	bool public mintEnabled = false;

    mapping(address => uint256) public mintedPerAddress;

    constructor() ERC721A("Dixels", "DIXELS") {}

	/************************
	 * Our minting functions
	 ************************/

	function mint(uint256 _quantity) external payable nonReentrant {
        require(mintEnabled, "Minting hasn't been enabled yet.");
		require(msg.sender == tx.origin, "No minting from contracts.");
        require(_quantity > 0, "Quantity must be greater than 0.");
		require(totalSupply() + _quantity < maxSupply + 1, "This would exceed our maximum supply.");
        require(mintedPerAddress[msg.sender] + _quantity < maxPerWallet + 1, "This would exceed the maximum amount of Dixels your wallet can mint.");
        require(_quantity < maxPerTx + 1, "You're trying to mint too many Dixels in one transaction.");
		require(msg.value == _quantity * price, "Please send the exact amount of eth.");

        mintedPerAddress[msg.sender] += _quantity;

		_safeMint(msg.sender, _quantity);
	}

    function mintForAddresses(address[] calldata _addresses, uint256 _quantity) public onlyOwner {
		uint256 addressLength = _addresses.length;
		uint256 amt = addressLength * _quantity;

		require(totalSupply() + amt < maxSupply + 1, "This would exceed our maximum supply.");

		for (uint i = 0; i < addressLength; i++) {
			_safeMint(_addresses[i], _quantity);
		}
	}

	/**********************************************************************
	 * Overwrite some functions to return the proper baseURI and tokenURI.
	 **********************************************************************/
	
	function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

	function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        string memory uri = super.tokenURI(tokenId);

        return bytes(uri).length > 0 ? string(abi.encodePacked(uri, ".json")) : "";
    }

    /********************************************************
	 * Change some of our Contract's variables if necessary.
	 ********************************************************/

	function toggleMinting() external onlyOwner {
		mintEnabled = !mintEnabled;
	}

	function setBaseURI(string calldata _uri) external onlyOwner {
		baseURI = _uri;
	}

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

	function setMaxPerTx(uint256 _maxPerTx) external onlyOwner {
		maxPerTx = _maxPerTx;
	}

	function setMaxPerWallet(uint256 _maxPerWallet) external onlyOwner {
		maxPerWallet = _maxPerWallet;
	}

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

	/************************************
	 * Withdraw funds from the Contract.
	 ************************************/

	function withdraw() external onlyOwner nonReentrant {
		(bool success, ) = msg.sender.call{value: address(this).balance}("");
		require(success, "Transfer failed.");
	}
}

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":[{"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mintForAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedPerAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerWallet","type":"uint256"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280601c81526020017f68747470733a2f2f646978656c732e78797a2f6d657461646174612f00000000815250600990816200004a919062000495565b506618838370f34000600a55612710600b556014600c556014600d556000600e60006101000a81548160ff0219169083151502179055503480156200008e57600080fd5b506040518060400160405280600681526020017f446978656c7300000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f444958454c5300000000000000000000000000000000000000000000000000008152506200011b6200010f6200014f60201b60201c565b6200015760201b60201c565b81600290816200012c919062000495565b5080600390816200013e919062000495565b50505060016008819055506200057c565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200029d57607f821691505b602082108103620002b357620002b262000255565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200031d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620002de565b620003298683620002de565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000376620003706200036a8462000341565b6200034b565b62000341565b9050919050565b6000819050919050565b620003928362000355565b620003aa620003a1826200037d565b848454620002eb565b825550505050565b600090565b620003c1620003b2565b620003ce81848462000387565b505050565b5b81811015620003f657620003ea600082620003b7565b600181019050620003d4565b5050565b601f82111562000445576200040f81620002b9565b6200041a84620002ce565b810160208510156200042a578190505b620004426200043985620002ce565b830182620003d3565b50505b505050565b600082821c905092915050565b60006200046a600019846008026200044a565b1980831691505092915050565b600062000485838362000457565b9150826002028217905092915050565b620004a0826200021b565b67ffffffffffffffff811115620004bc57620004bb62000226565b5b620004c8825462000284565b620004d5828285620003fa565b600060209050601f8311600181146200050d5760008415620004f8578287015190505b62000504858262000477565b86555062000574565b601f1984166200051d86620002b9565b60005b82811015620005475784890151825560018201915060208501945060208101905062000520565b8683101562000567578489015162000563601f89168262000457565b8355505b6001600288020188555050505b505050505050565b614799806200058c6000396000f3fe6080604052600436106101ee5760003560e01c80638670d1ed1161010d578063c6f6f216116100a0578063d5abeb011161006f578063d5abeb01146106b4578063e268e4d3146106df578063e985e9c514610708578063f2fde38b14610745578063f968adbe1461076e576101ee565b8063c6f6f216146105e6578063c87b56dd1461060f578063d12397301461064c578063d445b97814610677576101ee565b8063a035b1fe116100dc578063a035b1fe1461054d578063a0712d6814610578578063a22cb46514610594578063b88d4fde146105bd576101ee565b80638670d1ed146104a55780638da5cb5b146104ce57806391b7f5ed146104f957806395d89b4114610522576101ee565b8063453c2310116101855780636f8b44b0116101545780636f8b44b01461041157806370a082311461043a578063715018a6146104775780637d55094d1461048e576101ee565b8063453c23101461035557806355f804b3146103805780636352211e146103a95780636c0360eb146103e6576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780633ccfd60b1461031557806342842e0e1461032c576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612c95565b610799565b6040516102279190612cdd565b60405180910390f35b34801561023c57600080fd5b5061024561087b565b6040516102529190612d88565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612de0565b61090d565b60405161028f9190612e4e565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612e95565b610992565b005b3480156102cd57600080fd5b506102d6610aaa565b6040516102e39190612ee4565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612eff565b610ab4565b005b34801561032157600080fd5b5061032a610ac4565b005b34801561033857600080fd5b50610353600480360381019061034e9190612eff565b610c44565b005b34801561036157600080fd5b5061036a610c64565b6040516103779190612ee4565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a29190612fb7565b610c6a565b005b3480156103b557600080fd5b506103d060048036038101906103cb9190612de0565b610cfc565b6040516103dd9190612e4e565b60405180910390f35b3480156103f257600080fd5b506103fb610d12565b6040516104089190612d88565b60405180910390f35b34801561041d57600080fd5b5061043860048036038101906104339190612de0565b610da0565b005b34801561044657600080fd5b50610461600480360381019061045c9190613004565b610e26565b60405161046e9190612ee4565b60405180910390f35b34801561048357600080fd5b5061048c610f0e565b005b34801561049a57600080fd5b506104a3610f96565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613087565b61103e565b005b3480156104da57600080fd5b506104e361118b565b6040516104f09190612e4e565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190612de0565b6111b4565b005b34801561052e57600080fd5b5061053761123a565b6040516105449190612d88565b60405180910390f35b34801561055957600080fd5b506105626112cc565b60405161056f9190612ee4565b60405180910390f35b610592600480360381019061058d9190612de0565b6112d2565b005b3480156105a057600080fd5b506105bb60048036038101906105b69190613113565b611625565b005b3480156105c957600080fd5b506105e460048036038101906105df9190613283565b6117a5565b005b3480156105f257600080fd5b5061060d60048036038101906106089190612de0565b611801565b005b34801561061b57600080fd5b5061063660048036038101906106319190612de0565b611887565b6040516106439190612d88565b60405180910390f35b34801561065857600080fd5b506106616118dd565b60405161066e9190612cdd565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190613004565b6118f0565b6040516106ab9190612ee4565b60405180910390f35b3480156106c057600080fd5b506106c9611908565b6040516106d69190612ee4565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190612de0565b61190e565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613306565b611994565b60405161073c9190612cdd565b60405180910390f35b34801561075157600080fd5b5061076c60048036038101906107679190613004565b611a28565b005b34801561077a57600080fd5b50610783611b1f565b6040516107909190612ee4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610874575061087382611b25565b5b9050919050565b60606002805461088a90613375565b80601f01602080910402602001604051908101604052809291908181526020018280546108b690613375565b80156109035780601f106108d857610100808354040283529160200191610903565b820191906000526020600020905b8154815290600101906020018083116108e657829003601f168201915b5050505050905090565b600061091882611b8f565b610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613418565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099d82610cfc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a04906134aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a2c611b9d565b73ffffffffffffffffffffffffffffffffffffffff161480610a5b5750610a5a81610a55611b9d565b611994565b5b610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a919061353c565b60405180910390fd5b610aa5838383611ba5565b505050565b6000600154905090565b610abf838383611c57565b505050565b610acc611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610aea61118b565b73ffffffffffffffffffffffffffffffffffffffff1614610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b37906135a8565b60405180910390fd5b600260085403610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90613614565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610bb390613665565b60006040518083038185875af1925050503d8060008114610bf0576040519150601f19603f3d011682016040523d82523d6000602084013e610bf5565b606091505b5050905080610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906136c6565b60405180910390fd5b506001600881905550565b610c5f838383604051806020016040528060008152506117a5565b505050565b600d5481565b610c72611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610c9061118b565b73ffffffffffffffffffffffffffffffffffffffff1614610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906135a8565b60405180910390fd5b818160099182610cf792919061389d565b505050565b6000610d0782612195565b600001519050919050565b60098054610d1f90613375565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4b90613375565b8015610d985780601f10610d6d57610100808354040283529160200191610d98565b820191906000526020600020905b815481529060010190602001808311610d7b57829003601f168201915b505050505081565b610da8611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610dc661118b565b73ffffffffffffffffffffffffffffffffffffffff1614610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e13906135a8565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906139df565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610f16611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610f3461118b565b73ffffffffffffffffffffffffffffffffffffffff1614610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f81906135a8565b60405180910390fd5b610f94600061232f565b565b610f9e611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610fbc61118b565b73ffffffffffffffffffffffffffffffffffffffff1614611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906135a8565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b611046611b9d565b73ffffffffffffffffffffffffffffffffffffffff1661106461118b565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b1906135a8565b60405180910390fd5b6000838390509050600082826110d09190613a2e565b90506001600b546110e19190613a70565b816110ea610aaa565b6110f49190613a70565b10611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b90613b16565b60405180910390fd5b60005b828110156111835761117086868381811061115557611154613b36565b5b905060200201602081019061116a9190613004565b856123f3565b808061117b90613b65565b915050611137565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111bc611b9d565b73ffffffffffffffffffffffffffffffffffffffff166111da61118b565b73ffffffffffffffffffffffffffffffffffffffff1614611230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611227906135a8565b60405180910390fd5b80600a8190555050565b60606003805461124990613375565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613375565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b600a5481565b600260085403611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e90613614565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff1661136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613bf9565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390613c65565b60405180910390fd5b6000811161141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613cd1565b60405180910390fd5b6001600b5461142e9190613a70565b81611437610aaa565b6114419190613a70565b10611481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147890613b16565b60405180910390fd5b6001600d546114909190613a70565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114db9190613a70565b1061151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290613d89565b60405180910390fd5b6001600c5461152a9190613a70565b811061156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156290613e1b565b60405180910390fd5b600a54816115799190613a2e565b34146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190613ead565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116099190613a70565b9250508190555061161a33826123f3565b600160088190555050565b61162d611b9d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190613f19565b60405180910390fd5b80600760006116a7611b9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611754611b9d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117999190612cdd565b60405180910390a35050565b6117b0848484611c57565b6117bc84848484612411565b6117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613fab565b60405180910390fd5b50505050565b611809611b9d565b73ffffffffffffffffffffffffffffffffffffffff1661182761118b565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906135a8565b60405180910390fd5b80600c8190555050565b6060600061189483612598565b905060008151116118b457604051806020016040528060008152506118d5565b806040516020016118c59190614053565b6040516020818303038152906040525b915050919050565b600e60009054906101000a900460ff1681565b600f6020528060005260406000206000915090505481565b600b5481565b611916611b9d565b73ffffffffffffffffffffffffffffffffffffffff1661193461118b565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611981906135a8565b60405180910390fd5b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a30611b9d565b73ffffffffffffffffffffffffffffffffffffffff16611a4e61118b565b73ffffffffffffffffffffffffffffffffffffffff1614611aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9b906135a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a906140e7565b60405180910390fd5b611b1c8161232f565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c6282612195565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c89611b9d565b73ffffffffffffffffffffffffffffffffffffffff161480611ce55750611cae611b9d565b73ffffffffffffffffffffffffffffffffffffffff16611ccd8461090d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d015750611d008260000151611cfb611b9d565b611994565b5b905080611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90614179565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac9061420b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b9061429d565b60405180910390fd5b611e31858585600161263f565b611e416000848460000151611ba5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036121255761208481611b8f565b156121245782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218e8585856001612645565b5050505050565b61219d612bef565b6121a682611b8f565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc9061432f565b60405180910390fd5b60008290505b600081106122ee576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122df57809250505061232a565b508080600190039150506121eb565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612321906143c1565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61240d82826040518060200160405280600081525061264b565b5050565b60006124328473ffffffffffffffffffffffffffffffffffffffff1661265d565b1561258b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261245b611b9d565b8786866040518563ffffffff1660e01b815260040161247d9493929190614436565b6020604051808303816000875af19250505080156124b957506040513d601f19601f820116820180604052508101906124b69190614497565b60015b61253b573d80600081146124e9576040519150601f19603f3d011682016040523d82523d6000602084013e6124ee565b606091505b506000815103612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a90613fab565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612590565b600190505b949350505050565b60606125a382611b8f565b6125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d990614536565b60405180910390fd5b60006125ec612680565b9050600081510361260c5760405180602001604052806000815250612637565b8061261684612712565b604051602001612627929190614556565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6126588383836001612872565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606009805461268f90613375565b80601f01602080910402602001604051908101604052809291908181526020018280546126bb90613375565b80156127085780601f106126dd57610100808354040283529160200191612708565b820191906000526020600020905b8154815290600101906020018083116126eb57829003601f168201915b5050505050905090565b606060008203612759576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061286d565b600082905060005b6000821461278b57808061277490613b65565b915050600a8261278491906145a9565b9150612761565b60008167ffffffffffffffff8111156127a7576127a6613158565b5b6040519080825280601f01601f1916602001820160405280156127d95781602001600182028036833780820191505090505b5090505b60008514612866576001826127f291906145da565b9150600a85612801919061460e565b603061280d9190613a70565b60f81b81838151811061282357612822613b36565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561285f91906145a9565b94506127dd565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906146b1565b60405180910390fd5b6000840361292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290614743565b60405180910390fd5b612938600086838761263f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612bd257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612bbd57612b7d6000888488612411565b612bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb390613fab565b60405180910390fd5b5b81806001019250508080600101915050612b06565b508060018190555050612be86000868387612645565b5050505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c7281612c3d565b8114612c7d57600080fd5b50565b600081359050612c8f81612c69565b92915050565b600060208284031215612cab57612caa612c33565b5b6000612cb984828501612c80565b91505092915050565b60008115159050919050565b612cd781612cc2565b82525050565b6000602082019050612cf26000830184612cce565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d32578082015181840152602081019050612d17565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d5a82612cf8565b612d648185612d03565b9350612d74818560208601612d14565b612d7d81612d3e565b840191505092915050565b60006020820190508181036000830152612da28184612d4f565b905092915050565b6000819050919050565b612dbd81612daa565b8114612dc857600080fd5b50565b600081359050612dda81612db4565b92915050565b600060208284031215612df657612df5612c33565b5b6000612e0484828501612dcb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3882612e0d565b9050919050565b612e4881612e2d565b82525050565b6000602082019050612e636000830184612e3f565b92915050565b612e7281612e2d565b8114612e7d57600080fd5b50565b600081359050612e8f81612e69565b92915050565b60008060408385031215612eac57612eab612c33565b5b6000612eba85828601612e80565b9250506020612ecb85828601612dcb565b9150509250929050565b612ede81612daa565b82525050565b6000602082019050612ef96000830184612ed5565b92915050565b600080600060608486031215612f1857612f17612c33565b5b6000612f2686828701612e80565b9350506020612f3786828701612e80565b9250506040612f4886828701612dcb565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612f7757612f76612f52565b5b8235905067ffffffffffffffff811115612f9457612f93612f57565b5b602083019150836001820283011115612fb057612faf612f5c565b5b9250929050565b60008060208385031215612fce57612fcd612c33565b5b600083013567ffffffffffffffff811115612fec57612feb612c38565b5b612ff885828601612f61565b92509250509250929050565b60006020828403121561301a57613019612c33565b5b600061302884828501612e80565b91505092915050565b60008083601f84011261304757613046612f52565b5b8235905067ffffffffffffffff81111561306457613063612f57565b5b6020830191508360208202830111156130805761307f612f5c565b5b9250929050565b6000806000604084860312156130a05761309f612c33565b5b600084013567ffffffffffffffff8111156130be576130bd612c38565b5b6130ca86828701613031565b935093505060206130dd86828701612dcb565b9150509250925092565b6130f081612cc2565b81146130fb57600080fd5b50565b60008135905061310d816130e7565b92915050565b6000806040838503121561312a57613129612c33565b5b600061313885828601612e80565b9250506020613149858286016130fe565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61319082612d3e565b810181811067ffffffffffffffff821117156131af576131ae613158565b5b80604052505050565b60006131c2612c29565b90506131ce8282613187565b919050565b600067ffffffffffffffff8211156131ee576131ed613158565b5b6131f782612d3e565b9050602081019050919050565b82818337600083830152505050565b6000613226613221846131d3565b6131b8565b90508281526020810184848401111561324257613241613153565b5b61324d848285613204565b509392505050565b600082601f83011261326a57613269612f52565b5b813561327a848260208601613213565b91505092915050565b6000806000806080858703121561329d5761329c612c33565b5b60006132ab87828801612e80565b94505060206132bc87828801612e80565b93505060406132cd87828801612dcb565b925050606085013567ffffffffffffffff8111156132ee576132ed612c38565b5b6132fa87828801613255565b91505092959194509250565b6000806040838503121561331d5761331c612c33565b5b600061332b85828601612e80565b925050602061333c85828601612e80565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061338d57607f821691505b6020821081036133a05761339f613346565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613402602d83612d03565b915061340d826133a6565b604082019050919050565b60006020820190508181036000830152613431816133f5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613494602283612d03565b915061349f82613438565b604082019050919050565b600060208201905081810360008301526134c381613487565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613526603983612d03565b9150613531826134ca565b604082019050919050565b6000602082019050818103600083015261355581613519565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613592602083612d03565b915061359d8261355c565b602082019050919050565b600060208201905081810360008301526135c181613585565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006135fe601f83612d03565b9150613609826135c8565b602082019050919050565b6000602082019050818103600083015261362d816135f1565b9050919050565b600081905092915050565b50565b600061364f600083613634565b915061365a8261363f565b600082019050919050565b600061367082613642565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136b0601083612d03565b91506136bb8261367a565b602082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613716565b61375d8683613716565b95508019841693508086168417925050509392505050565b6000819050919050565b600061379a61379561379084612daa565b613775565b612daa565b9050919050565b6000819050919050565b6137b48361377f565b6137c86137c0826137a1565b848454613723565b825550505050565b600090565b6137dd6137d0565b6137e88184846137ab565b505050565b5b8181101561380c576138016000826137d5565b6001810190506137ee565b5050565b601f82111561385157613822816136f1565b61382b84613706565b8101602085101561383a578190505b61384e61384685613706565b8301826137ed565b50505b505050565b600082821c905092915050565b600061387460001984600802613856565b1980831691505092915050565b600061388d8383613863565b9150826002028217905092915050565b6138a783836136e6565b67ffffffffffffffff8111156138c0576138bf613158565b5b6138ca8254613375565b6138d5828285613810565b6000601f83116001811461390457600084156138f2578287013590505b6138fc8582613881565b865550613964565b601f198416613912866136f1565b60005b8281101561393a57848901358255600182019150602085019450602081019050613915565b868310156139575784890135613953601f891682613863565b8355505b6001600288020188555050505b50505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006139c9602b83612d03565b91506139d48261396d565b604082019050919050565b600060208201905081810360008301526139f8816139bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a3982612daa565b9150613a4483612daa565b9250828202613a5281612daa565b91508282048414831517613a6957613a686139ff565b5b5092915050565b6000613a7b82612daa565b9150613a8683612daa565b9250828201905080821115613a9e57613a9d6139ff565b5b92915050565b7f5468697320776f756c6420657863656564206f7572206d6178696d756d20737560008201527f70706c792e000000000000000000000000000000000000000000000000000000602082015250565b6000613b00602583612d03565b9150613b0b82613aa4565b604082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b7082612daa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ba257613ba16139ff565b5b600182019050919050565b7f4d696e74696e67206861736e2774206265656e20656e61626c6564207965742e600082015250565b6000613be3602083612d03565b9150613bee82613bad565b602082019050919050565b60006020820190508181036000830152613c1281613bd6565b9050919050565b7f4e6f206d696e74696e672066726f6d20636f6e7472616374732e000000000000600082015250565b6000613c4f601a83612d03565b9150613c5a82613c19565b602082019050919050565b60006020820190508181036000830152613c7e81613c42565b9050919050565b7f5175616e74697479206d7573742062652067726561746572207468616e20302e600082015250565b6000613cbb602083612d03565b9150613cc682613c85565b602082019050919050565b60006020820190508181036000830152613cea81613cae565b9050919050565b7f5468697320776f756c642065786365656420746865206d6178696d756d20616d60008201527f6f756e74206f6620446978656c7320796f75722077616c6c65742063616e206d60208201527f696e742e00000000000000000000000000000000000000000000000000000000604082015250565b6000613d73604483612d03565b9150613d7e82613cf1565b606082019050919050565b60006020820190508181036000830152613da281613d66565b9050919050565b7f596f7527726520747279696e6720746f206d696e7420746f6f206d616e79204460008201527f6978656c7320696e206f6e65207472616e73616374696f6e2e00000000000000602082015250565b6000613e05603983612d03565b9150613e1082613da9565b604082019050919050565b60006020820190508181036000830152613e3481613df8565b9050919050565b7f506c656173652073656e642074686520657861637420616d6f756e74206f662060008201527f6574682e00000000000000000000000000000000000000000000000000000000602082015250565b6000613e97602483612d03565b9150613ea282613e3b565b604082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613f03601a83612d03565b9150613f0e82613ecd565b602082019050919050565b60006020820190508181036000830152613f3281613ef6565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613f95603383612d03565b9150613fa082613f39565b604082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b600081905092915050565b6000613fe182612cf8565b613feb8185613fcb565b9350613ffb818560208601612d14565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061403d600583613fcb565b915061404882614007565b600582019050919050565b600061405f8284613fd6565b915061406a82614030565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140d1602683612d03565b91506140dc82614075565b604082019050919050565b60006020820190508181036000830152614100816140c4565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614163603283612d03565b915061416e82614107565b604082019050919050565b6000602082019050818103600083015261419281614156565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006141f5602683612d03565b915061420082614199565b604082019050919050565b60006020820190508181036000830152614224816141e8565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614287602583612d03565b91506142928261422b565b604082019050919050565b600060208201905081810360008301526142b68161427a565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614319602a83612d03565b9150614324826142bd565b604082019050919050565b600060208201905081810360008301526143488161430c565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006143ab602f83612d03565b91506143b68261434f565b604082019050919050565b600060208201905081810360008301526143da8161439e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614408826143e1565b61441281856143ec565b9350614422818560208601612d14565b61442b81612d3e565b840191505092915050565b600060808201905061444b6000830187612e3f565b6144586020830186612e3f565b6144656040830185612ed5565b818103606083015261447781846143fd565b905095945050505050565b60008151905061449181612c69565b92915050565b6000602082840312156144ad576144ac612c33565b5b60006144bb84828501614482565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614520602f83612d03565b915061452b826144c4565b604082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b60006145628285613fd6565b915061456e8284613fd6565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006145b482612daa565b91506145bf83612daa565b9250826145cf576145ce61457a565b5b828204905092915050565b60006145e582612daa565b91506145f083612daa565b9250828203905081811115614608576146076139ff565b5b92915050565b600061461982612daa565b915061462483612daa565b9250826146345761463361457a565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061469b602183612d03565b91506146a68261463f565b604082019050919050565b600060208201905081810360008301526146ca8161468e565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061472d602883612d03565b9150614738826146d1565b604082019050919050565b6000602082019050818103600083015261475c81614720565b905091905056fea2646970667358221220b6050e2e1de939082b1544ccb9da83ea7b29e686932377b0a65eaf231fef5c3364736f6c63430008120033

Deployed Bytecode

0x6080604052600436106101ee5760003560e01c80638670d1ed1161010d578063c6f6f216116100a0578063d5abeb011161006f578063d5abeb01146106b4578063e268e4d3146106df578063e985e9c514610708578063f2fde38b14610745578063f968adbe1461076e576101ee565b8063c6f6f216146105e6578063c87b56dd1461060f578063d12397301461064c578063d445b97814610677576101ee565b8063a035b1fe116100dc578063a035b1fe1461054d578063a0712d6814610578578063a22cb46514610594578063b88d4fde146105bd576101ee565b80638670d1ed146104a55780638da5cb5b146104ce57806391b7f5ed146104f957806395d89b4114610522576101ee565b8063453c2310116101855780636f8b44b0116101545780636f8b44b01461041157806370a082311461043a578063715018a6146104775780637d55094d1461048e576101ee565b8063453c23101461035557806355f804b3146103805780636352211e146103a95780636c0360eb146103e6576101ee565b806318160ddd116101c157806318160ddd146102c157806323b872dd146102ec5780633ccfd60b1461031557806342842e0e1461032c576101ee565b806301ffc9a7146101f357806306fdde0314610230578063081812fc1461025b578063095ea7b314610298575b600080fd5b3480156101ff57600080fd5b5061021a60048036038101906102159190612c95565b610799565b6040516102279190612cdd565b60405180910390f35b34801561023c57600080fd5b5061024561087b565b6040516102529190612d88565b60405180910390f35b34801561026757600080fd5b50610282600480360381019061027d9190612de0565b61090d565b60405161028f9190612e4e565b60405180910390f35b3480156102a457600080fd5b506102bf60048036038101906102ba9190612e95565b610992565b005b3480156102cd57600080fd5b506102d6610aaa565b6040516102e39190612ee4565b60405180910390f35b3480156102f857600080fd5b50610313600480360381019061030e9190612eff565b610ab4565b005b34801561032157600080fd5b5061032a610ac4565b005b34801561033857600080fd5b50610353600480360381019061034e9190612eff565b610c44565b005b34801561036157600080fd5b5061036a610c64565b6040516103779190612ee4565b60405180910390f35b34801561038c57600080fd5b506103a760048036038101906103a29190612fb7565b610c6a565b005b3480156103b557600080fd5b506103d060048036038101906103cb9190612de0565b610cfc565b6040516103dd9190612e4e565b60405180910390f35b3480156103f257600080fd5b506103fb610d12565b6040516104089190612d88565b60405180910390f35b34801561041d57600080fd5b5061043860048036038101906104339190612de0565b610da0565b005b34801561044657600080fd5b50610461600480360381019061045c9190613004565b610e26565b60405161046e9190612ee4565b60405180910390f35b34801561048357600080fd5b5061048c610f0e565b005b34801561049a57600080fd5b506104a3610f96565b005b3480156104b157600080fd5b506104cc60048036038101906104c79190613087565b61103e565b005b3480156104da57600080fd5b506104e361118b565b6040516104f09190612e4e565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b9190612de0565b6111b4565b005b34801561052e57600080fd5b5061053761123a565b6040516105449190612d88565b60405180910390f35b34801561055957600080fd5b506105626112cc565b60405161056f9190612ee4565b60405180910390f35b610592600480360381019061058d9190612de0565b6112d2565b005b3480156105a057600080fd5b506105bb60048036038101906105b69190613113565b611625565b005b3480156105c957600080fd5b506105e460048036038101906105df9190613283565b6117a5565b005b3480156105f257600080fd5b5061060d60048036038101906106089190612de0565b611801565b005b34801561061b57600080fd5b5061063660048036038101906106319190612de0565b611887565b6040516106439190612d88565b60405180910390f35b34801561065857600080fd5b506106616118dd565b60405161066e9190612cdd565b60405180910390f35b34801561068357600080fd5b5061069e60048036038101906106999190613004565b6118f0565b6040516106ab9190612ee4565b60405180910390f35b3480156106c057600080fd5b506106c9611908565b6040516106d69190612ee4565b60405180910390f35b3480156106eb57600080fd5b5061070660048036038101906107019190612de0565b61190e565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613306565b611994565b60405161073c9190612cdd565b60405180910390f35b34801561075157600080fd5b5061076c60048036038101906107679190613004565b611a28565b005b34801561077a57600080fd5b50610783611b1f565b6040516107909190612ee4565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610874575061087382611b25565b5b9050919050565b60606002805461088a90613375565b80601f01602080910402602001604051908101604052809291908181526020018280546108b690613375565b80156109035780601f106108d857610100808354040283529160200191610903565b820191906000526020600020905b8154815290600101906020018083116108e657829003601f168201915b5050505050905090565b600061091882611b8f565b610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613418565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061099d82610cfc565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a04906134aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a2c611b9d565b73ffffffffffffffffffffffffffffffffffffffff161480610a5b5750610a5a81610a55611b9d565b611994565b5b610a9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a919061353c565b60405180910390fd5b610aa5838383611ba5565b505050565b6000600154905090565b610abf838383611c57565b505050565b610acc611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610aea61118b565b73ffffffffffffffffffffffffffffffffffffffff1614610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b37906135a8565b60405180910390fd5b600260085403610b85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7c90613614565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610bb390613665565b60006040518083038185875af1925050503d8060008114610bf0576040519150601f19603f3d011682016040523d82523d6000602084013e610bf5565b606091505b5050905080610c39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c30906136c6565b60405180910390fd5b506001600881905550565b610c5f838383604051806020016040528060008152506117a5565b505050565b600d5481565b610c72611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610c9061118b565b73ffffffffffffffffffffffffffffffffffffffff1614610ce6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdd906135a8565b60405180910390fd5b818160099182610cf792919061389d565b505050565b6000610d0782612195565b600001519050919050565b60098054610d1f90613375565b80601f0160208091040260200160405190810160405280929190818152602001828054610d4b90613375565b8015610d985780601f10610d6d57610100808354040283529160200191610d98565b820191906000526020600020905b815481529060010190602001808311610d7b57829003601f168201915b505050505081565b610da8611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610dc661118b565b73ffffffffffffffffffffffffffffffffffffffff1614610e1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e13906135a8565b60405180910390fd5b80600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e96576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8d906139df565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b610f16611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610f3461118b565b73ffffffffffffffffffffffffffffffffffffffff1614610f8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f81906135a8565b60405180910390fd5b610f94600061232f565b565b610f9e611b9d565b73ffffffffffffffffffffffffffffffffffffffff16610fbc61118b565b73ffffffffffffffffffffffffffffffffffffffff1614611012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611009906135a8565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b611046611b9d565b73ffffffffffffffffffffffffffffffffffffffff1661106461118b565b73ffffffffffffffffffffffffffffffffffffffff16146110ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b1906135a8565b60405180910390fd5b6000838390509050600082826110d09190613a2e565b90506001600b546110e19190613a70565b816110ea610aaa565b6110f49190613a70565b10611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b90613b16565b60405180910390fd5b60005b828110156111835761117086868381811061115557611154613b36565b5b905060200201602081019061116a9190613004565b856123f3565b808061117b90613b65565b915050611137565b505050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111bc611b9d565b73ffffffffffffffffffffffffffffffffffffffff166111da61118b565b73ffffffffffffffffffffffffffffffffffffffff1614611230576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611227906135a8565b60405180910390fd5b80600a8190555050565b60606003805461124990613375565b80601f016020809104026020016040519081016040528092919081815260200182805461127590613375565b80156112c25780601f10611297576101008083540402835291602001916112c2565b820191906000526020600020905b8154815290600101906020018083116112a557829003601f168201915b5050505050905090565b600a5481565b600260085403611317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130e90613614565b60405180910390fd5b6002600881905550600e60009054906101000a900460ff1661136e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136590613bf9565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146113dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d390613c65565b60405180910390fd5b6000811161141f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141690613cd1565b60405180910390fd5b6001600b5461142e9190613a70565b81611437610aaa565b6114419190613a70565b10611481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147890613b16565b60405180910390fd5b6001600d546114909190613a70565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114db9190613a70565b1061151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151290613d89565b60405180910390fd5b6001600c5461152a9190613a70565b811061156b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156290613e1b565b60405180910390fd5b600a54816115799190613a2e565b34146115ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b190613ead565b60405180910390fd5b80600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546116099190613a70565b9250508190555061161a33826123f3565b600160088190555050565b61162d611b9d565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361169a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169190613f19565b60405180910390fd5b80600760006116a7611b9d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611754611b9d565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117999190612cdd565b60405180910390a35050565b6117b0848484611c57565b6117bc84848484612411565b6117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613fab565b60405180910390fd5b50505050565b611809611b9d565b73ffffffffffffffffffffffffffffffffffffffff1661182761118b565b73ffffffffffffffffffffffffffffffffffffffff161461187d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611874906135a8565b60405180910390fd5b80600c8190555050565b6060600061189483612598565b905060008151116118b457604051806020016040528060008152506118d5565b806040516020016118c59190614053565b6040516020818303038152906040525b915050919050565b600e60009054906101000a900460ff1681565b600f6020528060005260406000206000915090505481565b600b5481565b611916611b9d565b73ffffffffffffffffffffffffffffffffffffffff1661193461118b565b73ffffffffffffffffffffffffffffffffffffffff161461198a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611981906135a8565b60405180910390fd5b80600d8190555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a30611b9d565b73ffffffffffffffffffffffffffffffffffffffff16611a4e61118b565b73ffffffffffffffffffffffffffffffffffffffff1614611aa4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9b906135a8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611b13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0a906140e7565b60405180910390fd5b611b1c8161232f565b50565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c6282612195565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611c89611b9d565b73ffffffffffffffffffffffffffffffffffffffff161480611ce55750611cae611b9d565b73ffffffffffffffffffffffffffffffffffffffff16611ccd8461090d565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d015750611d008260000151611cfb611b9d565b611994565b5b905080611d43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3a90614179565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dac9061420b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611e24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1b9061429d565b60405180910390fd5b611e31858585600161263f565b611e416000848460000151611ba5565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036121255761208481611b8f565b156121245782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461218e8585856001612645565b5050505050565b61219d612bef565b6121a682611b8f565b6121e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121dc9061432f565b60405180910390fd5b60008290505b600081106122ee576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122df57809250505061232a565b508080600190039150506121eb565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612321906143c1565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61240d82826040518060200160405280600081525061264b565b5050565b60006124328473ffffffffffffffffffffffffffffffffffffffff1661265d565b1561258b578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261245b611b9d565b8786866040518563ffffffff1660e01b815260040161247d9493929190614436565b6020604051808303816000875af19250505080156124b957506040513d601f19601f820116820180604052508101906124b69190614497565b60015b61253b573d80600081146124e9576040519150601f19603f3d011682016040523d82523d6000602084013e6124ee565b606091505b506000815103612533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252a90613fab565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612590565b600190505b949350505050565b60606125a382611b8f565b6125e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d990614536565b60405180910390fd5b60006125ec612680565b9050600081510361260c5760405180602001604052806000815250612637565b8061261684612712565b604051602001612627929190614556565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b6126588383836001612872565b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60606009805461268f90613375565b80601f01602080910402602001604051908101604052809291908181526020018280546126bb90613375565b80156127085780601f106126dd57610100808354040283529160200191612708565b820191906000526020600020905b8154815290600101906020018083116126eb57829003601f168201915b5050505050905090565b606060008203612759576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061286d565b600082905060005b6000821461278b57808061277490613b65565b915050600a8261278491906145a9565b9150612761565b60008167ffffffffffffffff8111156127a7576127a6613158565b5b6040519080825280601f01601f1916602001820160405280156127d95781602001600182028036833780820191505090505b5090505b60008514612866576001826127f291906145da565b9150600a85612801919061460e565b603061280d9190613a70565b60f81b81838151811061282357612822613b36565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561285f91906145a9565b94506127dd565b8093505050505b919050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036128e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128df906146b1565b60405180910390fd5b6000840361292b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161292290614743565b60405180910390fd5b612938600086838761263f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b85811015612bd257818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48315612bbd57612b7d6000888488612411565b612bbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb390613fab565b60405180910390fd5b5b81806001019250508080600101915050612b06565b508060018190555050612be86000868387612645565b5050505050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c7281612c3d565b8114612c7d57600080fd5b50565b600081359050612c8f81612c69565b92915050565b600060208284031215612cab57612caa612c33565b5b6000612cb984828501612c80565b91505092915050565b60008115159050919050565b612cd781612cc2565b82525050565b6000602082019050612cf26000830184612cce565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d32578082015181840152602081019050612d17565b60008484015250505050565b6000601f19601f8301169050919050565b6000612d5a82612cf8565b612d648185612d03565b9350612d74818560208601612d14565b612d7d81612d3e565b840191505092915050565b60006020820190508181036000830152612da28184612d4f565b905092915050565b6000819050919050565b612dbd81612daa565b8114612dc857600080fd5b50565b600081359050612dda81612db4565b92915050565b600060208284031215612df657612df5612c33565b5b6000612e0484828501612dcb565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e3882612e0d565b9050919050565b612e4881612e2d565b82525050565b6000602082019050612e636000830184612e3f565b92915050565b612e7281612e2d565b8114612e7d57600080fd5b50565b600081359050612e8f81612e69565b92915050565b60008060408385031215612eac57612eab612c33565b5b6000612eba85828601612e80565b9250506020612ecb85828601612dcb565b9150509250929050565b612ede81612daa565b82525050565b6000602082019050612ef96000830184612ed5565b92915050565b600080600060608486031215612f1857612f17612c33565b5b6000612f2686828701612e80565b9350506020612f3786828701612e80565b9250506040612f4886828701612dcb565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112612f7757612f76612f52565b5b8235905067ffffffffffffffff811115612f9457612f93612f57565b5b602083019150836001820283011115612fb057612faf612f5c565b5b9250929050565b60008060208385031215612fce57612fcd612c33565b5b600083013567ffffffffffffffff811115612fec57612feb612c38565b5b612ff885828601612f61565b92509250509250929050565b60006020828403121561301a57613019612c33565b5b600061302884828501612e80565b91505092915050565b60008083601f84011261304757613046612f52565b5b8235905067ffffffffffffffff81111561306457613063612f57565b5b6020830191508360208202830111156130805761307f612f5c565b5b9250929050565b6000806000604084860312156130a05761309f612c33565b5b600084013567ffffffffffffffff8111156130be576130bd612c38565b5b6130ca86828701613031565b935093505060206130dd86828701612dcb565b9150509250925092565b6130f081612cc2565b81146130fb57600080fd5b50565b60008135905061310d816130e7565b92915050565b6000806040838503121561312a57613129612c33565b5b600061313885828601612e80565b9250506020613149858286016130fe565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61319082612d3e565b810181811067ffffffffffffffff821117156131af576131ae613158565b5b80604052505050565b60006131c2612c29565b90506131ce8282613187565b919050565b600067ffffffffffffffff8211156131ee576131ed613158565b5b6131f782612d3e565b9050602081019050919050565b82818337600083830152505050565b6000613226613221846131d3565b6131b8565b90508281526020810184848401111561324257613241613153565b5b61324d848285613204565b509392505050565b600082601f83011261326a57613269612f52565b5b813561327a848260208601613213565b91505092915050565b6000806000806080858703121561329d5761329c612c33565b5b60006132ab87828801612e80565b94505060206132bc87828801612e80565b93505060406132cd87828801612dcb565b925050606085013567ffffffffffffffff8111156132ee576132ed612c38565b5b6132fa87828801613255565b91505092959194509250565b6000806040838503121561331d5761331c612c33565b5b600061332b85828601612e80565b925050602061333c85828601612e80565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061338d57607f821691505b6020821081036133a05761339f613346565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b6000613402602d83612d03565b915061340d826133a6565b604082019050919050565b60006020820190508181036000830152613431816133f5565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000613494602283612d03565b915061349f82613438565b604082019050919050565b600060208201905081810360008301526134c381613487565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b6000613526603983612d03565b9150613531826134ca565b604082019050919050565b6000602082019050818103600083015261355581613519565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613592602083612d03565b915061359d8261355c565b602082019050919050565b600060208201905081810360008301526135c181613585565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006135fe601f83612d03565b9150613609826135c8565b602082019050919050565b6000602082019050818103600083015261362d816135f1565b9050919050565b600081905092915050565b50565b600061364f600083613634565b915061365a8261363f565b600082019050919050565b600061367082613642565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136b0601083612d03565b91506136bb8261367a565b602082019050919050565b600060208201905081810360008301526136df816136a3565b9050919050565b600082905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026137537fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613716565b61375d8683613716565b95508019841693508086168417925050509392505050565b6000819050919050565b600061379a61379561379084612daa565b613775565b612daa565b9050919050565b6000819050919050565b6137b48361377f565b6137c86137c0826137a1565b848454613723565b825550505050565b600090565b6137dd6137d0565b6137e88184846137ab565b505050565b5b8181101561380c576138016000826137d5565b6001810190506137ee565b5050565b601f82111561385157613822816136f1565b61382b84613706565b8101602085101561383a578190505b61384e61384685613706565b8301826137ed565b50505b505050565b600082821c905092915050565b600061387460001984600802613856565b1980831691505092915050565b600061388d8383613863565b9150826002028217905092915050565b6138a783836136e6565b67ffffffffffffffff8111156138c0576138bf613158565b5b6138ca8254613375565b6138d5828285613810565b6000601f83116001811461390457600084156138f2578287013590505b6138fc8582613881565b865550613964565b601f198416613912866136f1565b60005b8281101561393a57848901358255600182019150602085019450602081019050613915565b868310156139575784890135613953601f891682613863565b8355505b6001600288020188555050505b50505050505050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006139c9602b83612d03565b91506139d48261396d565b604082019050919050565b600060208201905081810360008301526139f8816139bc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a3982612daa565b9150613a4483612daa565b9250828202613a5281612daa565b91508282048414831517613a6957613a686139ff565b5b5092915050565b6000613a7b82612daa565b9150613a8683612daa565b9250828201905080821115613a9e57613a9d6139ff565b5b92915050565b7f5468697320776f756c6420657863656564206f7572206d6178696d756d20737560008201527f70706c792e000000000000000000000000000000000000000000000000000000602082015250565b6000613b00602583612d03565b9150613b0b82613aa4565b604082019050919050565b60006020820190508181036000830152613b2f81613af3565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613b7082612daa565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613ba257613ba16139ff565b5b600182019050919050565b7f4d696e74696e67206861736e2774206265656e20656e61626c6564207965742e600082015250565b6000613be3602083612d03565b9150613bee82613bad565b602082019050919050565b60006020820190508181036000830152613c1281613bd6565b9050919050565b7f4e6f206d696e74696e672066726f6d20636f6e7472616374732e000000000000600082015250565b6000613c4f601a83612d03565b9150613c5a82613c19565b602082019050919050565b60006020820190508181036000830152613c7e81613c42565b9050919050565b7f5175616e74697479206d7573742062652067726561746572207468616e20302e600082015250565b6000613cbb602083612d03565b9150613cc682613c85565b602082019050919050565b60006020820190508181036000830152613cea81613cae565b9050919050565b7f5468697320776f756c642065786365656420746865206d6178696d756d20616d60008201527f6f756e74206f6620446978656c7320796f75722077616c6c65742063616e206d60208201527f696e742e00000000000000000000000000000000000000000000000000000000604082015250565b6000613d73604483612d03565b9150613d7e82613cf1565b606082019050919050565b60006020820190508181036000830152613da281613d66565b9050919050565b7f596f7527726520747279696e6720746f206d696e7420746f6f206d616e79204460008201527f6978656c7320696e206f6e65207472616e73616374696f6e2e00000000000000602082015250565b6000613e05603983612d03565b9150613e1082613da9565b604082019050919050565b60006020820190508181036000830152613e3481613df8565b9050919050565b7f506c656173652073656e642074686520657861637420616d6f756e74206f662060008201527f6574682e00000000000000000000000000000000000000000000000000000000602082015250565b6000613e97602483612d03565b9150613ea282613e3b565b604082019050919050565b60006020820190508181036000830152613ec681613e8a565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b6000613f03601a83612d03565b9150613f0e82613ecd565b602082019050919050565b60006020820190508181036000830152613f3281613ef6565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000613f95603383612d03565b9150613fa082613f39565b604082019050919050565b60006020820190508181036000830152613fc481613f88565b9050919050565b600081905092915050565b6000613fe182612cf8565b613feb8185613fcb565b9350613ffb818560208601612d14565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061403d600583613fcb565b915061404882614007565b600582019050919050565b600061405f8284613fd6565b915061406a82614030565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006140d1602683612d03565b91506140dc82614075565b604082019050919050565b60006020820190508181036000830152614100816140c4565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000614163603283612d03565b915061416e82614107565b604082019050919050565b6000602082019050818103600083015261419281614156565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006141f5602683612d03565b915061420082614199565b604082019050919050565b60006020820190508181036000830152614224816141e8565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614287602583612d03565b91506142928261422b565b604082019050919050565b600060208201905081810360008301526142b68161427a565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b6000614319602a83612d03565b9150614324826142bd565b604082019050919050565b600060208201905081810360008301526143488161430c565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b60006143ab602f83612d03565b91506143b68261434f565b604082019050919050565b600060208201905081810360008301526143da8161439e565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614408826143e1565b61441281856143ec565b9350614422818560208601612d14565b61442b81612d3e565b840191505092915050565b600060808201905061444b6000830187612e3f565b6144586020830186612e3f565b6144656040830185612ed5565b818103606083015261447781846143fd565b905095945050505050565b60008151905061449181612c69565b92915050565b6000602082840312156144ad576144ac612c33565b5b60006144bb84828501614482565b91505092915050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614520602f83612d03565b915061452b826144c4565b604082019050919050565b6000602082019050818103600083015261454f81614513565b9050919050565b60006145628285613fd6565b915061456e8284613fd6565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006145b482612daa565b91506145bf83612daa565b9250826145cf576145ce61457a565b5b828204905092915050565b60006145e582612daa565b91506145f083612daa565b9250828203905081811115614608576146076139ff565b5b92915050565b600061461982612daa565b915061462483612daa565b9250826146345761463361457a565b5b828206905092915050565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600061469b602183612d03565b91506146a68261463f565b604082019050919050565b600060208201905081810360008301526146ca8161468e565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061472d602883612d03565b9150614738826146d1565b604082019050919050565b6000602082019050818103600083015261475c81614720565b905091905056fea2646970667358221220b6050e2e1de939082b1544ccb9da83ea7b29e686932377b0a65eaf231fef5c3364736f6c63430008120033

Deployed Bytecode Sourcemap

40299:3321:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27399:293;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29174:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30736:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30257:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27236:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31612:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43446:171;;;;;;;;;;;;;:::i;:::-;;31845:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40527:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42835:85;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28983:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40359:54;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43226:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27756:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2589:103;;;;;;;;;;;;;:::i;:::-;;42750:80;;;;;;;;;;;;;:::i;:::-;;41606:374;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1938:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42928:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29343:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40417:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40798:800;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31022:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32093:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43019:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42323:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40563:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40603:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40459:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43113:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31381:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2847:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40495:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27399:293;27501:4;27549:25;27534:40;;;:11;:40;;;;:101;;;;27602:33;27587:48;;;:11;:48;;;;27534:101;:150;;;;27648:36;27672:11;27648:23;:36::i;:::-;27534:150;27518:166;;27399:293;;;:::o;29174:100::-;29228:13;29261:5;29254:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29174:100;:::o;30736:214::-;30804:7;30832:16;30840:7;30832;:16::i;:::-;30824:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30918:15;:24;30934:7;30918:24;;;;;;;;;;;;;;;;;;;;;30911:31;;30736:214;;;:::o;30257:413::-;30330:13;30346:24;30362:7;30346:15;:24::i;:::-;30330:40;;30395:5;30389:11;;:2;:11;;;30381:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30490:5;30474:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30499:37;30516:5;30523:12;:10;:12::i;:::-;30499:16;:37::i;:::-;30474:62;30452:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;30634:28;30643:2;30647:7;30656:5;30634:8;:28::i;:::-;30319:351;30257:413;;:::o;27236:91::-;27280:7;27307:12;;27300:19;;27236:91;:::o;31612:162::-;31738:28;31748:4;31754:2;31758:7;31738:9;:28::i;:::-;31612:162;;;:::o;43446:171::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11036:1:::1;11634:7;;:19:::0;11626:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;11036:1;11767:7;:18;;;;43504:12:::2;43522:10;:15;;43545:21;43522:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43503:68;;;43584:7;43576:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;43498:119;10992:1:::1;11946:7;:22;;;;43446:171::o:0;31845:177::-;31975:39;31992:4;31998:2;32002:7;31975:39;;;;;;;;;;;;:16;:39::i;:::-;31845:177;;;:::o;40527:32::-;;;;:::o;42835:85::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42911:4:::1;;42901:7;:14;;;;;;;:::i;:::-;;42835:85:::0;;:::o;28983:124::-;29047:7;29074:20;29086:7;29074:11;:20::i;:::-;:25;;;29067:32;;28983:124;;;:::o;40359:54::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;43226:93::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43304:10:::1;43292:9;:22;;;;43226:93:::0;:::o;27756:221::-;27820:7;27865:1;27848:19;;:5;:19;;;27840:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;27941:12;:19;27954:5;27941:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27933:36;;27926:43;;27756:221;;;:::o;2589:103::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2654:30:::1;2681:1;2654:18;:30::i;:::-;2589:103::o:0;42750:80::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42814:11:::1;;;;;;;;;;;42813:12;42799:11;;:26;;;;;;;;;;;;;;;;;;42750:80::o:0;41606:374::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41704:21:::1;41728:10;;:17;;41704:41;;41750:11;41780:9;41764:13;:25;;;;:::i;:::-;41750:39;;41838:1;41826:9;;:13;;;;:::i;:::-;41820:3;41804:13;:11;:13::i;:::-;:19;;;;:::i;:::-;:35;41796:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;41893:6;41888:88;41909:13;41905:1;:17;41888:88;;;41935:35;41945:10;;41956:1;41945:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;41960:9;41935;:35::i;:::-;41924:3;;;;;:::i;:::-;;;;41888:88;;;;41699:281;;41606:374:::0;;;:::o;1938:87::-;1984:7;2011:6;;;;;;;;;;;2004:13;;1938:87;:::o;42928:86::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43000:6:::1;42992:5;:14;;;;42928:86:::0;:::o;29343:104::-;29399:13;29432:7;29425:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29343:104;:::o;40417:35::-;;;;:::o;40798:800::-;11036:1;11634:7;;:19;11626:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;11036:1;11767:7;:18;;;;40880:11:::1;;;;;;;;;;;40872:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;40955:9;40941:23;;:10;:23;;;40933:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41026:1;41014:9;:13;41006:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;41117:1;41105:9;;:13;;;;:::i;:::-;41093:9;41077:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:41;41069:91;;;;;;;;;;;;:::i;:::-;;;;;;;;;41237:1;41222:12;;:16;;;;:::i;:::-;41210:9;41179:16;:28;41196:10;41179:28;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;:59;41171:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;41353:1;41342:8;;:12;;;;:::i;:::-;41330:9;:24;41322:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;41454:5;;41442:9;:17;;;;:::i;:::-;41429:9;:30;41421:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;41545:9;41513:16;:28;41530:10;41513:28;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;41561:32;41571:10;41583:9;41561;:32::i;:::-;10992:1:::0;11946:7;:22;;;;40798:800;:::o;31022:288::-;31129:12;:10;:12::i;:::-;31117:24;;:8;:24;;;31109:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31230:8;31185:18;:32;31204:12;:10;:12::i;:::-;31185:32;;;;;;;;;;;;;;;:42;31218:8;31185:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31283:8;31254:48;;31269:12;:10;:12::i;:::-;31254:48;;;31293:8;31254:48;;;;;;:::i;:::-;;;;;;;;31022:288;;:::o;32093:355::-;32252:28;32262:4;32268:2;32272:7;32252:9;:28::i;:::-;32313:48;32336:4;32342:2;32346:7;32355:5;32313:22;:48::i;:::-;32291:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;32093:355;;;;:::o;43019:89::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43094:9:::1;43083:8;:20;;;;43019:89:::0;:::o;42323:237::-;42396:13;42422:17;42442:23;42457:7;42442:14;:23::i;:::-;42422:43;;42505:1;42491:3;42485:17;:21;:67;;;;;;;;;;;;;;;;;42533:3;42516:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;42485:67;42478:74;;;42323:237;;;:::o;40563:31::-;;;;;;;;;;;;;:::o;40603:51::-;;;;;;;;;;;;;;;;;:::o;40459:32::-;;;;:::o;43113:105::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43200:13:::1;43185:12;:28;;;;43113:105:::0;:::o;31381:164::-;31478:4;31502:18;:25;31521:5;31502:25;;;;;;;;;;;;;;;:35;31528:8;31502:35;;;;;;;;;;;;;;;;;;;;;;;;;31495:42;;31381:164;;;;:::o;2847:201::-;2169:12;:10;:12::i;:::-;2158:23;;:7;:5;:7::i;:::-;:23;;;2150:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2956:1:::1;2936:22;;:8;:22;;::::0;2928:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3012:28;3031:8;3012:18;:28::i;:::-;2847:201:::0;:::o;40495:28::-;;;;:::o;25378:157::-;25463:4;25502:25;25487:40;;;:11;:40;;;;25480:47;;25378:157;;;:::o;32703:111::-;32760:4;32794:12;;32784:7;:22;32777:29;;32703:111;;;:::o;656:98::-;709:7;736:10;729:17;;656:98;:::o;37483:196::-;37625:2;37598:15;:24;37614:7;37598:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37663:7;37659:2;37643:28;;37652:5;37643:28;;;;;;;;;;;;37483:196;;;:::o;35431:1934::-;35546:35;35584:20;35596:7;35584:11;:20::i;:::-;35546:58;;35617:22;35659:13;:18;;;35643:34;;:12;:10;:12::i;:::-;:34;;;:83;;;;35714:12;:10;:12::i;:::-;35690:36;;:20;35702:7;35690:11;:20::i;:::-;:36;;;35643:83;:146;;;;35739:50;35756:13;:18;;;35776:12;:10;:12::i;:::-;35739:16;:50::i;:::-;35643:146;35617:173;;35811:17;35803:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;35926:4;35904:26;;:13;:18;;;:26;;;35896:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;36006:1;35992:16;;:2;:16;;;35984:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;36063:43;36085:4;36091:2;36095:7;36104:1;36063:21;:43::i;:::-;36171:49;36188:1;36192:7;36201:13;:18;;;36171:8;:49::i;:::-;36538:1;36508:12;:18;36521:4;36508:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36578:1;36550:12;:16;36563:2;36550:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36620:2;36592:11;:20;36604:7;36592:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;36678:15;36633:11;:20;36645:7;36633:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;36934:19;36966:1;36956:7;:11;36934:33;;37023:1;36982:43;;:11;:24;36994:11;36982:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;36978:275;;37046:20;37054:11;37046:7;:20::i;:::-;37042:200;;;37119:13;:18;;;37087:11;:24;37099:11;37087:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;37198:13;:28;;;37156:11;:24;37168:11;37156:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;37042:200;36978:275;36487:773;37296:7;37292:2;37277:27;;37286:4;37277:27;;;;;;;;;;;;37315:42;37336:4;37342:2;37346:7;37355:1;37315:20;:42::i;:::-;35535:1830;;35431:1934;;;:::o;28416:505::-;28477:21;;:::i;:::-;28519:16;28527:7;28519;:16::i;:::-;28511:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28617:12;28632:7;28617:22;;28612:225;28649:1;28641:4;:9;28612:225;;28675:31;28709:11;:17;28721:4;28709:17;;;;;;;;;;;28675:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28771:1;28745:28;;:9;:14;;;:28;;;28741:85;;28801:9;28794:16;;;;;;28741:85;28660:177;28652:6;;;;;;;;28612:225;;;;28856:57;;;;;;;;;;:::i;:::-;;;;;;;;28416:505;;;;:::o;3208:191::-;3282:16;3301:6;;;;;;;;;;;3282:25;;3327:8;3318:6;;:17;;;;;;;;;;;;;;;;;;3382:8;3351:40;;3372:8;3351:40;;;;;;;;;;;;3271:128;3208:191;:::o;32822:104::-;32891:27;32901:2;32905:8;32891:27;;;;;;;;;;;;:9;:27::i;:::-;32822:104;;:::o;38244:804::-;38399:4;38420:15;:2;:13;;;:15::i;:::-;38416:625;;;38472:2;38456:36;;;38493:12;:10;:12::i;:::-;38507:4;38513:7;38522:5;38456:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38452:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38719:1;38702:6;:13;:18;38698:273;;38745:61;;;;;;;;;;:::i;:::-;;;;;;;;38698:273;38921:6;38915:13;38906:6;38902:2;38898:15;38891:38;38452:534;38589:45;;;38579:55;;;:6;:55;;;;38572:62;;;;;38416:625;39025:4;39018:11;;38244:804;;;;;;;:::o;29518:335::-;29591:13;29625:16;29633:7;29625;:16::i;:::-;29617:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29706:21;29730:10;:8;:10::i;:::-;29706:34;;29783:1;29764:7;29758:21;:26;:87;;;;;;;;;;;;;;;;;29811:7;29820:18;:7;:16;:18::i;:::-;29794:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29758:87;29751:94;;;29518:335;;;:::o;39536:159::-;;;;;:::o;40107:158::-;;;;;:::o;33289:163::-;33412:32;33418:2;33422:8;33432:5;33439:4;33412:5;:32::i;:::-;33289:163;;;:::o;15105:326::-;15165:4;15422:1;15400:7;:19;;;:23;15393:30;;15105:326;;;:::o;42210:108::-;42270:13;42303:7;42296:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42210:108;:::o;22748:723::-;22804:13;23034:1;23025:5;:10;23021:53;;23052:10;;;;;;;;;;;;;;;;;;;;;23021:53;23084:12;23099:5;23084:20;;23115:14;23140:78;23155:1;23147:4;:9;23140:78;;23173:8;;;;;:::i;:::-;;;;23204:2;23196:10;;;;;:::i;:::-;;;23140:78;;;23228:19;23260:6;23250:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23228:39;;23278:154;23294:1;23285:5;:10;23278:154;;23322:1;23312:11;;;;;:::i;:::-;;;23389:2;23381:5;:10;;;;:::i;:::-;23368:2;:24;;;;:::i;:::-;23355:39;;23338:6;23345;23338:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;23418:2;23409:11;;;;;:::i;:::-;;;23278:154;;;23456:6;23442:21;;;;;22748:723;;;;:::o;33711:1466::-;33850:20;33873:12;;33850:35;;33918:1;33904:16;;:2;:16;;;33896:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33989:1;33977:8;:13;33969:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34048:61;34078:1;34082:2;34086:12;34100:8;34048:21;:61::i;:::-;34415:8;34379:12;:16;34392:2;34379:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34476:8;34435:12;:16;34448:2;34435:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34531:2;34498:11;:25;34510:12;34498:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;34594:15;34544:11;:25;34556:12;34544:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;34623:20;34646:12;34623:35;;34676:9;34671:379;34691:8;34687:1;:12;34671:379;;;34751:12;34747:2;34726:38;;34743:1;34726:38;;;;;;;;;;;;34783:4;34779:229;;;34838:59;34869:1;34873:2;34877:12;34891:5;34838:22;:59::i;:::-;34808:184;;;;;;;;;;;;:::i;:::-;;;;;;;;;34779:229;35024:14;;;;;;;34701:3;;;;;;;34671:379;;;;35077:12;35062;:27;;;;34358:739;35109:60;35138:1;35142:2;35146:12;35160:8;35109:20;:60::i;:::-;33839:1338;33711:1466;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:117;6222:1;6219;6212:12;6250:553;6308:8;6318:6;6368:3;6361:4;6353:6;6349:17;6345:27;6335:122;;6376:79;;:::i;:::-;6335:122;6489:6;6476:20;6466:30;;6519:18;6511:6;6508:30;6505:117;;;6541:79;;:::i;:::-;6505:117;6655:4;6647:6;6643:17;6631:29;;6709:3;6701:4;6693:6;6689:17;6679:8;6675:32;6672:41;6669:128;;;6716:79;;:::i;:::-;6669:128;6250:553;;;;;:::o;6809:529::-;6880:6;6888;6937:2;6925:9;6916:7;6912:23;6908:32;6905:119;;;6943:79;;:::i;:::-;6905:119;7091:1;7080:9;7076:17;7063:31;7121:18;7113:6;7110:30;7107:117;;;7143:79;;:::i;:::-;7107:117;7256:65;7313:7;7304:6;7293:9;7289:22;7256:65;:::i;:::-;7238:83;;;;7034:297;6809:529;;;;;:::o;7344:329::-;7403:6;7452:2;7440:9;7431:7;7427:23;7423:32;7420:119;;;7458:79;;:::i;:::-;7420:119;7578:1;7603:53;7648:7;7639:6;7628:9;7624:22;7603:53;:::i;:::-;7593:63;;7549:117;7344:329;;;;:::o;7696:568::-;7769:8;7779:6;7829:3;7822:4;7814:6;7810:17;7806:27;7796:122;;7837:79;;:::i;:::-;7796:122;7950:6;7937:20;7927:30;;7980:18;7972:6;7969:30;7966:117;;;8002:79;;:::i;:::-;7966:117;8116:4;8108:6;8104:17;8092:29;;8170:3;8162:4;8154:6;8150:17;8140:8;8136:32;8133:41;8130:128;;;8177:79;;:::i;:::-;8130:128;7696:568;;;;;:::o;8270:704::-;8365:6;8373;8381;8430:2;8418:9;8409:7;8405:23;8401:32;8398:119;;;8436:79;;:::i;:::-;8398:119;8584:1;8573:9;8569:17;8556:31;8614:18;8606:6;8603:30;8600:117;;;8636:79;;:::i;:::-;8600:117;8749:80;8821:7;8812:6;8801:9;8797:22;8749:80;:::i;:::-;8731:98;;;;8527:312;8878:2;8904:53;8949:7;8940:6;8929:9;8925:22;8904:53;:::i;:::-;8894:63;;8849:118;8270:704;;;;;:::o;8980:116::-;9050:21;9065:5;9050:21;:::i;:::-;9043:5;9040:32;9030:60;;9086:1;9083;9076:12;9030:60;8980:116;:::o;9102:133::-;9145:5;9183:6;9170:20;9161:29;;9199:30;9223:5;9199:30;:::i;:::-;9102:133;;;;:::o;9241:468::-;9306:6;9314;9363:2;9351:9;9342:7;9338:23;9334:32;9331:119;;;9369:79;;:::i;:::-;9331:119;9489:1;9514:53;9559:7;9550:6;9539:9;9535:22;9514:53;:::i;:::-;9504:63;;9460:117;9616:2;9642:50;9684:7;9675:6;9664:9;9660:22;9642:50;:::i;:::-;9632:60;;9587:115;9241:468;;;;;:::o;9715:117::-;9824:1;9821;9814:12;9838:180;9886:77;9883:1;9876:88;9983:4;9980:1;9973:15;10007:4;10004:1;9997:15;10024:281;10107:27;10129:4;10107:27;:::i;:::-;10099:6;10095:40;10237:6;10225:10;10222:22;10201:18;10189:10;10186:34;10183:62;10180:88;;;10248:18;;:::i;:::-;10180:88;10288:10;10284:2;10277:22;10067:238;10024:281;;:::o;10311:129::-;10345:6;10372:20;;:::i;:::-;10362:30;;10401:33;10429:4;10421:6;10401:33;:::i;:::-;10311:129;;;:::o;10446:307::-;10507:4;10597:18;10589:6;10586:30;10583:56;;;10619:18;;:::i;:::-;10583:56;10657:29;10679:6;10657:29;:::i;:::-;10649:37;;10741:4;10735;10731:15;10723:23;;10446:307;;;:::o;10759:146::-;10856:6;10851:3;10846;10833:30;10897:1;10888:6;10883:3;10879:16;10872:27;10759:146;;;:::o;10911:423::-;10988:5;11013:65;11029:48;11070:6;11029:48;:::i;:::-;11013:65;:::i;:::-;11004:74;;11101:6;11094:5;11087:21;11139:4;11132:5;11128:16;11177:3;11168:6;11163:3;11159:16;11156:25;11153:112;;;11184:79;;:::i;:::-;11153:112;11274:54;11321:6;11316:3;11311;11274:54;:::i;:::-;10994:340;10911:423;;;;;:::o;11353:338::-;11408:5;11457:3;11450:4;11442:6;11438:17;11434:27;11424:122;;11465:79;;:::i;:::-;11424:122;11582:6;11569:20;11607:78;11681:3;11673:6;11666:4;11658:6;11654:17;11607:78;:::i;:::-;11598:87;;11414:277;11353:338;;;;:::o;11697:943::-;11792:6;11800;11808;11816;11865:3;11853:9;11844:7;11840:23;11836:33;11833:120;;;11872:79;;:::i;:::-;11833:120;11992:1;12017:53;12062:7;12053:6;12042:9;12038:22;12017:53;:::i;:::-;12007:63;;11963:117;12119:2;12145:53;12190:7;12181:6;12170:9;12166:22;12145:53;:::i;:::-;12135:63;;12090:118;12247:2;12273:53;12318:7;12309:6;12298:9;12294:22;12273:53;:::i;:::-;12263:63;;12218:118;12403:2;12392:9;12388:18;12375:32;12434:18;12426:6;12423:30;12420:117;;;12456:79;;:::i;:::-;12420:117;12561:62;12615:7;12606:6;12595:9;12591:22;12561:62;:::i;:::-;12551:72;;12346:287;11697:943;;;;;;;:::o;12646:474::-;12714:6;12722;12771:2;12759:9;12750:7;12746:23;12742:32;12739:119;;;12777:79;;:::i;:::-;12739:119;12897:1;12922:53;12967:7;12958:6;12947:9;12943:22;12922:53;:::i;:::-;12912:63;;12868:117;13024:2;13050:53;13095:7;13086:6;13075:9;13071:22;13050:53;:::i;:::-;13040:63;;12995:118;12646:474;;;;;:::o;13126:180::-;13174:77;13171:1;13164:88;13271:4;13268:1;13261:15;13295:4;13292:1;13285:15;13312:320;13356:6;13393:1;13387:4;13383:12;13373:22;;13440:1;13434:4;13430:12;13461:18;13451:81;;13517:4;13509:6;13505:17;13495:27;;13451:81;13579:2;13571:6;13568:14;13548:18;13545:38;13542:84;;13598:18;;:::i;:::-;13542:84;13363:269;13312:320;;;:::o;13638:232::-;13778:34;13774:1;13766:6;13762:14;13755:58;13847:15;13842:2;13834:6;13830:15;13823:40;13638:232;:::o;13876:366::-;14018:3;14039:67;14103:2;14098:3;14039:67;:::i;:::-;14032:74;;14115:93;14204:3;14115:93;:::i;:::-;14233:2;14228:3;14224:12;14217:19;;13876:366;;;:::o;14248:419::-;14414:4;14452:2;14441:9;14437:18;14429:26;;14501:9;14495:4;14491:20;14487:1;14476:9;14472:17;14465:47;14529:131;14655:4;14529:131;:::i;:::-;14521:139;;14248:419;;;:::o;14673:221::-;14813:34;14809:1;14801:6;14797:14;14790:58;14882:4;14877:2;14869:6;14865:15;14858:29;14673:221;:::o;14900:366::-;15042:3;15063:67;15127:2;15122:3;15063:67;:::i;:::-;15056:74;;15139:93;15228:3;15139:93;:::i;:::-;15257:2;15252:3;15248:12;15241:19;;14900:366;;;:::o;15272:419::-;15438:4;15476:2;15465:9;15461:18;15453:26;;15525:9;15519:4;15515:20;15511:1;15500:9;15496:17;15489:47;15553:131;15679:4;15553:131;:::i;:::-;15545:139;;15272:419;;;:::o;15697:244::-;15837:34;15833:1;15825:6;15821:14;15814:58;15906:27;15901:2;15893:6;15889:15;15882:52;15697:244;:::o;15947:366::-;16089:3;16110:67;16174:2;16169:3;16110:67;:::i;:::-;16103:74;;16186:93;16275:3;16186:93;:::i;:::-;16304:2;16299:3;16295:12;16288:19;;15947:366;;;:::o;16319:419::-;16485:4;16523:2;16512:9;16508:18;16500:26;;16572:9;16566:4;16562:20;16558:1;16547:9;16543:17;16536:47;16600:131;16726:4;16600:131;:::i;:::-;16592:139;;16319:419;;;:::o;16744:182::-;16884:34;16880:1;16872:6;16868:14;16861:58;16744:182;:::o;16932:366::-;17074:3;17095:67;17159:2;17154:3;17095:67;:::i;:::-;17088:74;;17171:93;17260:3;17171:93;:::i;:::-;17289:2;17284:3;17280:12;17273:19;;16932:366;;;:::o;17304:419::-;17470:4;17508:2;17497:9;17493:18;17485:26;;17557:9;17551:4;17547:20;17543:1;17532:9;17528:17;17521:47;17585:131;17711:4;17585:131;:::i;:::-;17577:139;;17304:419;;;:::o;17729:181::-;17869:33;17865:1;17857:6;17853:14;17846:57;17729:181;:::o;17916:366::-;18058:3;18079:67;18143:2;18138:3;18079:67;:::i;:::-;18072:74;;18155:93;18244:3;18155:93;:::i;:::-;18273:2;18268:3;18264:12;18257:19;;17916:366;;;:::o;18288:419::-;18454:4;18492:2;18481:9;18477:18;18469:26;;18541:9;18535:4;18531:20;18527:1;18516:9;18512:17;18505:47;18569:131;18695:4;18569:131;:::i;:::-;18561:139;;18288:419;;;:::o;18713:147::-;18814:11;18851:3;18836:18;;18713:147;;;;:::o;18866:114::-;;:::o;18986:398::-;19145:3;19166:83;19247:1;19242:3;19166:83;:::i;:::-;19159:90;;19258:93;19347:3;19258:93;:::i;:::-;19376:1;19371:3;19367:11;19360:18;;18986:398;;;:::o;19390:379::-;19574:3;19596:147;19739:3;19596:147;:::i;:::-;19589:154;;19760:3;19753:10;;19390:379;;;:::o;19775:166::-;19915:18;19911:1;19903:6;19899:14;19892:42;19775:166;:::o;19947:366::-;20089:3;20110:67;20174:2;20169:3;20110:67;:::i;:::-;20103:74;;20186:93;20275:3;20186:93;:::i;:::-;20304:2;20299:3;20295:12;20288:19;;19947:366;;;:::o;20319:419::-;20485:4;20523:2;20512:9;20508:18;20500:26;;20572:9;20566:4;20562:20;20558:1;20547:9;20543:17;20536:47;20600:131;20726:4;20600:131;:::i;:::-;20592:139;;20319:419;;;:::o;20744:97::-;20803:6;20831:3;20821:13;;20744:97;;;;:::o;20847:141::-;20896:4;20919:3;20911:11;;20942:3;20939:1;20932:14;20976:4;20973:1;20963:18;20955:26;;20847:141;;;:::o;20994:93::-;21031:6;21078:2;21073;21066:5;21062:14;21058:23;21048:33;;20994:93;;;:::o;21093:107::-;21137:8;21187:5;21181:4;21177:16;21156:37;;21093:107;;;;:::o;21206:393::-;21275:6;21325:1;21313:10;21309:18;21348:97;21378:66;21367:9;21348:97;:::i;:::-;21466:39;21496:8;21485:9;21466:39;:::i;:::-;21454:51;;21538:4;21534:9;21527:5;21523:21;21514:30;;21587:4;21577:8;21573:19;21566:5;21563:30;21553:40;;21282:317;;21206:393;;;;;:::o;21605:60::-;21633:3;21654:5;21647:12;;21605:60;;;:::o;21671:142::-;21721:9;21754:53;21772:34;21781:24;21799:5;21781:24;:::i;:::-;21772:34;:::i;:::-;21754:53;:::i;:::-;21741:66;;21671:142;;;:::o;21819:75::-;21862:3;21883:5;21876:12;;21819:75;;;:::o;21900:269::-;22010:39;22041:7;22010:39;:::i;:::-;22071:91;22120:41;22144:16;22120:41;:::i;:::-;22112:6;22105:4;22099:11;22071:91;:::i;:::-;22065:4;22058:105;21976:193;21900:269;;;:::o;22175:73::-;22220:3;22175:73;:::o;22254:189::-;22331:32;;:::i;:::-;22372:65;22430:6;22422;22416:4;22372:65;:::i;:::-;22307:136;22254:189;;:::o;22449:186::-;22509:120;22526:3;22519:5;22516:14;22509:120;;;22580:39;22617:1;22610:5;22580:39;:::i;:::-;22553:1;22546:5;22542:13;22533:22;;22509:120;;;22449:186;;:::o;22641:543::-;22742:2;22737:3;22734:11;22731:446;;;22776:38;22808:5;22776:38;:::i;:::-;22860:29;22878:10;22860:29;:::i;:::-;22850:8;22846:44;23043:2;23031:10;23028:18;23025:49;;;23064:8;23049:23;;23025:49;23087:80;23143:22;23161:3;23143:22;:::i;:::-;23133:8;23129:37;23116:11;23087:80;:::i;:::-;22746:431;;22731:446;22641:543;;;:::o;23190:117::-;23244:8;23294:5;23288:4;23284:16;23263:37;;23190:117;;;;:::o;23313:169::-;23357:6;23390:51;23438:1;23434:6;23426:5;23423:1;23419:13;23390:51;:::i;:::-;23386:56;23471:4;23465;23461:15;23451:25;;23364:118;23313:169;;;;:::o;23487:295::-;23563:4;23709:29;23734:3;23728:4;23709:29;:::i;:::-;23701:37;;23771:3;23768:1;23764:11;23758:4;23755:21;23747:29;;23487:295;;;;:::o;23787:1403::-;23911:44;23951:3;23946;23911:44;:::i;:::-;24020:18;24012:6;24009:30;24006:56;;;24042:18;;:::i;:::-;24006:56;24086:38;24118:4;24112:11;24086:38;:::i;:::-;24171:67;24231:6;24223;24217:4;24171:67;:::i;:::-;24265:1;24294:2;24286:6;24283:14;24311:1;24306:632;;;;24982:1;24999:6;24996:84;;;25055:9;25050:3;25046:19;25033:33;25024:42;;24996:84;25106:67;25166:6;25159:5;25106:67;:::i;:::-;25100:4;25093:81;24955:229;24276:908;;24306:632;24358:4;24354:9;24346:6;24342:22;24392:37;24424:4;24392:37;:::i;:::-;24451:1;24465:215;24479:7;24476:1;24473:14;24465:215;;;24565:9;24560:3;24556:19;24543:33;24535:6;24528:49;24616:1;24608:6;24604:14;24594:24;;24663:2;24652:9;24648:18;24635:31;;24502:4;24499:1;24495:12;24490:17;;24465:215;;;24708:6;24699:7;24696:19;24693:186;;;24773:9;24768:3;24764:19;24751:33;24816:48;24858:4;24850:6;24846:17;24835:9;24816:48;:::i;:::-;24808:6;24801:64;24716:163;24693:186;24925:1;24921;24913:6;24909:14;24905:22;24899:4;24892:36;24313:625;;;24276:908;;23886:1304;;;23787:1403;;;:::o;25196:230::-;25336:34;25332:1;25324:6;25320:14;25313:58;25405:13;25400:2;25392:6;25388:15;25381:38;25196:230;:::o;25432:366::-;25574:3;25595:67;25659:2;25654:3;25595:67;:::i;:::-;25588:74;;25671:93;25760:3;25671:93;:::i;:::-;25789:2;25784:3;25780:12;25773:19;;25432:366;;;:::o;25804:419::-;25970:4;26008:2;25997:9;25993:18;25985:26;;26057:9;26051:4;26047:20;26043:1;26032:9;26028:17;26021:47;26085:131;26211:4;26085:131;:::i;:::-;26077:139;;25804:419;;;:::o;26229:180::-;26277:77;26274:1;26267:88;26374:4;26371:1;26364:15;26398:4;26395:1;26388:15;26415:410;26455:7;26478:20;26496:1;26478:20;:::i;:::-;26473:25;;26512:20;26530:1;26512:20;:::i;:::-;26507:25;;26567:1;26564;26560:9;26589:30;26607:11;26589:30;:::i;:::-;26578:41;;26768:1;26759:7;26755:15;26752:1;26749:22;26729:1;26722:9;26702:83;26679:139;;26798:18;;:::i;:::-;26679:139;26463:362;26415:410;;;;:::o;26831:191::-;26871:3;26890:20;26908:1;26890:20;:::i;:::-;26885:25;;26924:20;26942:1;26924:20;:::i;:::-;26919:25;;26967:1;26964;26960:9;26953:16;;26988:3;26985:1;26982:10;26979:36;;;26995:18;;:::i;:::-;26979:36;26831:191;;;;:::o;27028:224::-;27168:34;27164:1;27156:6;27152:14;27145:58;27237:7;27232:2;27224:6;27220:15;27213:32;27028:224;:::o;27258:366::-;27400:3;27421:67;27485:2;27480:3;27421:67;:::i;:::-;27414:74;;27497:93;27586:3;27497:93;:::i;:::-;27615:2;27610:3;27606:12;27599:19;;27258:366;;;:::o;27630:419::-;27796:4;27834:2;27823:9;27819:18;27811:26;;27883:9;27877:4;27873:20;27869:1;27858:9;27854:17;27847:47;27911:131;28037:4;27911:131;:::i;:::-;27903:139;;27630:419;;;:::o;28055:180::-;28103:77;28100:1;28093:88;28200:4;28197:1;28190:15;28224:4;28221:1;28214:15;28241:233;28280:3;28303:24;28321:5;28303:24;:::i;:::-;28294:33;;28349:66;28342:5;28339:77;28336:103;;28419:18;;:::i;:::-;28336:103;28466:1;28459:5;28455:13;28448:20;;28241:233;;;:::o;28480:182::-;28620:34;28616:1;28608:6;28604:14;28597:58;28480:182;:::o;28668:366::-;28810:3;28831:67;28895:2;28890:3;28831:67;:::i;:::-;28824:74;;28907:93;28996:3;28907:93;:::i;:::-;29025:2;29020:3;29016:12;29009:19;;28668:366;;;:::o;29040:419::-;29206:4;29244:2;29233:9;29229:18;29221:26;;29293:9;29287:4;29283:20;29279:1;29268:9;29264:17;29257:47;29321:131;29447:4;29321:131;:::i;:::-;29313:139;;29040:419;;;:::o;29465:176::-;29605:28;29601:1;29593:6;29589:14;29582:52;29465:176;:::o;29647:366::-;29789:3;29810:67;29874:2;29869:3;29810:67;:::i;:::-;29803:74;;29886:93;29975:3;29886:93;:::i;:::-;30004:2;29999:3;29995:12;29988:19;;29647:366;;;:::o;30019:419::-;30185:4;30223:2;30212:9;30208:18;30200:26;;30272:9;30266:4;30262:20;30258:1;30247:9;30243:17;30236:47;30300:131;30426:4;30300:131;:::i;:::-;30292:139;;30019:419;;;:::o;30444:182::-;30584:34;30580:1;30572:6;30568:14;30561:58;30444:182;:::o;30632:366::-;30774:3;30795:67;30859:2;30854:3;30795:67;:::i;:::-;30788:74;;30871:93;30960:3;30871:93;:::i;:::-;30989:2;30984:3;30980:12;30973:19;;30632:366;;;:::o;31004:419::-;31170:4;31208:2;31197:9;31193:18;31185:26;;31257:9;31251:4;31247:20;31243:1;31232:9;31228:17;31221:47;31285:131;31411:4;31285:131;:::i;:::-;31277:139;;31004:419;;;:::o;31429:292::-;31569:34;31565:1;31557:6;31553:14;31546:58;31638:34;31633:2;31625:6;31621:15;31614:59;31707:6;31702:2;31694:6;31690:15;31683:31;31429:292;:::o;31727:366::-;31869:3;31890:67;31954:2;31949:3;31890:67;:::i;:::-;31883:74;;31966:93;32055:3;31966:93;:::i;:::-;32084:2;32079:3;32075:12;32068:19;;31727:366;;;:::o;32099:419::-;32265:4;32303:2;32292:9;32288:18;32280:26;;32352:9;32346:4;32342:20;32338:1;32327:9;32323:17;32316:47;32380:131;32506:4;32380:131;:::i;:::-;32372:139;;32099:419;;;:::o;32524:244::-;32664:34;32660:1;32652:6;32648:14;32641:58;32733:27;32728:2;32720:6;32716:15;32709:52;32524:244;:::o;32774:366::-;32916:3;32937:67;33001:2;32996:3;32937:67;:::i;:::-;32930:74;;33013:93;33102:3;33013:93;:::i;:::-;33131:2;33126:3;33122:12;33115:19;;32774:366;;;:::o;33146:419::-;33312:4;33350:2;33339:9;33335:18;33327:26;;33399:9;33393:4;33389:20;33385:1;33374:9;33370:17;33363:47;33427:131;33553:4;33427:131;:::i;:::-;33419:139;;33146:419;;;:::o;33571:223::-;33711:34;33707:1;33699:6;33695:14;33688:58;33780:6;33775:2;33767:6;33763:15;33756:31;33571:223;:::o;33800:366::-;33942:3;33963:67;34027:2;34022:3;33963:67;:::i;:::-;33956:74;;34039:93;34128:3;34039:93;:::i;:::-;34157:2;34152:3;34148:12;34141:19;;33800:366;;;:::o;34172:419::-;34338:4;34376:2;34365:9;34361:18;34353:26;;34425:9;34419:4;34415:20;34411:1;34400:9;34396:17;34389:47;34453:131;34579:4;34453:131;:::i;:::-;34445:139;;34172:419;;;:::o;34597:176::-;34737:28;34733:1;34725:6;34721:14;34714:52;34597:176;:::o;34779:366::-;34921:3;34942:67;35006:2;35001:3;34942:67;:::i;:::-;34935:74;;35018:93;35107:3;35018:93;:::i;:::-;35136:2;35131:3;35127:12;35120:19;;34779:366;;;:::o;35151:419::-;35317:4;35355:2;35344:9;35340:18;35332:26;;35404:9;35398:4;35394:20;35390:1;35379:9;35375:17;35368:47;35432:131;35558:4;35432:131;:::i;:::-;35424:139;;35151:419;;;:::o;35576:238::-;35716:34;35712:1;35704:6;35700:14;35693:58;35785:21;35780:2;35772:6;35768:15;35761:46;35576:238;:::o;35820:366::-;35962:3;35983:67;36047:2;36042:3;35983:67;:::i;:::-;35976:74;;36059:93;36148:3;36059:93;:::i;:::-;36177:2;36172:3;36168:12;36161:19;;35820:366;;;:::o;36192:419::-;36358:4;36396:2;36385:9;36381:18;36373:26;;36445:9;36439:4;36435:20;36431:1;36420:9;36416:17;36409:47;36473:131;36599:4;36473:131;:::i;:::-;36465:139;;36192:419;;;:::o;36617:148::-;36719:11;36756:3;36741:18;;36617:148;;;;:::o;36771:390::-;36877:3;36905:39;36938:5;36905:39;:::i;:::-;36960:89;37042:6;37037:3;36960:89;:::i;:::-;36953:96;;37058:65;37116:6;37111:3;37104:4;37097:5;37093:16;37058:65;:::i;:::-;37148:6;37143:3;37139:16;37132:23;;36881:280;36771:390;;;;:::o;37167:155::-;37307:7;37303:1;37295:6;37291:14;37284:31;37167:155;:::o;37328:400::-;37488:3;37509:84;37591:1;37586:3;37509:84;:::i;:::-;37502:91;;37602:93;37691:3;37602:93;:::i;:::-;37720:1;37715:3;37711:11;37704:18;;37328:400;;;:::o;37734:541::-;37967:3;37989:95;38080:3;38071:6;37989:95;:::i;:::-;37982:102;;38101:148;38245:3;38101:148;:::i;:::-;38094:155;;38266:3;38259:10;;37734:541;;;;:::o;38281:225::-;38421:34;38417:1;38409:6;38405:14;38398:58;38490:8;38485:2;38477:6;38473:15;38466:33;38281:225;:::o;38512:366::-;38654:3;38675:67;38739:2;38734:3;38675:67;:::i;:::-;38668:74;;38751:93;38840:3;38751:93;:::i;:::-;38869:2;38864:3;38860:12;38853:19;;38512:366;;;:::o;38884:419::-;39050:4;39088:2;39077:9;39073:18;39065:26;;39137:9;39131:4;39127:20;39123:1;39112:9;39108:17;39101:47;39165:131;39291:4;39165:131;:::i;:::-;39157:139;;38884:419;;;:::o;39309:237::-;39449:34;39445:1;39437:6;39433:14;39426:58;39518:20;39513:2;39505:6;39501:15;39494:45;39309:237;:::o;39552:366::-;39694:3;39715:67;39779:2;39774:3;39715:67;:::i;:::-;39708:74;;39791:93;39880:3;39791:93;:::i;:::-;39909:2;39904:3;39900:12;39893:19;;39552:366;;;:::o;39924:419::-;40090:4;40128:2;40117:9;40113:18;40105:26;;40177:9;40171:4;40167:20;40163:1;40152:9;40148:17;40141:47;40205:131;40331:4;40205:131;:::i;:::-;40197:139;;39924:419;;;:::o;40349:225::-;40489:34;40485:1;40477:6;40473:14;40466:58;40558:8;40553:2;40545:6;40541:15;40534:33;40349:225;:::o;40580:366::-;40722:3;40743:67;40807:2;40802:3;40743:67;:::i;:::-;40736:74;;40819:93;40908:3;40819:93;:::i;:::-;40937:2;40932:3;40928:12;40921:19;;40580:366;;;:::o;40952:419::-;41118:4;41156:2;41145:9;41141:18;41133:26;;41205:9;41199:4;41195:20;41191:1;41180:9;41176:17;41169:47;41233:131;41359:4;41233:131;:::i;:::-;41225:139;;40952:419;;;:::o;41377:224::-;41517:34;41513:1;41505:6;41501:14;41494:58;41586:7;41581:2;41573:6;41569:15;41562:32;41377:224;:::o;41607:366::-;41749:3;41770:67;41834:2;41829:3;41770:67;:::i;:::-;41763:74;;41846:93;41935:3;41846:93;:::i;:::-;41964:2;41959:3;41955:12;41948:19;;41607:366;;;:::o;41979:419::-;42145:4;42183:2;42172:9;42168:18;42160:26;;42232:9;42226:4;42222:20;42218:1;42207:9;42203:17;42196:47;42260:131;42386:4;42260:131;:::i;:::-;42252:139;;41979:419;;;:::o;42404:229::-;42544:34;42540:1;42532:6;42528:14;42521:58;42613:12;42608:2;42600:6;42596:15;42589:37;42404:229;:::o;42639:366::-;42781:3;42802:67;42866:2;42861:3;42802:67;:::i;:::-;42795:74;;42878:93;42967:3;42878:93;:::i;:::-;42996:2;42991:3;42987:12;42980:19;;42639:366;;;:::o;43011:419::-;43177:4;43215:2;43204:9;43200:18;43192:26;;43264:9;43258:4;43254:20;43250:1;43239:9;43235:17;43228:47;43292:131;43418:4;43292:131;:::i;:::-;43284:139;;43011:419;;;:::o;43436:234::-;43576:34;43572:1;43564:6;43560:14;43553:58;43645:17;43640:2;43632:6;43628:15;43621:42;43436:234;:::o;43676:366::-;43818:3;43839:67;43903:2;43898:3;43839:67;:::i;:::-;43832:74;;43915:93;44004:3;43915:93;:::i;:::-;44033:2;44028:3;44024:12;44017:19;;43676:366;;;:::o;44048:419::-;44214:4;44252:2;44241:9;44237:18;44229:26;;44301:9;44295:4;44291:20;44287:1;44276:9;44272:17;44265:47;44329:131;44455:4;44329:131;:::i;:::-;44321:139;;44048:419;;;:::o;44473:98::-;44524:6;44558:5;44552:12;44542:22;;44473:98;;;:::o;44577:168::-;44660:11;44694:6;44689:3;44682:19;44734:4;44729:3;44725:14;44710:29;;44577:168;;;;:::o;44751:373::-;44837:3;44865:38;44897:5;44865:38;:::i;:::-;44919:70;44982:6;44977:3;44919:70;:::i;:::-;44912:77;;44998:65;45056:6;45051:3;45044:4;45037:5;45033:16;44998:65;:::i;:::-;45088:29;45110:6;45088:29;:::i;:::-;45083:3;45079:39;45072:46;;44841:283;44751:373;;;;:::o;45130:640::-;45325:4;45363:3;45352:9;45348:19;45340:27;;45377:71;45445:1;45434:9;45430:17;45421:6;45377:71;:::i;:::-;45458:72;45526:2;45515:9;45511:18;45502:6;45458:72;:::i;:::-;45540;45608:2;45597:9;45593:18;45584:6;45540:72;:::i;:::-;45659:9;45653:4;45649:20;45644:2;45633:9;45629:18;45622:48;45687:76;45758:4;45749:6;45687:76;:::i;:::-;45679:84;;45130:640;;;;;;;:::o;45776:141::-;45832:5;45863:6;45857:13;45848:22;;45879:32;45905:5;45879:32;:::i;:::-;45776:141;;;;:::o;45923:349::-;45992:6;46041:2;46029:9;46020:7;46016:23;46012:32;46009:119;;;46047:79;;:::i;:::-;46009:119;46167:1;46192:63;46247:7;46238:6;46227:9;46223:22;46192:63;:::i;:::-;46182:73;;46138:127;45923:349;;;;:::o;46278:234::-;46418:34;46414:1;46406:6;46402:14;46395:58;46487:17;46482:2;46474:6;46470:15;46463:42;46278:234;:::o;46518:366::-;46660:3;46681:67;46745:2;46740:3;46681:67;:::i;:::-;46674:74;;46757:93;46846:3;46757:93;:::i;:::-;46875:2;46870:3;46866:12;46859:19;;46518:366;;;:::o;46890:419::-;47056:4;47094:2;47083:9;47079:18;47071:26;;47143:9;47137:4;47133:20;47129:1;47118:9;47114:17;47107:47;47171:131;47297:4;47171:131;:::i;:::-;47163:139;;46890:419;;;:::o;47315:435::-;47495:3;47517:95;47608:3;47599:6;47517:95;:::i;:::-;47510:102;;47629:95;47720:3;47711:6;47629:95;:::i;:::-;47622:102;;47741:3;47734:10;;47315:435;;;;;:::o;47756:180::-;47804:77;47801:1;47794:88;47901:4;47898:1;47891:15;47925:4;47922:1;47915:15;47942:185;47982:1;47999:20;48017:1;47999:20;:::i;:::-;47994:25;;48033:20;48051:1;48033:20;:::i;:::-;48028:25;;48072:1;48062:35;;48077:18;;:::i;:::-;48062:35;48119:1;48116;48112:9;48107:14;;47942:185;;;;:::o;48133:194::-;48173:4;48193:20;48211:1;48193:20;:::i;:::-;48188:25;;48227:20;48245:1;48227:20;:::i;:::-;48222:25;;48271:1;48268;48264:9;48256:17;;48295:1;48289:4;48286:11;48283:37;;;48300:18;;:::i;:::-;48283:37;48133:194;;;;:::o;48333:176::-;48365:1;48382:20;48400:1;48382:20;:::i;:::-;48377:25;;48416:20;48434:1;48416:20;:::i;:::-;48411:25;;48455:1;48445:35;;48460:18;;:::i;:::-;48445:35;48501:1;48498;48494:9;48489:14;;48333:176;;;;:::o;48515:220::-;48655:34;48651:1;48643:6;48639:14;48632:58;48724:3;48719:2;48711:6;48707:15;48700:28;48515:220;:::o;48741:366::-;48883:3;48904:67;48968:2;48963:3;48904:67;:::i;:::-;48897:74;;48980:93;49069:3;48980:93;:::i;:::-;49098:2;49093:3;49089:12;49082:19;;48741:366;;;:::o;49113:419::-;49279:4;49317:2;49306:9;49302:18;49294:26;;49366:9;49360:4;49356:20;49352:1;49341:9;49337:17;49330:47;49394:131;49520:4;49394:131;:::i;:::-;49386:139;;49113:419;;;:::o;49538:227::-;49678:34;49674:1;49666:6;49662:14;49655:58;49747:10;49742:2;49734:6;49730:15;49723:35;49538:227;:::o;49771:366::-;49913:3;49934:67;49998:2;49993:3;49934:67;:::i;:::-;49927:74;;50010:93;50099:3;50010:93;:::i;:::-;50128:2;50123:3;50119:12;50112:19;;49771:366;;;:::o;50143:419::-;50309:4;50347:2;50336:9;50332:18;50324:26;;50396:9;50390:4;50386:20;50382:1;50371:9;50367:17;50360:47;50424:131;50550:4;50424:131;:::i;:::-;50416:139;;50143:419;;;:::o

Swarm Source

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