ETH Price: $3,363.19 (-1.57%)
Gas: 7 Gwei

Token

Women Rise (WRNFT)
 

Overview

Max Total Supply

10,000 WRNFT

Holders

5,522

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 WRNFT
0xFe5302443e2055505e8C088F8e115fAf720cA6ca
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Women Rise is celebrating and representing women scientists, activists, artists, coders and more.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WomenRise

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-11-26
*/

pragma solidity ^0.8.0;
// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol
// Developed By Crypto Sodi. 
// Twitter https://twitter.com/cryptosodi
// Property of Women Rise http://womenrise.art
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }
    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
// File: @openzeppelin/contracts/utils/Context.sol
/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// File: @openzeppelin/contracts/access/Ownable.sol
/**
 * @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() {
        _setOwner(_msgSender());
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: @openzeppelin/contracts/utils/Address.sol
/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

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

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
// File: @openzeppelin/contracts/utils/introspection/ERC165.sol
/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
// File @openzeppelin/contracts/interfaces/IERC2981.sol

/**
 * @dev Interface for the NFT Royalty Standard
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Called with the sale price to determine how much royalty is owed and to whom.
     * @param tokenId - the NFT asset queried for royalty information
     * @param salePrice - the sale price of the NFT asset specified by `tokenId`
     * @return receiver - address of who should be sent the royalty payment
     * @return royaltyAmount - the royalty payment amount for `salePrice`
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}
// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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


/**
 * @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/token/ERC721/ERC721.sol

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}
// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol
/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}
// File @opnezeppelin/contracts/utils/cryptography/ECDSA.sol)
/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}
// File @openzeppelin/contracts/utils/Counters.sol
/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}
// File: contracts/WomenRise.sol
contract WomenRise is IERC2981, ERC721Enumerable, Ownable {
    using Strings for uint256;
    using Counters for Counters.Counter;

    Counters.Counter _tokenIdTracker;

    string public baseURI;
    uint8 public reserve = 200;
    bool public mintingEnabled;
    bool public onlyWhitelisted;
  
    mapping(address => uint32) public addressMintedBalance;
    mapping(bytes => bool) public claimSigUsed;

    constructor() ERC721("Women Rise", "WRNFT") { }

    function supportsInterface(bytes4 _interfaceId) public view virtual override(IERC165, ERC721Enumerable) returns (bool) {
        return _interfaceId == type(IERC2981).interfaceId || super.supportsInterface(_interfaceId);
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view override returns (address receiver, uint256 royaltyAmount) {
        require(_exists(_tokenId), "ERC2981RoyaltyStandard: Royalty info for nonexistent token");
        return (owner(), _salePrice / 10); // 10 percent
    }

    function mint(uint32 _mintAmount) public payable {
        mint(_mintAmount, "");
    }

    // public
    function mint(uint32 _mintAmount, bytes memory _signature) public payable {
        require(msg.value == 7e16 * uint(_mintAmount), "Ethereum amount sent is not correct!");
        require(addressMintedBalance[msg.sender] + _mintAmount <= 10 && _mintAmount != 0,"Invalid can not mint more than 10!");
        
        if (!mintingEnabled) {            
            require(onlyWhitelisted, "Minting is not enabled!");
            require(isWhitelisted(msg.sender, _signature), "User is not whitelisted!");            
            _mintLoop(msg.sender, _mintAmount);
            return;
        }
        require(totalSupply() + _mintAmount < 9_800, "Request will exceed max supply!");
        _mintLoop(msg.sender, _mintAmount);
    }

    function _mintLoop(address to, uint32 amount) private {
        addressMintedBalance[to] += amount;
        for (uint i; i < amount; i++ ) {
            _safeMint(to, _tokenIdTracker.current());
            _tokenIdTracker.increment();
        }
    }

    function claimAirdrop(bytes calldata _signature, uint _addressAirDropNumber) public {
        require(reserve > 0, "No more tokens left in reserve!");
        require(!claimSigUsed[_signature], "Can only use a claim signature once!");
        require(canClaimAirdrop(msg.sender, _signature, _addressAirDropNumber), "User not eligable to claim an airdrop!");
        claimSigUsed[_signature] = true;
        _safeMint(msg.sender, _tokenIdTracker.current());
        _tokenIdTracker.increment();
        addressMintedBalance[msg.sender]++;
        reserve--;
    }

    function isWhitelisted(address _wallet, bytes memory _signature) private view returns(bool) {
        return ECDSA.recover(
            ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_wallet, "whitelist"))),
            _signature
        ) == owner();
    }

    function canClaimAirdrop(address _wallet,bytes calldata _signature,uint256 _addressAirDropNumber) private view returns(bool) {
        return ECDSA.recover(
            // if it's the address's 3rd airdrop so _addressAirDropNumber = 3
            ECDSA.toEthSignedMessageHash(keccak256(abi.encodePacked(_wallet, "airdrop", _addressAirDropNumber.toString()))),
            _signature
        ) == owner();
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
        return string(abi.encodePacked(baseURI, tokenId.toString(), ".json"));
    }

    //only owner
    function ownerMintFromReserve(uint8 amount) public onlyOwner {
        require(reserve >= amount, "Not enough tokens left in reserve!");
        _mintLoop(msg.sender, amount);
        reserve -= amount;
    }

    function setBaseURI(string memory _newBaseURI) external onlyOwner {
        baseURI = _newBaseURI;
    } 

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

    function toggleOnlyWhitelisted() external onlyOwner {
        onlyWhitelisted = !onlyWhitelisted;
    }

    function withdraw() external onlyOwner 
    {
        bool success = payable(msg.sender).send(address(this).balance);
        require(success, "Payment did not go through!");
    }
}

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":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"uint256","name":"_addressAirDropNumber","type":"uint256"}],"name":"claimAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"","type":"bytes"}],"name":"claimSigUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint32","name":"_mintAmount","type":"uint32"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_mintAmount","type":"uint32"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"onlyWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"amount","type":"uint8"}],"name":"ownerMintFromReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reserve","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","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":[],"name":"toggleOnlyWhitelisted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260c8600d60006101000a81548160ff021916908360ff1602179055503480156200002d57600080fd5b506040518060400160405280600a81526020017f576f6d656e2052697365000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f57524e46540000000000000000000000000000000000000000000000000000008152508160009080519060200190620000b2929190620001c2565b508060019080519060200190620000cb929190620001c2565b505050620000ee620000e2620000f460201b60201c565b620000fc60201b60201c565b620002d7565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001d09062000272565b90600052602060002090601f016020900481019282620001f4576000855562000240565b82601f106200020f57805160ff191683800117855562000240565b8280016001018555821562000240579182015b828111156200023f57825182559160200191906001019062000222565b5b5090506200024f919062000253565b5090565b5b808211156200026e57600081600090555060010162000254565b5090565b600060028204905060018216806200028b57607f821691505b60208210811415620002a257620002a1620002a8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61588580620002e76000396000f3fe6080604052600436106101f95760003560e01c806355f804b31161010d5780639fd6db12116100a0578063c87b56dd1161006f578063c87b56dd1461072a578063cd3293de14610767578063d024e84f14610792578063e985e9c5146107bb578063f2fde38b146107f8576101f9565b80639fd6db1214610691578063a22cb465146106bc578063a71bbebe146106e5578063b88d4fde14610701576101f9565b80637d55094d116100dc5780637d55094d146105f95780638da5cb5b1461061057806395d89b411461063b5780639c70b51214610666576101f9565b806355f804b31461052b5780636352211e146105545780636c0360eb1461059157806370a08231146105bc576101f9565b806323b872dd1161019057806342842e0e1161015f57806342842e0e14610422578063438b63001461044b57806349c7dea6146104885780634dcb2b3f146104c55780634f6ccce7146104ee576101f9565b806323b872dd146103675780632a55205a146103905780632f745c59146103ce5780633ccfd60b1461040b576101f9565b8063095ea7b3116101cc578063095ea7b3146102bf57806314c791a6146102e857806318160ddd146102ff57806318cae2691461032a576101f9565b806301ffc9a7146101fe578063036e73c81461023b57806306fdde0314610257578063081812fc14610282575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613ab2565b610821565b6040516102329190614d3a565b60405180910390f35b61025560048036038101906102509190613c6c565b61089b565b005b34801561026357600080fd5b5061026c610ad2565b6040516102799190614d9a565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190613bde565b610b64565b6040516102b69190614c88565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613a76565b610be9565b005b3480156102f457600080fd5b506102fd610d01565b005b34801561030b57600080fd5b50610314610da9565b60405161032191906151dc565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c919061390b565b610db6565b60405161035e91906151f7565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613970565b610dd9565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613c07565b610e39565b6040516103c5929190614cef565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613a76565b610ea4565b60405161040291906151dc565b60405180910390f35b34801561041757600080fd5b50610420610f49565b005b34801561042e57600080fd5b5061044960048036038101906104449190613970565b611041565b005b34801561045757600080fd5b50610472600480360381019061046d919061390b565b611061565b60405161047f9190614d18565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613b5c565b61115b565b6040516104bc9190614d3a565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613cc0565b611191565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613bde565b6112ab565b60405161052291906151dc565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613b9d565b611342565b005b34801561056057600080fd5b5061057b60048036038101906105769190613bde565b6113d8565b6040516105889190614c88565b60405180910390f35b34801561059d57600080fd5b506105a661148a565b6040516105b39190614d9a565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de919061390b565b611518565b6040516105f091906151dc565b60405180910390f35b34801561060557600080fd5b5061060e6115d0565b005b34801561061c57600080fd5b50610625611678565b6040516106329190614c88565b60405180910390f35b34801561064757600080fd5b506106506116a2565b60405161065d9190614d9a565b60405180910390f35b34801561067257600080fd5b5061067b611734565b6040516106889190614d3a565b60405180910390f35b34801561069d57600080fd5b506106a6611747565b6040516106b39190614d3a565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613a3a565b61175a565b005b6106ff60048036038101906106fa9190613c43565b6118db565b005b34801561070d57600080fd5b50610728600480360381019061072391906139bf565b6118f7565b005b34801561073657600080fd5b50610751600480360381019061074c9190613bde565b611959565b60405161075e9190614d9a565b60405180910390f35b34801561077357600080fd5b5061077c6119d5565b6040516107899190615212565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b49190613b04565b6119e8565b005b3480156107c757600080fd5b506107e260048036038101906107dd9190613934565b611c07565b6040516107ef9190614d3a565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a919061390b565b611c9b565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610894575061089382611d93565b5b9050919050565b8163ffffffff1666f8b0a10e4700006108b4919061541b565b34146108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90614ddc565b60405180910390fd5b600a82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1661095291906153b0565b63ffffffff161115801561096d575060008263ffffffff1614155b6109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a390614edc565b60405180910390fd5b600d60019054906101000a900460ff16610a6757600d60029054906101000a900460ff16610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690614f3c565b60405180910390fd5b610a193382611e0d565b610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061511c565b60405180910390fd5b610a623383611e84565b610ace565b6126488263ffffffff16610a79610da9565b610a83919061535a565b10610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba906150dc565b60405180910390fd5b610acd3383611e84565b5b5050565b606060008054610ae1906155e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0d906155e4565b8015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82611f46565b610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba59061505c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bf4826113d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c906150fc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c84611fb2565b73ffffffffffffffffffffffffffffffffffffffff161480610cb35750610cb281610cad611fb2565b611c07565b5b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990614fbc565b60405180910390fd5b610cfc8383611fba565b505050565b610d09611fb2565b73ffffffffffffffffffffffffffffffffffffffff16610d27611678565b73ffffffffffffffffffffffffffffffffffffffff1614610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d749061507c565b60405180910390fd5b600d60029054906101000a900460ff1615600d60026101000a81548160ff021916908315150217905550565b6000600880549050905090565b600e6020528060005260406000206000915054906101000a900463ffffffff1681565b610dea610de4611fb2565b82612073565b610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e209061513c565b60405180910390fd5b610e34838383612151565b505050565b600080610e4584611f46565b610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906151bc565b60405180910390fd5b610e8c611678565b600a84610e9991906153ea565b915091509250929050565b6000610eaf83611518565b8210610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614e1c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f51611fb2565b73ffffffffffffffffffffffffffffffffffffffff16610f6f611678565b73ffffffffffffffffffffffffffffffffffffffff1614610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc9061507c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505090508061103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110359061517c565b60405180910390fd5b50565b61105c838383604051806020016040528060008152506118f7565b505050565b6060600061106e83611518565b905060008167ffffffffffffffff8111156110b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110e05781602001602082028036833780820191505090505b50905060005b82811015611150576110f88582610ea4565b828281518110611131577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061114890615616565b9150506110e6565b508092505050919050565b600f818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b611199611fb2565b73ffffffffffffffffffffffffffffffffffffffff166111b7611678565b73ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061507c565b60405180910390fd5b8060ff16600d60009054906101000a900460ff1660ff161015611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90614f9c565b60405180910390fd5b611272338260ff16611e84565b80600d60008282829054906101000a900460ff1661129091906154a9565b92506101000a81548160ff021916908360ff16021790555050565b60006112b5610da9565b82106112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed9061515c565b60405180910390fd5b60088281548110611330577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61134a611fb2565b73ffffffffffffffffffffffffffffffffffffffff16611368611678565b73ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061507c565b60405180910390fd5b80600c90805190602001906113d49291906136bb565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147890614ffc565b60405180910390fd5b80915050919050565b600c8054611497906155e4565b80601f01602080910402602001604051908101604052809291908181526020018280546114c3906155e4565b80156115105780601f106114e557610100808354040283529160200191611510565b820191906000526020600020905b8154815290600101906020018083116114f357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614fdc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115d8611fb2565b73ffffffffffffffffffffffffffffffffffffffff166115f6611678565b73ffffffffffffffffffffffffffffffffffffffff161461164c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116439061507c565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116b1906155e4565b80601f01602080910402602001604051908101604052809291908181526020018280546116dd906155e4565b801561172a5780601f106116ff5761010080835404028352916020019161172a565b820191906000526020600020905b81548152906001019060200180831161170d57829003601f168201915b5050505050905090565b600d60029054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b611762611fb2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614f1c565b60405180910390fd5b80600560006117dd611fb2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188a611fb2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cf9190614d3a565b60405180910390a35050565b6118f4816040518060200160405280600081525061089b565b50565b611908611902611fb2565b83612073565b611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e9061513c565b60405180910390fd5b611953848484846123ad565b50505050565b606061196482611f46565b6119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a906150bc565b60405180910390fd5b600c6119ae83612409565b6040516020016119bf929190614c33565b6040516020818303038152906040529050919050565b600d60009054906101000a900460ff1681565b6000600d60009054906101000a900460ff1660ff1611611a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3490614e9c565b60405180910390fd5b600f8383604051611a4f929190614c1a565b908152602001604051809103902060009054906101000a900460ff1615611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290614ebc565b60405180910390fd5b611ab7338484846125b6565b611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed9061519c565b60405180910390fd5b6001600f8484604051611b0a929190614c1a565b908152602001604051809103902060006101000a81548160ff021916908315150217905550611b4233611b3d600b61267d565b61268b565b611b4c600b6126a9565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900463ffffffff1680929190611bab9061565f565b91906101000a81548163ffffffff021916908363ffffffff16021790555050600d600081819054906101000a900460ff1680929190611be9906155ba565b91906101000a81548160ff021916908360ff16021790555050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ca3611fb2565b73ffffffffffffffffffffffffffffffffffffffff16611cc1611678565b73ffffffffffffffffffffffffffffffffffffffff1614611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e9061507c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90614e5c565b60405180910390fd5b611d90816126bf565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e065750611e0582612785565b5b9050919050565b6000611e17611678565b73ffffffffffffffffffffffffffffffffffffffff16611e65611e5f85604051602001611e449190614bc1565b60405160208183030381529060405280519060200120612867565b84612897565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900463ffffffff16611ee291906153b0565b92506101000a81548163ffffffff021916908363ffffffff16021790555060005b8163ffffffff16811015611f4157611f2483611f1f600b61267d565b61268b565b611f2e600b6126a9565b8080611f3990615616565b915050611f03565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202d836113d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061207e82611f46565b6120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490614f7c565b60405180910390fd5b60006120c8836113d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061213757508373ffffffffffffffffffffffffffffffffffffffff1661211f84610b64565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214857506121478185611c07565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612171826113d8565b73ffffffffffffffffffffffffffffffffffffffff16146121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be9061509c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e90614efc565b60405180910390fd5b6122428383836128be565b61224d600082611fba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229d9190615475565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122f4919061535a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6123b8848484612151565b6123c4848484846129d2565b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90614e3c565b60405180910390fd5b50505050565b60606000821415612451576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125b1565b600082905060005b6000821461248357808061246c90615616565b915050600a8261247c91906153ea565b9150612459565b60008167ffffffffffffffff8111156124c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124f75781602001600182028036833780820191505090505b5090505b600085146125aa576001826125109190615475565b9150600a8561251f91906156ba565b603061252b919061535a565b60f81b818381518110612567577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125a391906153ea565b94506124fb565b8093505050505b919050565b60006125c0611678565b73ffffffffffffffffffffffffffffffffffffffff1661265c612612876125e686612409565b6040516020016125f7929190614be7565b60405160208183030381529060405280519060200120612867565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612897565b73ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b600081600001549050919050565b6126a5828260405180602001604052806000815250612b69565b5050565b6001816000016000828254019250508190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061285057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612860575061285f82612bc4565b5b9050919050565b60008160405160200161287a9190614c62565b604051602081830303815290604052805190602001209050919050565b60008060006128a68585612c2e565b915091506128b381612cb1565b819250505092915050565b6128c9838383613002565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561290c5761290781613007565b61294b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461294a576129498382613050565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561298e57612989816131bd565b6129cd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129cc576129cb8282613300565b5b5b505050565b60006129f38473ffffffffffffffffffffffffffffffffffffffff1661337f565b15612b5c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a1c611fb2565b8786866040518563ffffffff1660e01b8152600401612a3e9493929190614ca3565b602060405180830381600087803b158015612a5857600080fd5b505af1925050508015612a8957506040513d601f19601f82011682018060405250810190612a869190613adb565b60015b612b0c573d8060008114612ab9576040519150601f19603f3d011682016040523d82523d6000602084013e612abe565b606091505b50600081511415612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb90614e3c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b61565b600190505b949350505050565b612b738383613392565b612b8060008484846129d2565b612bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb690614e3c565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080604183511415612c705760008060006020860151925060408601519150606086015160001a9050612c6487828585613560565b94509450505050612caa565b604083511415612ca1576000806020850151915060408501519050612c9686838361366d565b935093505050612caa565b60006002915091505b9250929050565b60006004811115612ceb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612d24577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612d2f57612fff565b60016004811115612d69577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612da2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dda90614dbc565b60405180910390fd5b60026004811115612e1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612e56577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e90614dfc565b60405180910390fd5b60036004811115612ed1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612f0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4290614f5c565b60405180910390fd5b600480811115612f84577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff59061501c565b60405180910390fd5b5b50565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161305d84611518565b6130679190615475565b905060006007600084815260200190815260200160002054905081811461314c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131d19190615475565b9050600060096000848152602001908152602001600020549050600060088381548110613227577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061326f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061330b83611518565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f99061503c565b60405180910390fd5b61340b81611f46565b1561344b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344290614e7c565b60405180910390fd5b613457600083836128be565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134a7919061535a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561359b576000600391509150613664565b601b8560ff16141580156135b35750601c8560ff1614155b156135c5576000600491509150613664565b6000600187878787604051600081526020016040526040516135ea9493929190614d55565b6020604051602081039080840390855afa15801561360c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561365b57600060019250925050613664565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506136ad87828885613560565b935093505050935093915050565b8280546136c7906155e4565b90600052602060002090601f0160209004810192826136e95760008555613730565b82601f1061370257805160ff1916838001178555613730565b82800160010185558215613730579182015b8281111561372f578251825591602001919060010190613714565b5b50905061373d9190613741565b5090565b5b8082111561375a576000816000905550600101613742565b5090565b600061377161376c8461525e565b61522d565b90508281526020810184848401111561378957600080fd5b613794848285615578565b509392505050565b60006137af6137aa8461528e565b61522d565b9050828152602081018484840111156137c757600080fd5b6137d2848285615578565b509392505050565b6000813590506137e9816157c5565b92915050565b6000813590506137fe816157dc565b92915050565b600081359050613813816157f3565b92915050565b600081519050613828816157f3565b92915050565b60008083601f84011261384057600080fd5b8235905067ffffffffffffffff81111561385957600080fd5b60208301915083600182028301111561387157600080fd5b9250929050565b600082601f83011261388957600080fd5b813561389984826020860161375e565b91505092915050565b600082601f8301126138b357600080fd5b81356138c384826020860161379c565b91505092915050565b6000813590506138db8161580a565b92915050565b6000813590506138f081615821565b92915050565b60008135905061390581615838565b92915050565b60006020828403121561391d57600080fd5b600061392b848285016137da565b91505092915050565b6000806040838503121561394757600080fd5b6000613955858286016137da565b9250506020613966858286016137da565b9150509250929050565b60008060006060848603121561398557600080fd5b6000613993868287016137da565b93505060206139a4868287016137da565b92505060406139b5868287016138cc565b9150509250925092565b600080600080608085870312156139d557600080fd5b60006139e3878288016137da565b94505060206139f4878288016137da565b9350506040613a05878288016138cc565b925050606085013567ffffffffffffffff811115613a2257600080fd5b613a2e87828801613878565b91505092959194509250565b60008060408385031215613a4d57600080fd5b6000613a5b858286016137da565b9250506020613a6c858286016137ef565b9150509250929050565b60008060408385031215613a8957600080fd5b6000613a97858286016137da565b9250506020613aa8858286016138cc565b9150509250929050565b600060208284031215613ac457600080fd5b6000613ad284828501613804565b91505092915050565b600060208284031215613aed57600080fd5b6000613afb84828501613819565b91505092915050565b600080600060408486031215613b1957600080fd5b600084013567ffffffffffffffff811115613b3357600080fd5b613b3f8682870161382e565b93509350506020613b52868287016138cc565b9150509250925092565b600060208284031215613b6e57600080fd5b600082013567ffffffffffffffff811115613b8857600080fd5b613b9484828501613878565b91505092915050565b600060208284031215613baf57600080fd5b600082013567ffffffffffffffff811115613bc957600080fd5b613bd5848285016138a2565b91505092915050565b600060208284031215613bf057600080fd5b6000613bfe848285016138cc565b91505092915050565b60008060408385031215613c1a57600080fd5b6000613c28858286016138cc565b9250506020613c39858286016138cc565b9150509250929050565b600060208284031215613c5557600080fd5b6000613c63848285016138e1565b91505092915050565b60008060408385031215613c7f57600080fd5b6000613c8d858286016138e1565b925050602083013567ffffffffffffffff811115613caa57600080fd5b613cb685828601613878565b9150509250929050565b600060208284031215613cd257600080fd5b6000613ce0848285016138f6565b91505092915050565b6000613cf58383614b85565b60208301905092915050565b613d0a816154dd565b82525050565b613d21613d1c826154dd565b61568c565b82525050565b6000613d32826152e3565b613d3c8185615311565b9350613d47836152be565b8060005b83811015613d78578151613d5f8882613ce9565b9750613d6a83615304565b925050600181019050613d4b565b5085935050505092915050565b613d8e816154ef565b82525050565b613d9d816154fb565b82525050565b613db4613daf826154fb565b61569e565b82525050565b6000613dc68385615333565b9350613dd3838584615578565b82840190509392505050565b6000613dea826152ee565b613df48185615322565b9350613e04818560208601615587565b613e0d816157a7565b840191505092915050565b6000613e23826152f9565b613e2d818561533e565b9350613e3d818560208601615587565b613e46816157a7565b840191505092915050565b6000613e5c826152f9565b613e66818561534f565b9350613e76818560208601615587565b80840191505092915050565b60008154613e8f816155e4565b613e99818661534f565b94506001821660008114613eb45760018114613ec557613ef8565b60ff19831686528186019350613ef8565b613ece856152ce565b60005b83811015613ef057815481890152600182019150602081019050613ed1565b838801955050505b50505092915050565b6000613f0e60188361533e565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000613f4e60248361533e565b91507f457468657265756d20616d6f756e742073656e74206973206e6f7420636f727260008301527f65637421000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb4601f8361533e565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b6000613ff4601c8361534f565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000614034602b8361533e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061409a60328361533e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061410060268361533e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614166601c8361533e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006141a6601f8361533e565b91507f4e6f206d6f726520746f6b656e73206c65667420696e207265736572766521006000830152602082019050919050565b60006141e660248361533e565b91507f43616e206f6e6c7920757365206120636c61696d207369676e6174757265206f60008301527f6e636521000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061424c60228361533e565b91507f496e76616c69642063616e206e6f74206d696e74206d6f7265207468616e203160008301527f30210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142b260248361533e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061431860198361533e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061435860178361533e565b91507f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006000830152602082019050919050565b600061439860228361533e565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143fe60098361534f565b91507f77686974656c69737400000000000000000000000000000000000000000000006000830152600982019050919050565b600061443e602c8361533e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144a460228361533e565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420696e2072657365727660008301527f65210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061450a60388361533e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614570602a8361533e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d660298361533e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061463c60228361533e565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a260208361533e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006146e2602c8361533e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061474860058361534f565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061478860208361533e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006147c860298361533e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061482e602f8361533e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614894601f8361533e565b91507f526571756573742077696c6c20657863656564206d617820737570706c7921006000830152602082019050919050565b60006148d460218361533e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061493a60188361533e565b91507f55736572206973206e6f742077686974656c69737465642100000000000000006000830152602082019050919050565b600061497a60318361533e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006149e0602c8361533e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a46601b8361533e565b91507f5061796d656e7420646964206e6f7420676f207468726f7567682100000000006000830152602082019050919050565b6000614a8660268361533e565b91507f55736572206e6f7420656c696761626c6520746f20636c61696d20616e20616960008301527f7264726f702100000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aec603a8361533e565b91507f45524332393831526f79616c74795374616e646172643a20526f79616c74792060008301527f696e666f20666f72206e6f6e6578697374656e7420746f6b656e0000000000006020830152604082019050919050565b6000614b5260078361534f565b91507f61697264726f70000000000000000000000000000000000000000000000000006000830152600782019050919050565b614b8e81615551565b82525050565b614b9d81615551565b82525050565b614bac8161555b565b82525050565b614bbb8161556b565b82525050565b6000614bcd8284613d10565b601482019150614bdc826143f1565b915081905092915050565b6000614bf38285613d10565b601482019150614c0282614b45565b9150614c0e8284613e51565b91508190509392505050565b6000614c27828486613dba565b91508190509392505050565b6000614c3f8285613e82565b9150614c4b8284613e51565b9150614c568261473b565b91508190509392505050565b6000614c6d82613fe7565b9150614c798284613da3565b60208201915081905092915050565b6000602082019050614c9d6000830184613d01565b92915050565b6000608082019050614cb86000830187613d01565b614cc56020830186613d01565b614cd26040830185614b94565b8181036060830152614ce48184613ddf565b905095945050505050565b6000604082019050614d046000830185613d01565b614d116020830184614b94565b9392505050565b60006020820190508181036000830152614d328184613d27565b905092915050565b6000602082019050614d4f6000830184613d85565b92915050565b6000608082019050614d6a6000830187613d94565b614d776020830186614bb2565b614d846040830185613d94565b614d916060830184613d94565b95945050505050565b60006020820190508181036000830152614db48184613e18565b905092915050565b60006020820190508181036000830152614dd581613f01565b9050919050565b60006020820190508181036000830152614df581613f41565b9050919050565b60006020820190508181036000830152614e1581613fa7565b9050919050565b60006020820190508181036000830152614e3581614027565b9050919050565b60006020820190508181036000830152614e558161408d565b9050919050565b60006020820190508181036000830152614e75816140f3565b9050919050565b60006020820190508181036000830152614e9581614159565b9050919050565b60006020820190508181036000830152614eb581614199565b9050919050565b60006020820190508181036000830152614ed5816141d9565b9050919050565b60006020820190508181036000830152614ef58161423f565b9050919050565b60006020820190508181036000830152614f15816142a5565b9050919050565b60006020820190508181036000830152614f358161430b565b9050919050565b60006020820190508181036000830152614f558161434b565b9050919050565b60006020820190508181036000830152614f758161438b565b9050919050565b60006020820190508181036000830152614f9581614431565b9050919050565b60006020820190508181036000830152614fb581614497565b9050919050565b60006020820190508181036000830152614fd5816144fd565b9050919050565b60006020820190508181036000830152614ff581614563565b9050919050565b60006020820190508181036000830152615015816145c9565b9050919050565b600060208201905081810360008301526150358161462f565b9050919050565b6000602082019050818103600083015261505581614695565b9050919050565b60006020820190508181036000830152615075816146d5565b9050919050565b600060208201905081810360008301526150958161477b565b9050919050565b600060208201905081810360008301526150b5816147bb565b9050919050565b600060208201905081810360008301526150d581614821565b9050919050565b600060208201905081810360008301526150f581614887565b9050919050565b60006020820190508181036000830152615115816148c7565b9050919050565b600060208201905081810360008301526151358161492d565b9050919050565b600060208201905081810360008301526151558161496d565b9050919050565b60006020820190508181036000830152615175816149d3565b9050919050565b6000602082019050818103600083015261519581614a39565b9050919050565b600060208201905081810360008301526151b581614a79565b9050919050565b600060208201905081810360008301526151d581614adf565b9050919050565b60006020820190506151f16000830184614b94565b92915050565b600060208201905061520c6000830184614ba3565b92915050565b60006020820190506152276000830184614bb2565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561525457615253615778565b5b8060405250919050565b600067ffffffffffffffff82111561527957615278615778565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152a9576152a8615778565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061536582615551565b915061537083615551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153a5576153a46156eb565b5b828201905092915050565b60006153bb8261555b565b91506153c68361555b565b92508263ffffffff038211156153df576153de6156eb565b5b828201905092915050565b60006153f582615551565b915061540083615551565b9250826154105761540f61571a565b5b828204905092915050565b600061542682615551565b915061543183615551565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561546a576154696156eb565b5b828202905092915050565b600061548082615551565b915061548b83615551565b92508282101561549e5761549d6156eb565b5b828203905092915050565b60006154b48261556b565b91506154bf8361556b565b9250828210156154d2576154d16156eb565b5b828203905092915050565b60006154e882615531565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156155a557808201518184015260208101905061558a565b838111156155b4576000848401525b50505050565b60006155c58261556b565b915060008214156155d9576155d86156eb565b5b600182039050919050565b600060028204905060018216806155fc57607f821691505b602082108114156156105761560f615749565b5b50919050565b600061562182615551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615654576156536156eb565b5b600182019050919050565b600061566a8261555b565b915063ffffffff821415615681576156806156eb565b5b600182019050919050565b6000615697826156a8565b9050919050565b6000819050919050565b60006156b3826157b8565b9050919050565b60006156c582615551565b91506156d083615551565b9250826156e0576156df61571a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b6157ce816154dd565b81146157d957600080fd5b50565b6157e5816154ef565b81146157f057600080fd5b50565b6157fc81615505565b811461580757600080fd5b50565b61581381615551565b811461581e57600080fd5b50565b61582a8161555b565b811461583557600080fd5b50565b6158418161556b565b811461584c57600080fd5b5056fea2646970667358221220b0e44589060a93f18e3b75d1fc93b7c05bef59ce4e8292bd3eeadf00240c3df464736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806355f804b31161010d5780639fd6db12116100a0578063c87b56dd1161006f578063c87b56dd1461072a578063cd3293de14610767578063d024e84f14610792578063e985e9c5146107bb578063f2fde38b146107f8576101f9565b80639fd6db1214610691578063a22cb465146106bc578063a71bbebe146106e5578063b88d4fde14610701576101f9565b80637d55094d116100dc5780637d55094d146105f95780638da5cb5b1461061057806395d89b411461063b5780639c70b51214610666576101f9565b806355f804b31461052b5780636352211e146105545780636c0360eb1461059157806370a08231146105bc576101f9565b806323b872dd1161019057806342842e0e1161015f57806342842e0e14610422578063438b63001461044b57806349c7dea6146104885780634dcb2b3f146104c55780634f6ccce7146104ee576101f9565b806323b872dd146103675780632a55205a146103905780632f745c59146103ce5780633ccfd60b1461040b576101f9565b8063095ea7b3116101cc578063095ea7b3146102bf57806314c791a6146102e857806318160ddd146102ff57806318cae2691461032a576101f9565b806301ffc9a7146101fe578063036e73c81461023b57806306fdde0314610257578063081812fc14610282575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613ab2565b610821565b6040516102329190614d3a565b60405180910390f35b61025560048036038101906102509190613c6c565b61089b565b005b34801561026357600080fd5b5061026c610ad2565b6040516102799190614d9a565b60405180910390f35b34801561028e57600080fd5b506102a960048036038101906102a49190613bde565b610b64565b6040516102b69190614c88565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613a76565b610be9565b005b3480156102f457600080fd5b506102fd610d01565b005b34801561030b57600080fd5b50610314610da9565b60405161032191906151dc565b60405180910390f35b34801561033657600080fd5b50610351600480360381019061034c919061390b565b610db6565b60405161035e91906151f7565b60405180910390f35b34801561037357600080fd5b5061038e60048036038101906103899190613970565b610dd9565b005b34801561039c57600080fd5b506103b760048036038101906103b29190613c07565b610e39565b6040516103c5929190614cef565b60405180910390f35b3480156103da57600080fd5b506103f560048036038101906103f09190613a76565b610ea4565b60405161040291906151dc565b60405180910390f35b34801561041757600080fd5b50610420610f49565b005b34801561042e57600080fd5b5061044960048036038101906104449190613970565b611041565b005b34801561045757600080fd5b50610472600480360381019061046d919061390b565b611061565b60405161047f9190614d18565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190613b5c565b61115b565b6040516104bc9190614d3a565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190613cc0565b611191565b005b3480156104fa57600080fd5b5061051560048036038101906105109190613bde565b6112ab565b60405161052291906151dc565b60405180910390f35b34801561053757600080fd5b50610552600480360381019061054d9190613b9d565b611342565b005b34801561056057600080fd5b5061057b60048036038101906105769190613bde565b6113d8565b6040516105889190614c88565b60405180910390f35b34801561059d57600080fd5b506105a661148a565b6040516105b39190614d9a565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de919061390b565b611518565b6040516105f091906151dc565b60405180910390f35b34801561060557600080fd5b5061060e6115d0565b005b34801561061c57600080fd5b50610625611678565b6040516106329190614c88565b60405180910390f35b34801561064757600080fd5b506106506116a2565b60405161065d9190614d9a565b60405180910390f35b34801561067257600080fd5b5061067b611734565b6040516106889190614d3a565b60405180910390f35b34801561069d57600080fd5b506106a6611747565b6040516106b39190614d3a565b60405180910390f35b3480156106c857600080fd5b506106e360048036038101906106de9190613a3a565b61175a565b005b6106ff60048036038101906106fa9190613c43565b6118db565b005b34801561070d57600080fd5b50610728600480360381019061072391906139bf565b6118f7565b005b34801561073657600080fd5b50610751600480360381019061074c9190613bde565b611959565b60405161075e9190614d9a565b60405180910390f35b34801561077357600080fd5b5061077c6119d5565b6040516107899190615212565b60405180910390f35b34801561079e57600080fd5b506107b960048036038101906107b49190613b04565b6119e8565b005b3480156107c757600080fd5b506107e260048036038101906107dd9190613934565b611c07565b6040516107ef9190614d3a565b60405180910390f35b34801561080457600080fd5b5061081f600480360381019061081a919061390b565b611c9b565b005b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610894575061089382611d93565b5b9050919050565b8163ffffffff1666f8b0a10e4700006108b4919061541b565b34146108f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ec90614ddc565b60405180910390fd5b600a82600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900463ffffffff1661095291906153b0565b63ffffffff161115801561096d575060008263ffffffff1614155b6109ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a390614edc565b60405180910390fd5b600d60019054906101000a900460ff16610a6757600d60029054906101000a900460ff16610a0f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0690614f3c565b60405180910390fd5b610a193382611e0d565b610a58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4f9061511c565b60405180910390fd5b610a623383611e84565b610ace565b6126488263ffffffff16610a79610da9565b610a83919061535a565b10610ac3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aba906150dc565b60405180910390fd5b610acd3383611e84565b5b5050565b606060008054610ae1906155e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610b0d906155e4565b8015610b5a5780601f10610b2f57610100808354040283529160200191610b5a565b820191906000526020600020905b815481529060010190602001808311610b3d57829003601f168201915b5050505050905090565b6000610b6f82611f46565b610bae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba59061505c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610bf4826113d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5c906150fc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610c84611fb2565b73ffffffffffffffffffffffffffffffffffffffff161480610cb35750610cb281610cad611fb2565b611c07565b5b610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce990614fbc565b60405180910390fd5b610cfc8383611fba565b505050565b610d09611fb2565b73ffffffffffffffffffffffffffffffffffffffff16610d27611678565b73ffffffffffffffffffffffffffffffffffffffff1614610d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d749061507c565b60405180910390fd5b600d60029054906101000a900460ff1615600d60026101000a81548160ff021916908315150217905550565b6000600880549050905090565b600e6020528060005260406000206000915054906101000a900463ffffffff1681565b610dea610de4611fb2565b82612073565b610e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e209061513c565b60405180910390fd5b610e34838383612151565b505050565b600080610e4584611f46565b610e84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7b906151bc565b60405180910390fd5b610e8c611678565b600a84610e9991906153ea565b915091509250929050565b6000610eaf83611518565b8210610ef0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee790614e1c565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610f51611fb2565b73ffffffffffffffffffffffffffffffffffffffff16610f6f611678565b73ffffffffffffffffffffffffffffffffffffffff1614610fc5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fbc9061507c565b60405180910390fd5b60003373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505090508061103e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110359061517c565b60405180910390fd5b50565b61105c838383604051806020016040528060008152506118f7565b505050565b6060600061106e83611518565b905060008167ffffffffffffffff8111156110b2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156110e05781602001602082028036833780820191505090505b50905060005b82811015611150576110f88582610ea4565b828281518110611131577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001018181525050808061114890615616565b9150506110e6565b508092505050919050565b600f818051602081018201805184825260208301602085012081835280955050505050506000915054906101000a900460ff1681565b611199611fb2565b73ffffffffffffffffffffffffffffffffffffffff166111b7611678565b73ffffffffffffffffffffffffffffffffffffffff161461120d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112049061507c565b60405180910390fd5b8060ff16600d60009054906101000a900460ff1660ff161015611265576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125c90614f9c565b60405180910390fd5b611272338260ff16611e84565b80600d60008282829054906101000a900460ff1661129091906154a9565b92506101000a81548160ff021916908360ff16021790555050565b60006112b5610da9565b82106112f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ed9061515c565b60405180910390fd5b60088281548110611330577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b61134a611fb2565b73ffffffffffffffffffffffffffffffffffffffff16611368611678565b73ffffffffffffffffffffffffffffffffffffffff16146113be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b59061507c565b60405180910390fd5b80600c90805190602001906113d49291906136bb565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611481576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147890614ffc565b60405180910390fd5b80915050919050565b600c8054611497906155e4565b80601f01602080910402602001604051908101604052809291908181526020018280546114c3906155e4565b80156115105780601f106114e557610100808354040283529160200191611510565b820191906000526020600020905b8154815290600101906020018083116114f357829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161158090614fdc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6115d8611fb2565b73ffffffffffffffffffffffffffffffffffffffff166115f6611678565b73ffffffffffffffffffffffffffffffffffffffff161461164c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116439061507c565b60405180910390fd5b600d60019054906101000a900460ff1615600d60016101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546116b1906155e4565b80601f01602080910402602001604051908101604052809291908181526020018280546116dd906155e4565b801561172a5780601f106116ff5761010080835404028352916020019161172a565b820191906000526020600020905b81548152906001019060200180831161170d57829003601f168201915b5050505050905090565b600d60029054906101000a900460ff1681565b600d60019054906101000a900460ff1681565b611762611fb2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c790614f1c565b60405180910390fd5b80600560006117dd611fb2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188a611fb2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118cf9190614d3a565b60405180910390a35050565b6118f4816040518060200160405280600081525061089b565b50565b611908611902611fb2565b83612073565b611947576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193e9061513c565b60405180910390fd5b611953848484846123ad565b50505050565b606061196482611f46565b6119a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199a906150bc565b60405180910390fd5b600c6119ae83612409565b6040516020016119bf929190614c33565b6040516020818303038152906040529050919050565b600d60009054906101000a900460ff1681565b6000600d60009054906101000a900460ff1660ff1611611a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3490614e9c565b60405180910390fd5b600f8383604051611a4f929190614c1a565b908152602001604051809103902060009054906101000a900460ff1615611aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa290614ebc565b60405180910390fd5b611ab7338484846125b6565b611af6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aed9061519c565b60405180910390fd5b6001600f8484604051611b0a929190614c1a565b908152602001604051809103902060006101000a81548160ff021916908315150217905550611b4233611b3d600b61267d565b61268b565b611b4c600b6126a9565b600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081819054906101000a900463ffffffff1680929190611bab9061565f565b91906101000a81548163ffffffff021916908363ffffffff16021790555050600d600081819054906101000a900460ff1680929190611be9906155ba565b91906101000a81548160ff021916908360ff16021790555050505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ca3611fb2565b73ffffffffffffffffffffffffffffffffffffffff16611cc1611678565b73ffffffffffffffffffffffffffffffffffffffff1614611d17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0e9061507c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7e90614e5c565b60405180910390fd5b611d90816126bf565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e065750611e0582612785565b5b9050919050565b6000611e17611678565b73ffffffffffffffffffffffffffffffffffffffff16611e65611e5f85604051602001611e449190614bc1565b60405160208183030381529060405280519060200120612867565b84612897565b73ffffffffffffffffffffffffffffffffffffffff1614905092915050565b80600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282829054906101000a900463ffffffff16611ee291906153b0565b92506101000a81548163ffffffff021916908363ffffffff16021790555060005b8163ffffffff16811015611f4157611f2483611f1f600b61267d565b61268b565b611f2e600b6126a9565b8080611f3990615616565b915050611f03565b505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661202d836113d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061207e82611f46565b6120bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b490614f7c565b60405180910390fd5b60006120c8836113d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061213757508373ffffffffffffffffffffffffffffffffffffffff1661211f84610b64565b73ffffffffffffffffffffffffffffffffffffffff16145b8061214857506121478185611c07565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612171826113d8565b73ffffffffffffffffffffffffffffffffffffffff16146121c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121be9061509c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612237576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222e90614efc565b60405180910390fd5b6122428383836128be565b61224d600082611fba565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461229d9190615475565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122f4919061535a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6123b8848484612151565b6123c4848484846129d2565b612403576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123fa90614e3c565b60405180910390fd5b50505050565b60606000821415612451576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506125b1565b600082905060005b6000821461248357808061246c90615616565b915050600a8261247c91906153ea565b9150612459565b60008167ffffffffffffffff8111156124c5577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124f75781602001600182028036833780820191505090505b5090505b600085146125aa576001826125109190615475565b9150600a8561251f91906156ba565b603061252b919061535a565b60f81b818381518110612567577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856125a391906153ea565b94506124fb565b8093505050505b919050565b60006125c0611678565b73ffffffffffffffffffffffffffffffffffffffff1661265c612612876125e686612409565b6040516020016125f7929190614be7565b60405160208183030381529060405280519060200120612867565b86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050612897565b73ffffffffffffffffffffffffffffffffffffffff16149050949350505050565b600081600001549050919050565b6126a5828260405180602001604052806000815250612b69565b5050565b6001816000016000828254019250508190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061285057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612860575061285f82612bc4565b5b9050919050565b60008160405160200161287a9190614c62565b604051602081830303815290604052805190602001209050919050565b60008060006128a68585612c2e565b915091506128b381612cb1565b819250505092915050565b6128c9838383613002565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561290c5761290781613007565b61294b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461294a576129498382613050565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561298e57612989816131bd565b6129cd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146129cc576129cb8282613300565b5b5b505050565b60006129f38473ffffffffffffffffffffffffffffffffffffffff1661337f565b15612b5c578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a1c611fb2565b8786866040518563ffffffff1660e01b8152600401612a3e9493929190614ca3565b602060405180830381600087803b158015612a5857600080fd5b505af1925050508015612a8957506040513d601f19601f82011682018060405250810190612a869190613adb565b60015b612b0c573d8060008114612ab9576040519150601f19603f3d011682016040523d82523d6000602084013e612abe565b606091505b50600081511415612b04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afb90614e3c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b61565b600190505b949350505050565b612b738383613392565b612b8060008484846129d2565b612bbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bb690614e3c565b60405180910390fd5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080604183511415612c705760008060006020860151925060408601519150606086015160001a9050612c6487828585613560565b94509450505050612caa565b604083511415612ca1576000806020850151915060408501519050612c9686838361366d565b935093505050612caa565b60006002915091505b9250929050565b60006004811115612ceb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612d24577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612d2f57612fff565b60016004811115612d69577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612da2577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612dda90614dbc565b60405180910390fd5b60026004811115612e1d577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612e56577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612e97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e8e90614dfc565b60405180910390fd5b60036004811115612ed1577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612f0a577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612f4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f4290614f5c565b60405180910390fd5b600480811115612f84577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b816004811115612fbd577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b1415612ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ff59061501c565b60405180910390fd5b5b50565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161305d84611518565b6130679190615475565b905060006007600084815260200190815260200160002054905081811461314c576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506131d19190615475565b9050600060096000848152602001908152602001600020549050600060088381548110613227577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061326f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061330b83611518565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613402576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133f99061503c565b60405180910390fd5b61340b81611f46565b1561344b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161344290614e7c565b60405180910390fd5b613457600083836128be565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546134a7919061535a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c111561359b576000600391509150613664565b601b8560ff16141580156135b35750601c8560ff1614155b156135c5576000600491509150613664565b6000600187878787604051600081526020016040526040516135ea9493929190614d55565b6020604051602081039080840390855afa15801561360c573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561365b57600060019250925050613664565b80600092509250505b94509492505050565b6000806000807f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff85169150601b8560ff1c0190506136ad87828885613560565b935093505050935093915050565b8280546136c7906155e4565b90600052602060002090601f0160209004810192826136e95760008555613730565b82601f1061370257805160ff1916838001178555613730565b82800160010185558215613730579182015b8281111561372f578251825591602001919060010190613714565b5b50905061373d9190613741565b5090565b5b8082111561375a576000816000905550600101613742565b5090565b600061377161376c8461525e565b61522d565b90508281526020810184848401111561378957600080fd5b613794848285615578565b509392505050565b60006137af6137aa8461528e565b61522d565b9050828152602081018484840111156137c757600080fd5b6137d2848285615578565b509392505050565b6000813590506137e9816157c5565b92915050565b6000813590506137fe816157dc565b92915050565b600081359050613813816157f3565b92915050565b600081519050613828816157f3565b92915050565b60008083601f84011261384057600080fd5b8235905067ffffffffffffffff81111561385957600080fd5b60208301915083600182028301111561387157600080fd5b9250929050565b600082601f83011261388957600080fd5b813561389984826020860161375e565b91505092915050565b600082601f8301126138b357600080fd5b81356138c384826020860161379c565b91505092915050565b6000813590506138db8161580a565b92915050565b6000813590506138f081615821565b92915050565b60008135905061390581615838565b92915050565b60006020828403121561391d57600080fd5b600061392b848285016137da565b91505092915050565b6000806040838503121561394757600080fd5b6000613955858286016137da565b9250506020613966858286016137da565b9150509250929050565b60008060006060848603121561398557600080fd5b6000613993868287016137da565b93505060206139a4868287016137da565b92505060406139b5868287016138cc565b9150509250925092565b600080600080608085870312156139d557600080fd5b60006139e3878288016137da565b94505060206139f4878288016137da565b9350506040613a05878288016138cc565b925050606085013567ffffffffffffffff811115613a2257600080fd5b613a2e87828801613878565b91505092959194509250565b60008060408385031215613a4d57600080fd5b6000613a5b858286016137da565b9250506020613a6c858286016137ef565b9150509250929050565b60008060408385031215613a8957600080fd5b6000613a97858286016137da565b9250506020613aa8858286016138cc565b9150509250929050565b600060208284031215613ac457600080fd5b6000613ad284828501613804565b91505092915050565b600060208284031215613aed57600080fd5b6000613afb84828501613819565b91505092915050565b600080600060408486031215613b1957600080fd5b600084013567ffffffffffffffff811115613b3357600080fd5b613b3f8682870161382e565b93509350506020613b52868287016138cc565b9150509250925092565b600060208284031215613b6e57600080fd5b600082013567ffffffffffffffff811115613b8857600080fd5b613b9484828501613878565b91505092915050565b600060208284031215613baf57600080fd5b600082013567ffffffffffffffff811115613bc957600080fd5b613bd5848285016138a2565b91505092915050565b600060208284031215613bf057600080fd5b6000613bfe848285016138cc565b91505092915050565b60008060408385031215613c1a57600080fd5b6000613c28858286016138cc565b9250506020613c39858286016138cc565b9150509250929050565b600060208284031215613c5557600080fd5b6000613c63848285016138e1565b91505092915050565b60008060408385031215613c7f57600080fd5b6000613c8d858286016138e1565b925050602083013567ffffffffffffffff811115613caa57600080fd5b613cb685828601613878565b9150509250929050565b600060208284031215613cd257600080fd5b6000613ce0848285016138f6565b91505092915050565b6000613cf58383614b85565b60208301905092915050565b613d0a816154dd565b82525050565b613d21613d1c826154dd565b61568c565b82525050565b6000613d32826152e3565b613d3c8185615311565b9350613d47836152be565b8060005b83811015613d78578151613d5f8882613ce9565b9750613d6a83615304565b925050600181019050613d4b565b5085935050505092915050565b613d8e816154ef565b82525050565b613d9d816154fb565b82525050565b613db4613daf826154fb565b61569e565b82525050565b6000613dc68385615333565b9350613dd3838584615578565b82840190509392505050565b6000613dea826152ee565b613df48185615322565b9350613e04818560208601615587565b613e0d816157a7565b840191505092915050565b6000613e23826152f9565b613e2d818561533e565b9350613e3d818560208601615587565b613e46816157a7565b840191505092915050565b6000613e5c826152f9565b613e66818561534f565b9350613e76818560208601615587565b80840191505092915050565b60008154613e8f816155e4565b613e99818661534f565b94506001821660008114613eb45760018114613ec557613ef8565b60ff19831686528186019350613ef8565b613ece856152ce565b60005b83811015613ef057815481890152600182019150602081019050613ed1565b838801955050505b50505092915050565b6000613f0e60188361533e565b91507f45434453413a20696e76616c6964207369676e617475726500000000000000006000830152602082019050919050565b6000613f4e60248361533e565b91507f457468657265756d20616d6f756e742073656e74206973206e6f7420636f727260008301527f65637421000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613fb4601f8361533e565b91507f45434453413a20696e76616c6964207369676e6174757265206c656e677468006000830152602082019050919050565b6000613ff4601c8361534f565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000614034602b8361533e565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b600061409a60328361533e565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061410060268361533e565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614166601c8361533e565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006141a6601f8361533e565b91507f4e6f206d6f726520746f6b656e73206c65667420696e207265736572766521006000830152602082019050919050565b60006141e660248361533e565b91507f43616e206f6e6c7920757365206120636c61696d207369676e6174757265206f60008301527f6e636521000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061424c60228361533e565b91507f496e76616c69642063616e206e6f74206d696e74206d6f7265207468616e203160008301527f30210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006142b260248361533e565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061431860198361533e565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b600061435860178361533e565b91507f4d696e74696e67206973206e6f7420656e61626c6564210000000000000000006000830152602082019050919050565b600061439860228361533e565b91507f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006143fe60098361534f565b91507f77686974656c69737400000000000000000000000000000000000000000000006000830152600982019050919050565b600061443e602c8361533e565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006144a460228361533e565b91507f4e6f7420656e6f75676820746f6b656e73206c65667420696e2072657365727660008301527f65210000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061450a60388361533e565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614570602a8361533e565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006145d660298361533e565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061463c60228361533e565b91507f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008301527f75650000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006146a260208361533e565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b60006146e2602c8361533e565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061474860058361534f565b91507f2e6a736f6e0000000000000000000000000000000000000000000000000000006000830152600582019050919050565b600061478860208361533e565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b60006147c860298361533e565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061482e602f8361533e565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614894601f8361533e565b91507f526571756573742077696c6c20657863656564206d617820737570706c7921006000830152602082019050919050565b60006148d460218361533e565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061493a60188361533e565b91507f55736572206973206e6f742077686974656c69737465642100000000000000006000830152602082019050919050565b600061497a60318361533e565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006149e0602c8361533e565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b6000614a46601b8361533e565b91507f5061796d656e7420646964206e6f7420676f207468726f7567682100000000006000830152602082019050919050565b6000614a8660268361533e565b91507f55736572206e6f7420656c696761626c6520746f20636c61696d20616e20616960008301527f7264726f702100000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aec603a8361533e565b91507f45524332393831526f79616c74795374616e646172643a20526f79616c74792060008301527f696e666f20666f72206e6f6e6578697374656e7420746f6b656e0000000000006020830152604082019050919050565b6000614b5260078361534f565b91507f61697264726f70000000000000000000000000000000000000000000000000006000830152600782019050919050565b614b8e81615551565b82525050565b614b9d81615551565b82525050565b614bac8161555b565b82525050565b614bbb8161556b565b82525050565b6000614bcd8284613d10565b601482019150614bdc826143f1565b915081905092915050565b6000614bf38285613d10565b601482019150614c0282614b45565b9150614c0e8284613e51565b91508190509392505050565b6000614c27828486613dba565b91508190509392505050565b6000614c3f8285613e82565b9150614c4b8284613e51565b9150614c568261473b565b91508190509392505050565b6000614c6d82613fe7565b9150614c798284613da3565b60208201915081905092915050565b6000602082019050614c9d6000830184613d01565b92915050565b6000608082019050614cb86000830187613d01565b614cc56020830186613d01565b614cd26040830185614b94565b8181036060830152614ce48184613ddf565b905095945050505050565b6000604082019050614d046000830185613d01565b614d116020830184614b94565b9392505050565b60006020820190508181036000830152614d328184613d27565b905092915050565b6000602082019050614d4f6000830184613d85565b92915050565b6000608082019050614d6a6000830187613d94565b614d776020830186614bb2565b614d846040830185613d94565b614d916060830184613d94565b95945050505050565b60006020820190508181036000830152614db48184613e18565b905092915050565b60006020820190508181036000830152614dd581613f01565b9050919050565b60006020820190508181036000830152614df581613f41565b9050919050565b60006020820190508181036000830152614e1581613fa7565b9050919050565b60006020820190508181036000830152614e3581614027565b9050919050565b60006020820190508181036000830152614e558161408d565b9050919050565b60006020820190508181036000830152614e75816140f3565b9050919050565b60006020820190508181036000830152614e9581614159565b9050919050565b60006020820190508181036000830152614eb581614199565b9050919050565b60006020820190508181036000830152614ed5816141d9565b9050919050565b60006020820190508181036000830152614ef58161423f565b9050919050565b60006020820190508181036000830152614f15816142a5565b9050919050565b60006020820190508181036000830152614f358161430b565b9050919050565b60006020820190508181036000830152614f558161434b565b9050919050565b60006020820190508181036000830152614f758161438b565b9050919050565b60006020820190508181036000830152614f9581614431565b9050919050565b60006020820190508181036000830152614fb581614497565b9050919050565b60006020820190508181036000830152614fd5816144fd565b9050919050565b60006020820190508181036000830152614ff581614563565b9050919050565b60006020820190508181036000830152615015816145c9565b9050919050565b600060208201905081810360008301526150358161462f565b9050919050565b6000602082019050818103600083015261505581614695565b9050919050565b60006020820190508181036000830152615075816146d5565b9050919050565b600060208201905081810360008301526150958161477b565b9050919050565b600060208201905081810360008301526150b5816147bb565b9050919050565b600060208201905081810360008301526150d581614821565b9050919050565b600060208201905081810360008301526150f581614887565b9050919050565b60006020820190508181036000830152615115816148c7565b9050919050565b600060208201905081810360008301526151358161492d565b9050919050565b600060208201905081810360008301526151558161496d565b9050919050565b60006020820190508181036000830152615175816149d3565b9050919050565b6000602082019050818103600083015261519581614a39565b9050919050565b600060208201905081810360008301526151b581614a79565b9050919050565b600060208201905081810360008301526151d581614adf565b9050919050565b60006020820190506151f16000830184614b94565b92915050565b600060208201905061520c6000830184614ba3565b92915050565b60006020820190506152276000830184614bb2565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561525457615253615778565b5b8060405250919050565b600067ffffffffffffffff82111561527957615278615778565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156152a9576152a8615778565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061536582615551565b915061537083615551565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156153a5576153a46156eb565b5b828201905092915050565b60006153bb8261555b565b91506153c68361555b565b92508263ffffffff038211156153df576153de6156eb565b5b828201905092915050565b60006153f582615551565b915061540083615551565b9250826154105761540f61571a565b5b828204905092915050565b600061542682615551565b915061543183615551565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561546a576154696156eb565b5b828202905092915050565b600061548082615551565b915061548b83615551565b92508282101561549e5761549d6156eb565b5b828203905092915050565b60006154b48261556b565b91506154bf8361556b565b9250828210156154d2576154d16156eb565b5b828203905092915050565b60006154e882615531565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156155a557808201518184015260208101905061558a565b838111156155b4576000848401525b50505050565b60006155c58261556b565b915060008214156155d9576155d86156eb565b5b600182039050919050565b600060028204905060018216806155fc57607f821691505b602082108114156156105761560f615749565b5b50919050565b600061562182615551565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615654576156536156eb565b5b600182019050919050565b600061566a8261555b565b915063ffffffff821415615681576156806156eb565b5b600182019050919050565b6000615697826156a8565b9050919050565b6000819050919050565b60006156b3826157b8565b9050919050565b60006156c582615551565b91506156d083615551565b9250826156e0576156df61571a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b6157ce816154dd565b81146157d957600080fd5b50565b6157e5816154ef565b81146157f057600080fd5b50565b6157fc81615505565b811461580757600080fd5b50565b61581381615551565b811461581e57600080fd5b50565b61582a8161555b565b811461583557600080fd5b50565b6158418161556b565b811461584c57600080fd5b5056fea2646970667358221220b0e44589060a93f18e3b75d1fc93b7c05bef59ce4e8292bd3eeadf00240c3df464736f6c63430008000033

Deployed Bytecode Sourcemap

54011:4830:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54492:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55145:745;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24924:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26483:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26006:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58541:105;;;;;;;;;;;;;:::i;:::-;;37633:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54325:54;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27373:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54728:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;37301:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58654:184;;;;;;;;;;;;;:::i;:::-;;27783:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57446:363;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54386:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58103:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37823:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58323:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24618:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54193:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24348:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58438:95;;;;;;;;;;;;;:::i;:::-;;3980:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25093:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54287:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54254:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26776:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55033:89;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28039:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57817:260;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54221:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56163:571;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27142:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4433:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54492:228;54605:4;54645:26;54629:42;;;:12;:42;;;;:83;;;;54675:37;54699:12;54675:23;:37::i;:::-;54629:83;54622:90;;54492:228;;;:::o;55145:745::-;55263:11;55258:17;;55251:4;:24;;;;:::i;:::-;55238:9;:37;55230:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;55385:2;55370:11;55335:20;:32;55356:10;55335:32;;;;;;;;;;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:52;;;;:72;;;;;55406:1;55391:11;:16;;;;55335:72;55327:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;55471:14;;;;;;;;;;;55466:282;;55522:15;;;;;;;;;;;55514:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;55588:37;55602:10;55614;55588:13;:37::i;:::-;55580:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;55681:34;55691:10;55703:11;55681:9;:34::i;:::-;55730:7;;55466:282;55796:5;55782:11;55766:27;;:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:35;55758:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;55848:34;55858:10;55870:11;55848:9;:34::i;:::-;55145:745;;;:::o;24924:100::-;24978:13;25011:5;25004:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24924:100;:::o;26483:221::-;26559:7;26587:16;26595:7;26587;:16::i;:::-;26579:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26672:15;:24;26688:7;26672:24;;;;;;;;;;;;;;;;;;;;;26665:31;;26483:221;;;:::o;26006:411::-;26087:13;26103:23;26118:7;26103:14;:23::i;:::-;26087:39;;26151:5;26145:11;;:2;:11;;;;26137:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26245:5;26229:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26254:37;26271:5;26278:12;:10;:12::i;:::-;26254:16;:37::i;:::-;26229:62;26207:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26388:21;26397:2;26401:7;26388:8;:21::i;:::-;26006:411;;;:::o;58541:105::-;4211:12;:10;:12::i;:::-;4200:23;;:7;:5;:7::i;:::-;:23;;;4192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58623:15:::1;;;;;;;;;;;58622:16;58604:15;;:34;;;;;;;;;;;;;;;;;;58541:105::o:0;37633:113::-;37694:7;37721:10;:17;;;;37714:24;;37633:113;:::o;54325:54::-;;;;;;;;;;;;;;;;;;;;;;:::o;27373:339::-;27568:41;27587:12;:10;:12::i;:::-;27601:7;27568:18;:41::i;:::-;27560:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27676:28;27686:4;27692:2;27696:7;27676:9;:28::i;:::-;27373:339;;;:::o;54728:297::-;54819:16;54837:21;54879:17;54887:8;54879:7;:17::i;:::-;54871:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;54978:7;:5;:7::i;:::-;55000:2;54987:10;:15;;;;:::i;:::-;54970:33;;;;54728:297;;;;;:::o;37301:256::-;37398:7;37434:23;37451:5;37434:16;:23::i;:::-;37426:5;:31;37418:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;37523:12;:19;37536:5;37523:19;;;;;;;;;;;;;;;:26;37543:5;37523:26;;;;;;;;;;;;37516:33;;37301:256;;;;:::o;58654:184::-;4211:12;:10;:12::i;:::-;4200:23;;:7;:5;:7::i;:::-;:23;;;4192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58710:12:::1;58733:10;58725:24;;:47;58750:21;58725:47;;;;;;;;;;;;;;;;;;;;;;;58710:62;;58791:7;58783:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;4271:1;58654:184::o:0;27783:185::-;27921:39;27938:4;27944:2;27948:7;27921:39;;;;;;;;;;;;:16;:39::i;:::-;27783:185;;;:::o;57446:363::-;57506:16;57540:23;57566:17;57576:6;57566:9;:17::i;:::-;57540:43;;57594:25;57636:15;57622:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57594:58;;57668:9;57663:113;57683:15;57679:1;:19;57663:113;;;57734:30;57754:6;57762:1;57734:19;:30::i;:::-;57720:8;57729:1;57720:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;57700:3;;;;;:::i;:::-;;;;57663:113;;;;57793:8;57786:15;;;;57446:363;;;:::o;54386:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58103:212::-;4211:12;:10;:12::i;:::-;4200:23;;:7;:5;:7::i;:::-;:23;;;4192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58194:6:::1;58183:17;;:7;;;;;;;;;;;:17;;;;58175:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;58250:29;58260:10;58272:6;58250:29;;:9;:29::i;:::-;58301:6;58290:7;;:17;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;58103:212:::0;:::o;37823:233::-;37898:7;37934:30;:28;:30::i;:::-;37926:5;:38;37918:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;38031:10;38042:5;38031:17;;;;;;;;;;;;;;;;;;;;;;;;38024:24;;37823:233;;;:::o;58323:106::-;4211:12;:10;:12::i;:::-;4200:23;;:7;:5;:7::i;:::-;:23;;;4192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58410:11:::1;58400:7;:21;;;;;;;;;;;;:::i;:::-;;58323:106:::0;:::o;24618:239::-;24690:7;24710:13;24726:7;:16;24734:7;24726:16;;;;;;;;;;;;;;;;;;;;;24710:32;;24778:1;24761:19;;:5;:19;;;;24753:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24844:5;24837:12;;;24618:239;;;:::o;54193:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24348:208::-;24420:7;24465:1;24448:19;;:5;:19;;;;24440:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24532:9;:16;24542:5;24532:16;;;;;;;;;;;;;;;;24525:23;;24348:208;;;:::o;58438:95::-;4211:12;:10;:12::i;:::-;4200:23;;:7;:5;:7::i;:::-;:23;;;4192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58511:14:::1;;;;;;;;;;;58510:15;58493:14;;:32;;;;;;;;;;;;;;;;;;58438:95::o:0;3980:87::-;4026:7;4053:6;;;;;;;;;;;4046:13;;3980:87;:::o;25093:104::-;25149:13;25182:7;25175:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25093:104;:::o;54287:27::-;;;;;;;;;;;;;:::o;54254:26::-;;;;;;;;;;;;;:::o;26776:295::-;26891:12;:10;:12::i;:::-;26879:24;;:8;:24;;;;26871:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26991:8;26946:18;:32;26965:12;:10;:12::i;:::-;26946:32;;;;;;;;;;;;;;;:42;26979:8;26946:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27044:8;27015:48;;27030:12;:10;:12::i;:::-;27015:48;;;27054:8;27015:48;;;;;;:::i;:::-;;;;;;;;26776:295;;:::o;55033:89::-;55093:21;55098:11;55093:21;;;;;;;;;;;;:4;:21::i;:::-;55033:89;:::o;28039:328::-;28214:41;28233:12;:10;:12::i;:::-;28247:7;28214:18;:41::i;:::-;28206:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28320:39;28334:4;28340:2;28344:7;28353:5;28320:13;:39::i;:::-;28039:328;;;;:::o;57817:260::-;57882:13;57921:16;57929:7;57921;:16::i;:::-;57913:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;58031:7;58040:18;:7;:16;:18::i;:::-;58014:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58000:69;;57817:260;;;:::o;54221:26::-;;;;;;;;;;;;;:::o;56163:571::-;56276:1;56266:7;;;;;;;;;;;:11;;;56258:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;56333:12;56346:10;;56333:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;56332:25;56324:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;56417:62;56433:10;56445;;56457:21;56417:15;:62::i;:::-;56409:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;56560:4;56533:12;56546:10;;56533:24;;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;56575:48;56585:10;56597:25;:15;:23;:25::i;:::-;56575:9;:48::i;:::-;56634:27;:15;:25;:27::i;:::-;56672:20;:32;56693:10;56672:32;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;56717:7;;:9;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;56163:571;;;:::o;27142:164::-;27239:4;27263:18;:25;27282:5;27263:25;;;;;;;;;;;;;;;:35;27289:8;27263:35;;;;;;;;;;;;;;;;;;;;;;;;;27256:42;;27142:164;;;;:::o;4433:192::-;4211:12;:10;:12::i;:::-;4200:23;;:7;:5;:7::i;:::-;:23;;;4192:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4542:1:::1;4522:22;;:8;:22;;;;4514:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4598:19;4608:8;4598:9;:19::i;:::-;4433:192:::0;:::o;36993:224::-;37095:4;37134:35;37119:50;;;:11;:50;;;;:90;;;;37173:36;37197:11;37173:23;:36::i;:::-;37119:90;37112:97;;36993:224;;;:::o;56742:272::-;56828:4;56999:7;:5;:7::i;:::-;56852:154;;:143;56880:79;56936:7;56919:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;56909:49;;;;;;56880:28;:79::i;:::-;56974:10;56852:13;:143::i;:::-;:154;;;56845:161;;56742:272;;;;:::o;55898:257::-;55991:6;55963:20;:24;55984:2;55963:24;;;;;;;;;;;;;;;;:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;56013:6;56008:140;56025:6;56021:10;;:1;:10;56008:140;;;56054:40;56064:2;56068:25;:15;:23;:25::i;:::-;56054:9;:40::i;:::-;56109:27;:15;:25;:27::i;:::-;56033:3;;;;;:::i;:::-;;;;56008:140;;;;55898:257;;:::o;29877:127::-;29942:4;29994:1;29966:30;;:7;:16;29974:7;29966:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29959:37;;29877:127;;;:::o;2805:98::-;2858:7;2885:10;2878:17;;2805:98;:::o;33859:174::-;33961:2;33934:15;:24;33950:7;33934:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34017:7;34013:2;33979:46;;33988:23;34003:7;33988:14;:23::i;:::-;33979:46;;;;;;;;;;;;33859:174;;:::o;30171:348::-;30264:4;30289:16;30297:7;30289;:16::i;:::-;30281:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30365:13;30381:23;30396:7;30381:14;:23::i;:::-;30365:39;;30434:5;30423:16;;:7;:16;;;:51;;;;30467:7;30443:31;;:20;30455:7;30443:11;:20::i;:::-;:31;;;30423:51;:87;;;;30478:32;30495:5;30502:7;30478:16;:32::i;:::-;30423:87;30415:96;;;30171:348;;;;:::o;33163:578::-;33322:4;33295:31;;:23;33310:7;33295:14;:23::i;:::-;:31;;;33287:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33405:1;33391:16;;:2;:16;;;;33383:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33461:39;33482:4;33488:2;33492:7;33461:20;:39::i;:::-;33565:29;33582:1;33586:7;33565:8;:29::i;:::-;33626:1;33607:9;:15;33617:4;33607:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33655:1;33638:9;:13;33648:2;33638:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33686:2;33667:7;:16;33675:7;33667:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33725:7;33721:2;33706:27;;33715:4;33706:27;;;;;;;;;;;;33163:578;;;:::o;29249:315::-;29406:28;29416:4;29422:2;29426:7;29406:9;:28::i;:::-;29453:48;29476:4;29482:2;29486:7;29495:5;29453:22;:48::i;:::-;29445:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29249:315;;;;:::o;460:723::-;516:13;746:1;737:5;:10;733:53;;;764:10;;;;;;;;;;;;;;;;;;;;;733:53;796:12;811:5;796:20;;827:14;852:78;867:1;859:4;:9;852:78;;885:8;;;;;:::i;:::-;;;;916:2;908:10;;;;;:::i;:::-;;;852:78;;;940:19;972:6;962:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;940:39;;990:154;1006:1;997:5;:10;990:154;;1034:1;1024:11;;;;;:::i;:::-;;;1101:2;1093:5;:10;;;;:::i;:::-;1080:2;:24;;;;:::i;:::-;1067:39;;1050:6;1057;1050:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;1130:2;1121:11;;;;;:::i;:::-;;;990:154;;;1168:6;1154:21;;;;;460:723;;;;:::o;57022:416::-;57141:4;57423:7;:5;:7::i;:::-;57165:265;;:254;57272:111;57328:7;57348:32;:21;:30;:32::i;:::-;57311:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57301:81;;;;;;57272:28;:111::i;:::-;57398:10;;57165:254;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:13;:254::i;:::-;:265;;;57158:272;;57022:416;;;;;;:::o;53386:114::-;53451:7;53478;:14;;;53471:21;;53386:114;;;:::o;30861:110::-;30937:26;30947:2;30951:7;30937:26;;;;;;;;;;;;:9;:26::i;:::-;30861:110;;:::o;53508:127::-;53615:1;53597:7;:14;;;:19;;;;;;;;;;;53508:127;:::o;4633:173::-;4689:16;4708:6;;;;;;;;;;;4689:25;;4734:8;4725:6;;:17;;;;;;;;;;;;;;;;;;4789:8;4758:40;;4779:8;4758:40;;;;;;;;;;;;4633:173;;:::o;23979:305::-;24081:4;24133:25;24118:40;;;:11;:40;;;;:105;;;;24190:33;24175:48;;;:11;:48;;;;24118:105;:158;;;;24240:36;24264:11;24240:23;:36::i;:::-;24118:158;24098:178;;23979:305;;;:::o;51290:269::-;51359:7;51545:4;51492:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;51482:69;;;;;;51475:76;;51290:269;;;:::o;47441:231::-;47519:7;47540:17;47559:18;47581:27;47592:4;47598:9;47581:10;:27::i;:::-;47539:69;;;;47619:18;47631:5;47619:11;:18::i;:::-;47655:9;47648:16;;;;47441:231;;;;:::o;38669:589::-;38813:45;38840:4;38846:2;38850:7;38813:26;:45::i;:::-;38891:1;38875:18;;:4;:18;;;38871:187;;;38910:40;38942:7;38910:31;:40::i;:::-;38871:187;;;38980:2;38972:10;;:4;:10;;;38968:90;;38999:47;39032:4;39038:7;38999:32;:47::i;:::-;38968:90;38871:187;39086:1;39072:16;;:2;:16;;;39068:183;;;39105:45;39142:7;39105:36;:45::i;:::-;39068:183;;;39178:4;39172:10;;:2;:10;;;39168:83;;39199:40;39227:2;39231:7;39199:27;:40::i;:::-;39168:83;39068:183;38669:589;;;:::o;34598:799::-;34753:4;34774:15;:2;:13;;;:15::i;:::-;34770:620;;;34826:2;34810:36;;;34847:12;:10;:12::i;:::-;34861:4;34867:7;34876:5;34810:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34806:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35069:1;35052:6;:13;:18;35048:272;;;35095:60;;;;;;;;;;:::i;:::-;;;;;;;;35048:272;35270:6;35264:13;35255:6;35251:2;35247:15;35240:38;34806:529;34943:41;;;34933:51;;;:6;:51;;;;34926:58;;;;;34770:620;35374:4;35367:11;;34598:799;;;;;;;:::o;31198:321::-;31328:18;31334:2;31338:7;31328:5;:18::i;:::-;31379:54;31410:1;31414:2;31418:7;31427:5;31379:22;:54::i;:::-;31357:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31198:321;;;:::o;15381:157::-;15466:4;15505:25;15490:40;;;:11;:40;;;;15483:47;;15381:157;;;:::o;45331:1308::-;45412:7;45421:12;45666:2;45646:9;:16;:22;45642:990;;;45685:9;45709;45733:7;45942:4;45931:9;45927:20;45921:27;45916:32;;45992:4;45981:9;45977:20;45971:27;45966:32;;46050:4;46039:9;46035:20;46029:27;46026:1;46021:36;46016:41;;46093:25;46104:4;46110:1;46113;46116;46093:10;:25::i;:::-;46086:32;;;;;;;;;45642:990;46160:2;46140:9;:16;:22;46136:496;;;46179:9;46203:10;46415:4;46404:9;46400:20;46394:27;46389:32;;46466:4;46455:9;46451:20;46445:27;46439:33;;46508:23;46519:4;46525:1;46528:2;46508:10;:23::i;:::-;46501:30;;;;;;;;46136:496;46580:1;46584:35;46564:56;;;;45331:1308;;;;;;:::o;43602:643::-;43680:20;43671:29;;;;;;;;;;;;;;;;:5;:29;;;;;;;;;;;;;;;;;43667:571;;;43717:7;;43667:571;43778:29;43769:38;;;;;;;;;;;;;;;;:5;:38;;;;;;;;;;;;;;;;;43765:473;;;43824:34;;;;;;;;;;:::i;:::-;;;;;;;;43765:473;43889:35;43880:44;;;;;;;;;;;;;;;;:5;:44;;;;;;;;;;;;;;;;;43876:362;;;43941:41;;;;;;;;;;:::i;:::-;;;;;;;;43876:362;44013:30;44004:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;44000:238;;;44060:44;;;;;;;;;;:::i;:::-;;;;;;;;44000:238;44135:30;44126:39;;;;;;;;;;;;;;;;:5;:39;;;;;;;;;;;;;;;;;44122:116;;;44182:44;;;;;;;;;;:::i;:::-;;;;;;;;44122:116;43602:643;;:::o;35969:126::-;;;;:::o;39981:164::-;40085:10;:17;;;;40058:15;:24;40074:7;40058:24;;;;;;;;;;;:44;;;;40113:10;40129:7;40113:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39981:164;:::o;40772:988::-;41038:22;41088:1;41063:22;41080:4;41063:16;:22::i;:::-;:26;;;;:::i;:::-;41038:51;;41100:18;41121:17;:26;41139:7;41121:26;;;;;;;;;;;;41100:47;;41268:14;41254:10;:28;41250:328;;41299:19;41321:12;:18;41334:4;41321:18;;;;;;;;;;;;;;;:34;41340:14;41321:34;;;;;;;;;;;;41299:56;;41405:11;41372:12;:18;41385:4;41372:18;;;;;;;;;;;;;;;:30;41391:10;41372:30;;;;;;;;;;;:44;;;;41522:10;41489:17;:30;41507:11;41489:30;;;;;;;;;;;:43;;;;41250:328;;41674:17;:26;41692:7;41674:26;;;;;;;;;;;41667:33;;;41718:12;:18;41731:4;41718:18;;;;;;;;;;;;;;;:34;41737:14;41718:34;;;;;;;;;;;41711:41;;;40772:988;;;;:::o;42055:1079::-;42308:22;42353:1;42333:10;:17;;;;:21;;;;:::i;:::-;42308:46;;42365:18;42386:15;:24;42402:7;42386:24;;;;;;;;;;;;42365:45;;42737:19;42759:10;42770:14;42759:26;;;;;;;;;;;;;;;;;;;;;;;;42737:48;;42823:11;42798:10;42809;42798:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;42934:10;42903:15;:28;42919:11;42903:28;;;;;;;;;;;:41;;;;43075:15;:24;43091:7;43075:24;;;;;;;;;;;43068:31;;;43110:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42055:1079;;;;:::o;39559:221::-;39644:14;39661:20;39678:2;39661:16;:20::i;:::-;39644:37;;39719:7;39692:12;:16;39705:2;39692:16;;;;;;;;;;;;;;;:24;39709:6;39692:24;;;;;;;;;;;:34;;;;39766:6;39737:17;:26;39755:7;39737:26;;;;;;;;;;;:35;;;;39559:221;;;:::o;5544:387::-;5604:4;5812:12;5879:7;5867:20;5859:28;;5922:1;5915:4;:8;5908:15;;;5544:387;;;:::o;31855:382::-;31949:1;31935:16;;:2;:16;;;;31927:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32008:16;32016:7;32008;:16::i;:::-;32007:17;31999:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32070:45;32099:1;32103:2;32107:7;32070:20;:45::i;:::-;32145:1;32128:9;:13;32138:2;32128:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32176:2;32157:7;:16;32165:7;32157:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32221:7;32217:2;32196:33;;32213:1;32196:33;;;;;;;;;;;;31855:382;;:::o;48940:1632::-;49071:7;49080:12;50005:66;50000:1;49992:10;;:79;49988:163;;;50104:1;50108:30;50088:51;;;;;;49988:163;50170:2;50165:1;:7;;;;:18;;;;;50181:2;50176:1;:7;;;;50165:18;50161:102;;;50216:1;50220:30;50200:51;;;;;;50161:102;50360:14;50377:24;50387:4;50393:1;50396;50399;50377:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50360:41;;50434:1;50416:20;;:6;:20;;;50412:103;;;50469:1;50473:29;50453:50;;;;;;;50412:103;50535:6;50543:20;50527:37;;;;;48940:1632;;;;;;;;:::o;47935:391::-;48049:7;48058:12;48083:9;48103:7;48158:66;48154:2;48150:75;48145:80;;48262:2;48257;48252:3;48248:12;48244:21;48239:26;;48293:25;48304:4;48310:1;48313;48316;48293:10;:25::i;:::-;48286:32;;;;;;47935:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:351::-;;;1409:3;1402:4;1394:6;1390:17;1386:27;1376:2;;1427:1;1424;1417:12;1376:2;1463:6;1450:20;1440:30;;1493:18;1485:6;1482:30;1479:2;;;1525:1;1522;1515:12;1479:2;1562:4;1554:6;1550:17;1538:29;;1616:3;1608:4;1600:6;1596:17;1586:8;1582:32;1579:41;1576:2;;;1633:1;1630;1623:12;1576:2;1366:277;;;;;:::o;1662:271::-;;1766:3;1759:4;1751:6;1747:17;1743:27;1733:2;;1784:1;1781;1774:12;1733:2;1824:6;1811:20;1849:78;1923:3;1915:6;1908:4;1900:6;1896:17;1849:78;:::i;:::-;1840:87;;1723:210;;;;;:::o;1953:273::-;;2058:3;2051:4;2043:6;2039:17;2035:27;2025:2;;2076:1;2073;2066:12;2025:2;2116:6;2103:20;2141:79;2216:3;2208:6;2201:4;2193:6;2189:17;2141:79;:::i;:::-;2132:88;;2015:211;;;;;:::o;2232:139::-;;2316:6;2303:20;2294:29;;2332:33;2359:5;2332:33;:::i;:::-;2284:87;;;;:::o;2377:137::-;;2460:6;2447:20;2438:29;;2476:32;2502:5;2476:32;:::i;:::-;2428:86;;;;:::o;2520:135::-;;2602:6;2589:20;2580:29;;2618:31;2643:5;2618:31;:::i;:::-;2570:85;;;;:::o;2661:262::-;;2769:2;2757:9;2748:7;2744:23;2740:32;2737:2;;;2785:1;2782;2775:12;2737:2;2828:1;2853:53;2898:7;2889:6;2878:9;2874:22;2853:53;:::i;:::-;2843:63;;2799:117;2727:196;;;;:::o;2929:407::-;;;3054:2;3042:9;3033:7;3029:23;3025:32;3022:2;;;3070:1;3067;3060:12;3022:2;3113:1;3138:53;3183:7;3174:6;3163:9;3159:22;3138:53;:::i;:::-;3128:63;;3084:117;3240:2;3266:53;3311:7;3302:6;3291:9;3287:22;3266:53;:::i;:::-;3256:63;;3211:118;3012:324;;;;;:::o;3342:552::-;;;;3484:2;3472:9;3463:7;3459:23;3455:32;3452:2;;;3500:1;3497;3490:12;3452:2;3543:1;3568:53;3613:7;3604:6;3593:9;3589:22;3568:53;:::i;:::-;3558:63;;3514:117;3670:2;3696:53;3741:7;3732:6;3721:9;3717:22;3696:53;:::i;:::-;3686:63;;3641:118;3798:2;3824:53;3869:7;3860:6;3849:9;3845:22;3824:53;:::i;:::-;3814:63;;3769:118;3442:452;;;;;:::o;3900:809::-;;;;;4068:3;4056:9;4047:7;4043:23;4039:33;4036:2;;;4085:1;4082;4075:12;4036:2;4128:1;4153:53;4198:7;4189:6;4178:9;4174:22;4153:53;:::i;:::-;4143:63;;4099:117;4255:2;4281:53;4326:7;4317:6;4306:9;4302:22;4281:53;:::i;:::-;4271:63;;4226:118;4383:2;4409:53;4454:7;4445:6;4434:9;4430:22;4409:53;:::i;:::-;4399:63;;4354:118;4539:2;4528:9;4524:18;4511:32;4570:18;4562:6;4559:30;4556:2;;;4602:1;4599;4592:12;4556:2;4630:62;4684:7;4675:6;4664:9;4660:22;4630:62;:::i;:::-;4620:72;;4482:220;4026:683;;;;;;;:::o;4715:401::-;;;4837:2;4825:9;4816:7;4812:23;4808:32;4805:2;;;4853:1;4850;4843:12;4805:2;4896:1;4921:53;4966:7;4957:6;4946:9;4942:22;4921:53;:::i;:::-;4911:63;;4867:117;5023:2;5049:50;5091:7;5082:6;5071:9;5067:22;5049:50;:::i;:::-;5039:60;;4994:115;4795:321;;;;;:::o;5122:407::-;;;5247:2;5235:9;5226:7;5222:23;5218:32;5215:2;;;5263:1;5260;5253:12;5215:2;5306:1;5331:53;5376:7;5367:6;5356:9;5352:22;5331:53;:::i;:::-;5321:63;;5277:117;5433:2;5459:53;5504:7;5495:6;5484:9;5480:22;5459:53;:::i;:::-;5449:63;;5404:118;5205:324;;;;;:::o;5535:260::-;;5642:2;5630:9;5621:7;5617:23;5613:32;5610:2;;;5658:1;5655;5648:12;5610:2;5701:1;5726:52;5770:7;5761:6;5750:9;5746:22;5726:52;:::i;:::-;5716:62;;5672:116;5600:195;;;;:::o;5801:282::-;;5919:2;5907:9;5898:7;5894:23;5890:32;5887:2;;;5935:1;5932;5925:12;5887:2;5978:1;6003:63;6058:7;6049:6;6038:9;6034:22;6003:63;:::i;:::-;5993:73;;5949:127;5877:206;;;;:::o;6089:538::-;;;;6233:2;6221:9;6212:7;6208:23;6204:32;6201:2;;;6249:1;6246;6239:12;6201:2;6320:1;6309:9;6305:17;6292:31;6350:18;6342:6;6339:30;6336:2;;;6382:1;6379;6372:12;6336:2;6418:64;6474:7;6465:6;6454:9;6450:22;6418:64;:::i;:::-;6400:82;;;;6263:229;6531:2;6557:53;6602:7;6593:6;6582:9;6578:22;6557:53;:::i;:::-;6547:63;;6502:118;6191:436;;;;;:::o;6633:373::-;;6750:2;6738:9;6729:7;6725:23;6721:32;6718:2;;;6766:1;6763;6756:12;6718:2;6837:1;6826:9;6822:17;6809:31;6867:18;6859:6;6856:30;6853:2;;;6899:1;6896;6889:12;6853:2;6927:62;6981:7;6972:6;6961:9;6957:22;6927:62;:::i;:::-;6917:72;;6780:219;6708:298;;;;:::o;7012:375::-;;7130:2;7118:9;7109:7;7105:23;7101:32;7098:2;;;7146:1;7143;7136:12;7098:2;7217:1;7206:9;7202:17;7189:31;7247:18;7239:6;7236:30;7233:2;;;7279:1;7276;7269:12;7233:2;7307:63;7362:7;7353:6;7342:9;7338:22;7307:63;:::i;:::-;7297:73;;7160:220;7088:299;;;;:::o;7393:262::-;;7501:2;7489:9;7480:7;7476:23;7472:32;7469:2;;;7517:1;7514;7507:12;7469:2;7560:1;7585:53;7630:7;7621:6;7610:9;7606:22;7585:53;:::i;:::-;7575:63;;7531:117;7459:196;;;;:::o;7661:407::-;;;7786:2;7774:9;7765:7;7761:23;7757:32;7754:2;;;7802:1;7799;7792:12;7754:2;7845:1;7870:53;7915:7;7906:6;7895:9;7891:22;7870:53;:::i;:::-;7860:63;;7816:117;7972:2;7998:53;8043:7;8034:6;8023:9;8019:22;7998:53;:::i;:::-;7988:63;;7943:118;7744:324;;;;;:::o;8074:260::-;;8181:2;8169:9;8160:7;8156:23;8152:32;8149:2;;;8197:1;8194;8187:12;8149:2;8240:1;8265:52;8309:7;8300:6;8289:9;8285:22;8265:52;:::i;:::-;8255:62;;8211:116;8139:195;;;;:::o;8340:516::-;;;8473:2;8461:9;8452:7;8448:23;8444:32;8441:2;;;8489:1;8486;8479:12;8441:2;8532:1;8557:52;8601:7;8592:6;8581:9;8577:22;8557:52;:::i;:::-;8547:62;;8503:116;8686:2;8675:9;8671:18;8658:32;8717:18;8709:6;8706:30;8703:2;;;8749:1;8746;8739:12;8703:2;8777:62;8831:7;8822:6;8811:9;8807:22;8777:62;:::i;:::-;8767:72;;8629:220;8431:425;;;;;:::o;8862:258::-;;8968:2;8956:9;8947:7;8943:23;8939:32;8936:2;;;8984:1;8981;8974:12;8936:2;9027:1;9052:51;9095:7;9086:6;9075:9;9071:22;9052:51;:::i;:::-;9042:61;;8998:115;8926:194;;;;:::o;9126:179::-;;9216:46;9258:3;9250:6;9216:46;:::i;:::-;9294:4;9289:3;9285:14;9271:28;;9206:99;;;;:::o;9311:118::-;9398:24;9416:5;9398:24;:::i;:::-;9393:3;9386:37;9376:53;;:::o;9435:157::-;9540:45;9560:24;9578:5;9560:24;:::i;:::-;9540:45;:::i;:::-;9535:3;9528:58;9518:74;;:::o;9628:732::-;;9776:54;9824:5;9776:54;:::i;:::-;9846:86;9925:6;9920:3;9846:86;:::i;:::-;9839:93;;9956:56;10006:5;9956:56;:::i;:::-;10035:7;10066:1;10051:284;10076:6;10073:1;10070:13;10051:284;;;10152:6;10146:13;10179:63;10238:3;10223:13;10179:63;:::i;:::-;10172:70;;10265:60;10318:6;10265:60;:::i;:::-;10255:70;;10111:224;10098:1;10095;10091:9;10086:14;;10051:284;;;10055:14;10351:3;10344:10;;9752:608;;;;;;;:::o;10366:109::-;10447:21;10462:5;10447:21;:::i;:::-;10442:3;10435:34;10425:50;;:::o;10481:118::-;10568:24;10586:5;10568:24;:::i;:::-;10563:3;10556:37;10546:53;;:::o;10605:157::-;10710:45;10730:24;10748:5;10730:24;:::i;:::-;10710:45;:::i;:::-;10705:3;10698:58;10688:74;;:::o;10790:314::-;;10925:88;11006:6;11001:3;10925:88;:::i;:::-;10918:95;;11023:43;11059:6;11054:3;11047:5;11023:43;:::i;:::-;11091:6;11086:3;11082:16;11075:23;;10908:196;;;;;:::o;11110:360::-;;11224:38;11256:5;11224:38;:::i;:::-;11278:70;11341:6;11336:3;11278:70;:::i;:::-;11271:77;;11357:52;11402:6;11397:3;11390:4;11383:5;11379:16;11357:52;:::i;:::-;11434:29;11456:6;11434:29;:::i;:::-;11429:3;11425:39;11418:46;;11200:270;;;;;:::o;11476:364::-;;11592:39;11625:5;11592:39;:::i;:::-;11647:71;11711:6;11706:3;11647:71;:::i;:::-;11640:78;;11727:52;11772:6;11767:3;11760:4;11753:5;11749:16;11727:52;:::i;:::-;11804:29;11826:6;11804:29;:::i;:::-;11799:3;11795:39;11788:46;;11568:272;;;;;:::o;11846:377::-;;11980:39;12013:5;11980:39;:::i;:::-;12035:89;12117:6;12112:3;12035:89;:::i;:::-;12028:96;;12133:52;12178:6;12173:3;12166:4;12159:5;12155:16;12133:52;:::i;:::-;12210:6;12205:3;12201:16;12194:23;;11956:267;;;;;:::o;12253:845::-;;12393:5;12387:12;12422:36;12448:9;12422:36;:::i;:::-;12474:89;12556:6;12551:3;12474:89;:::i;:::-;12467:96;;12594:1;12583:9;12579:17;12610:1;12605:137;;;;12756:1;12751:341;;;;12572:520;;12605:137;12689:4;12685:9;12674;12670:25;12665:3;12658:38;12725:6;12720:3;12716:16;12709:23;;12605:137;;12751:341;12818:38;12850:5;12818:38;:::i;:::-;12878:1;12892:154;12906:6;12903:1;12900:13;12892:154;;;12980:7;12974:14;12970:1;12965:3;12961:11;12954:35;13030:1;13021:7;13017:15;13006:26;;12928:4;12925:1;12921:12;12916:17;;12892:154;;;13075:6;13070:3;13066:16;13059:23;;12758:334;;12572:520;;12360:738;;;;;;:::o;13104:322::-;;13267:67;13331:2;13326:3;13267:67;:::i;:::-;13260:74;;13364:26;13360:1;13355:3;13351:11;13344:47;13417:2;13412:3;13408:12;13401:19;;13250:176;;;:::o;13432:368::-;;13595:67;13659:2;13654:3;13595:67;:::i;:::-;13588:74;;13692:34;13688:1;13683:3;13679:11;13672:55;13758:6;13753:2;13748:3;13744:12;13737:28;13791:2;13786:3;13782:12;13775:19;;13578:222;;;:::o;13806:329::-;;13969:67;14033:2;14028:3;13969:67;:::i;:::-;13962:74;;14066:33;14062:1;14057:3;14053:11;14046:54;14126:2;14121:3;14117:12;14110:19;;13952:183;;;:::o;14141:398::-;;14322:85;14404:2;14399:3;14322:85;:::i;:::-;14315:92;;14437:66;14433:1;14428:3;14424:11;14417:87;14530:2;14525:3;14521:12;14514:19;;14305:234;;;:::o;14545:375::-;;14708:67;14772:2;14767:3;14708:67;:::i;:::-;14701:74;;14805:34;14801:1;14796:3;14792:11;14785:55;14871:13;14866:2;14861:3;14857:12;14850:35;14911:2;14906:3;14902:12;14895:19;;14691:229;;;:::o;14926:382::-;;15089:67;15153:2;15148:3;15089:67;:::i;:::-;15082:74;;15186:34;15182:1;15177:3;15173:11;15166:55;15252:20;15247:2;15242:3;15238:12;15231:42;15299:2;15294:3;15290:12;15283:19;;15072:236;;;:::o;15314:370::-;;15477:67;15541:2;15536:3;15477:67;:::i;:::-;15470:74;;15574:34;15570:1;15565:3;15561:11;15554:55;15640:8;15635:2;15630:3;15626:12;15619:30;15675:2;15670:3;15666:12;15659:19;;15460:224;;;:::o;15690:326::-;;15853:67;15917:2;15912:3;15853:67;:::i;:::-;15846:74;;15950:30;15946:1;15941:3;15937:11;15930:51;16007:2;16002:3;15998:12;15991:19;;15836:180;;;:::o;16022:329::-;;16185:67;16249:2;16244:3;16185:67;:::i;:::-;16178:74;;16282:33;16278:1;16273:3;16269:11;16262:54;16342:2;16337:3;16333:12;16326:19;;16168:183;;;:::o;16357:368::-;;16520:67;16584:2;16579:3;16520:67;:::i;:::-;16513:74;;16617:34;16613:1;16608:3;16604:11;16597:55;16683:6;16678:2;16673:3;16669:12;16662:28;16716:2;16711:3;16707:12;16700:19;;16503:222;;;:::o;16731:366::-;;16894:67;16958:2;16953:3;16894:67;:::i;:::-;16887:74;;16991:34;16987:1;16982:3;16978:11;16971:55;17057:4;17052:2;17047:3;17043:12;17036:26;17088:2;17083:3;17079:12;17072:19;;16877:220;;;:::o;17103:368::-;;17266:67;17330:2;17325:3;17266:67;:::i;:::-;17259:74;;17363:34;17359:1;17354:3;17350:11;17343:55;17429:6;17424:2;17419:3;17415:12;17408:28;17462:2;17457:3;17453:12;17446:19;;17249:222;;;:::o;17477:323::-;;17640:67;17704:2;17699:3;17640:67;:::i;:::-;17633:74;;17737:27;17733:1;17728:3;17724:11;17717:48;17791:2;17786:3;17782:12;17775:19;;17623:177;;;:::o;17806:321::-;;17969:67;18033:2;18028:3;17969:67;:::i;:::-;17962:74;;18066:25;18062:1;18057:3;18053:11;18046:46;18118:2;18113:3;18109:12;18102:19;;17952:175;;;:::o;18133:366::-;;18296:67;18360:2;18355:3;18296:67;:::i;:::-;18289:74;;18393:34;18389:1;18384:3;18380:11;18373:55;18459:4;18454:2;18449:3;18445:12;18438:26;18490:2;18485:3;18481:12;18474:19;;18279:220;;;:::o;18505:341::-;;18686:84;18768:1;18763:3;18686:84;:::i;:::-;18679:91;;18800:11;18796:1;18791:3;18787:11;18780:32;18838:1;18833:3;18829:11;18822:18;;18669:177;;;:::o;18852:376::-;;19015:67;19079:2;19074:3;19015:67;:::i;:::-;19008:74;;19112:34;19108:1;19103:3;19099:11;19092:55;19178:14;19173:2;19168:3;19164:12;19157:36;19219:2;19214:3;19210:12;19203:19;;18998:230;;;:::o;19234:366::-;;19397:67;19461:2;19456:3;19397:67;:::i;:::-;19390:74;;19494:34;19490:1;19485:3;19481:11;19474:55;19560:4;19555:2;19550:3;19546:12;19539:26;19591:2;19586:3;19582:12;19575:19;;19380:220;;;:::o;19606:388::-;;19769:67;19833:2;19828:3;19769:67;:::i;:::-;19762:74;;19866:34;19862:1;19857:3;19853:11;19846:55;19932:26;19927:2;19922:3;19918:12;19911:48;19985:2;19980:3;19976:12;19969:19;;19752:242;;;:::o;20000:374::-;;20163:67;20227:2;20222:3;20163:67;:::i;:::-;20156:74;;20260:34;20256:1;20251:3;20247:11;20240:55;20326:12;20321:2;20316:3;20312:12;20305:34;20365:2;20360:3;20356:12;20349:19;;20146:228;;;:::o;20380:373::-;;20543:67;20607:2;20602:3;20543:67;:::i;:::-;20536:74;;20640:34;20636:1;20631:3;20627:11;20620:55;20706:11;20701:2;20696:3;20692:12;20685:33;20744:2;20739:3;20735:12;20728:19;;20526:227;;;:::o;20759:366::-;;20922:67;20986:2;20981:3;20922:67;:::i;:::-;20915:74;;21019:34;21015:1;21010:3;21006:11;20999:55;21085:4;21080:2;21075:3;21071:12;21064:26;21116:2;21111:3;21107:12;21100:19;;20905:220;;;:::o;21131:330::-;;21294:67;21358:2;21353:3;21294:67;:::i;:::-;21287:74;;21391:34;21387:1;21382:3;21378:11;21371:55;21452:2;21447:3;21443:12;21436:19;;21277:184;;;:::o;21467:376::-;;21630:67;21694:2;21689:3;21630:67;:::i;:::-;21623:74;;21727:34;21723:1;21718:3;21714:11;21707:55;21793:14;21788:2;21783:3;21779:12;21772:36;21834:2;21829:3;21825:12;21818:19;;21613:230;;;:::o;21849:337::-;;22030:84;22112:1;22107:3;22030:84;:::i;:::-;22023:91;;22144:7;22140:1;22135:3;22131:11;22124:28;22178:1;22173:3;22169:11;22162:18;;22013:173;;;:::o;22192:330::-;;22355:67;22419:2;22414:3;22355:67;:::i;:::-;22348:74;;22452:34;22448:1;22443:3;22439:11;22432:55;22513:2;22508:3;22504:12;22497:19;;22338:184;;;:::o;22528:373::-;;22691:67;22755:2;22750:3;22691:67;:::i;:::-;22684:74;;22788:34;22784:1;22779:3;22775:11;22768:55;22854:11;22849:2;22844:3;22840:12;22833:33;22892:2;22887:3;22883:12;22876:19;;22674:227;;;:::o;22907:379::-;;23070:67;23134:2;23129:3;23070:67;:::i;:::-;23063:74;;23167:34;23163:1;23158:3;23154:11;23147:55;23233:17;23228:2;23223:3;23219:12;23212:39;23277:2;23272:3;23268:12;23261:19;;23053:233;;;:::o;23292:329::-;;23455:67;23519:2;23514:3;23455:67;:::i;:::-;23448:74;;23552:33;23548:1;23543:3;23539:11;23532:54;23612:2;23607:3;23603:12;23596:19;;23438:183;;;:::o;23627:365::-;;23790:67;23854:2;23849:3;23790:67;:::i;:::-;23783:74;;23887:34;23883:1;23878:3;23874:11;23867:55;23953:3;23948:2;23943:3;23939:12;23932:25;23983:2;23978:3;23974:12;23967:19;;23773:219;;;:::o;23998:322::-;;24161:67;24225:2;24220:3;24161:67;:::i;:::-;24154:74;;24258:26;24254:1;24249:3;24245:11;24238:47;24311:2;24306:3;24302:12;24295:19;;24144:176;;;:::o;24326:381::-;;24489:67;24553:2;24548:3;24489:67;:::i;:::-;24482:74;;24586:34;24582:1;24577:3;24573:11;24566:55;24652:19;24647:2;24642:3;24638:12;24631:41;24698:2;24693:3;24689:12;24682:19;;24472:235;;;:::o;24713:376::-;;24876:67;24940:2;24935:3;24876:67;:::i;:::-;24869:74;;24973:34;24969:1;24964:3;24960:11;24953:55;25039:14;25034:2;25029:3;25025:12;25018:36;25080:2;25075:3;25071:12;25064:19;;24859:230;;;:::o;25095:325::-;;25258:67;25322:2;25317:3;25258:67;:::i;:::-;25251:74;;25355:29;25351:1;25346:3;25342:11;25335:50;25411:2;25406:3;25402:12;25395:19;;25241:179;;;:::o;25426:370::-;;25589:67;25653:2;25648:3;25589:67;:::i;:::-;25582:74;;25686:34;25682:1;25677:3;25673:11;25666:55;25752:8;25747:2;25742:3;25738:12;25731:30;25787:2;25782:3;25778:12;25771:19;;25572:224;;;:::o;25802:390::-;;25965:67;26029:2;26024:3;25965:67;:::i;:::-;25958:74;;26062:34;26058:1;26053:3;26049:11;26042:55;26128:28;26123:2;26118:3;26114:12;26107:50;26183:2;26178:3;26174:12;26167:19;;25948:244;;;:::o;26198:339::-;;26379:84;26461:1;26456:3;26379:84;:::i;:::-;26372:91;;26493:9;26489:1;26484:3;26480:11;26473:30;26529:1;26524:3;26520:11;26513:18;;26362:175;;;:::o;26543:108::-;26620:24;26638:5;26620:24;:::i;:::-;26615:3;26608:37;26598:53;;:::o;26657:118::-;26744:24;26762:5;26744:24;:::i;:::-;26739:3;26732:37;26722:53;;:::o;26781:115::-;26866:23;26883:5;26866:23;:::i;:::-;26861:3;26854:36;26844:52;;:::o;26902:112::-;26985:22;27001:5;26985:22;:::i;:::-;26980:3;26973:35;26963:51;;:::o;27020:522::-;;27248:75;27319:3;27310:6;27248:75;:::i;:::-;27348:2;27343:3;27339:12;27332:19;;27368:148;27512:3;27368:148;:::i;:::-;27361:155;;27533:3;27526:10;;27237:305;;;;:::o;27548:682::-;;27824:75;27895:3;27886:6;27824:75;:::i;:::-;27924:2;27919:3;27915:12;27908:19;;27944:148;28088:3;27944:148;:::i;:::-;27937:155;;28109:95;28200:3;28191:6;28109:95;:::i;:::-;28102:102;;28221:3;28214:10;;27813:417;;;;;:::o;28236:291::-;;28398:103;28497:3;28488:6;28480;28398:103;:::i;:::-;28391:110;;28518:3;28511:10;;28380:147;;;;;:::o;28533:695::-;;28833:92;28921:3;28912:6;28833:92;:::i;:::-;28826:99;;28942:95;29033:3;29024:6;28942:95;:::i;:::-;28935:102;;29054:148;29198:3;29054:148;:::i;:::-;29047:155;;29219:3;29212:10;;28815:413;;;;;:::o;29234:522::-;;29469:148;29613:3;29469:148;:::i;:::-;29462:155;;29627:75;29698:3;29689:6;29627:75;:::i;:::-;29727:2;29722:3;29718:12;29711:19;;29747:3;29740:10;;29451:305;;;;:::o;29762:222::-;;29893:2;29882:9;29878:18;29870:26;;29906:71;29974:1;29963:9;29959:17;29950:6;29906:71;:::i;:::-;29860:124;;;;:::o;29990:640::-;;30223:3;30212:9;30208:19;30200:27;;30237:71;30305:1;30294:9;30290:17;30281:6;30237:71;:::i;:::-;30318:72;30386:2;30375:9;30371:18;30362:6;30318:72;:::i;:::-;30400;30468:2;30457:9;30453:18;30444:6;30400:72;:::i;:::-;30519:9;30513:4;30509:20;30504:2;30493:9;30489:18;30482:48;30547:76;30618:4;30609:6;30547:76;:::i;:::-;30539:84;;30190:440;;;;;;;:::o;30636:332::-;;30795:2;30784:9;30780:18;30772:26;;30808:71;30876:1;30865:9;30861:17;30852:6;30808:71;:::i;:::-;30889:72;30957:2;30946:9;30942:18;30933:6;30889:72;:::i;:::-;30762:206;;;;;:::o;30974:373::-;;31155:2;31144:9;31140:18;31132:26;;31204:9;31198:4;31194:20;31190:1;31179:9;31175:17;31168:47;31232:108;31335:4;31326:6;31232:108;:::i;:::-;31224:116;;31122:225;;;;:::o;31353:210::-;;31478:2;31467:9;31463:18;31455:26;;31491:65;31553:1;31542:9;31538:17;31529:6;31491:65;:::i;:::-;31445:118;;;;:::o;31569:545::-;;31780:3;31769:9;31765:19;31757:27;;31794:71;31862:1;31851:9;31847:17;31838:6;31794:71;:::i;:::-;31875:68;31939:2;31928:9;31924:18;31915:6;31875:68;:::i;:::-;31953:72;32021:2;32010:9;32006:18;31997:6;31953:72;:::i;:::-;32035;32103:2;32092:9;32088:18;32079:6;32035:72;:::i;:::-;31747:367;;;;;;;:::o;32120:313::-;;32271:2;32260:9;32256:18;32248:26;;32320:9;32314:4;32310:20;32306:1;32295:9;32291:17;32284:47;32348:78;32421:4;32412:6;32348:78;:::i;:::-;32340:86;;32238:195;;;;:::o;32439:419::-;;32643:2;32632:9;32628:18;32620:26;;32692:9;32686:4;32682:20;32678:1;32667:9;32663:17;32656:47;32720:131;32846:4;32720:131;:::i;:::-;32712:139;;32610:248;;;:::o;32864:419::-;;33068:2;33057:9;33053:18;33045:26;;33117:9;33111:4;33107:20;33103:1;33092:9;33088:17;33081:47;33145:131;33271:4;33145:131;:::i;:::-;33137:139;;33035:248;;;:::o;33289:419::-;;33493:2;33482:9;33478:18;33470:26;;33542:9;33536:4;33532:20;33528:1;33517:9;33513:17;33506:47;33570:131;33696:4;33570:131;:::i;:::-;33562:139;;33460:248;;;:::o;33714:419::-;;33918:2;33907:9;33903:18;33895:26;;33967:9;33961:4;33957:20;33953:1;33942:9;33938:17;33931:47;33995:131;34121:4;33995:131;:::i;:::-;33987:139;;33885:248;;;:::o;34139:419::-;;34343:2;34332:9;34328:18;34320:26;;34392:9;34386:4;34382:20;34378:1;34367:9;34363:17;34356:47;34420:131;34546:4;34420:131;:::i;:::-;34412:139;;34310:248;;;:::o;34564:419::-;;34768:2;34757:9;34753:18;34745:26;;34817:9;34811:4;34807:20;34803:1;34792:9;34788:17;34781:47;34845:131;34971:4;34845:131;:::i;:::-;34837:139;;34735:248;;;:::o;34989:419::-;;35193:2;35182:9;35178:18;35170:26;;35242:9;35236:4;35232:20;35228:1;35217:9;35213:17;35206:47;35270:131;35396:4;35270:131;:::i;:::-;35262:139;;35160:248;;;:::o;35414:419::-;;35618:2;35607:9;35603:18;35595:26;;35667:9;35661:4;35657:20;35653:1;35642:9;35638:17;35631:47;35695:131;35821:4;35695:131;:::i;:::-;35687:139;;35585:248;;;:::o;35839:419::-;;36043:2;36032:9;36028:18;36020:26;;36092:9;36086:4;36082:20;36078:1;36067:9;36063:17;36056:47;36120:131;36246:4;36120:131;:::i;:::-;36112:139;;36010:248;;;:::o;36264:419::-;;36468:2;36457:9;36453:18;36445:26;;36517:9;36511:4;36507:20;36503:1;36492:9;36488:17;36481:47;36545:131;36671:4;36545:131;:::i;:::-;36537:139;;36435:248;;;:::o;36689:419::-;;36893:2;36882:9;36878:18;36870:26;;36942:9;36936:4;36932:20;36928:1;36917:9;36913:17;36906:47;36970:131;37096:4;36970:131;:::i;:::-;36962:139;;36860:248;;;:::o;37114:419::-;;37318:2;37307:9;37303:18;37295:26;;37367:9;37361:4;37357:20;37353:1;37342:9;37338:17;37331:47;37395:131;37521:4;37395:131;:::i;:::-;37387:139;;37285:248;;;:::o;37539:419::-;;37743:2;37732:9;37728:18;37720:26;;37792:9;37786:4;37782:20;37778:1;37767:9;37763:17;37756:47;37820:131;37946:4;37820:131;:::i;:::-;37812:139;;37710:248;;;:::o;37964:419::-;;38168:2;38157:9;38153:18;38145:26;;38217:9;38211:4;38207:20;38203:1;38192:9;38188:17;38181:47;38245:131;38371:4;38245:131;:::i;:::-;38237:139;;38135:248;;;:::o;38389:419::-;;38593:2;38582:9;38578:18;38570:26;;38642:9;38636:4;38632:20;38628:1;38617:9;38613:17;38606:47;38670:131;38796:4;38670:131;:::i;:::-;38662:139;;38560:248;;;:::o;38814:419::-;;39018:2;39007:9;39003:18;38995:26;;39067:9;39061:4;39057:20;39053:1;39042:9;39038:17;39031:47;39095:131;39221:4;39095:131;:::i;:::-;39087:139;;38985:248;;;:::o;39239:419::-;;39443:2;39432:9;39428:18;39420:26;;39492:9;39486:4;39482:20;39478:1;39467:9;39463:17;39456:47;39520:131;39646:4;39520:131;:::i;:::-;39512:139;;39410:248;;;:::o;39664:419::-;;39868:2;39857:9;39853:18;39845:26;;39917:9;39911:4;39907:20;39903:1;39892:9;39888:17;39881:47;39945:131;40071:4;39945:131;:::i;:::-;39937:139;;39835:248;;;:::o;40089:419::-;;40293:2;40282:9;40278:18;40270:26;;40342:9;40336:4;40332:20;40328:1;40317:9;40313:17;40306:47;40370:131;40496:4;40370:131;:::i;:::-;40362:139;;40260:248;;;:::o;40514:419::-;;40718:2;40707:9;40703:18;40695:26;;40767:9;40761:4;40757:20;40753:1;40742:9;40738:17;40731:47;40795:131;40921:4;40795:131;:::i;:::-;40787:139;;40685:248;;;:::o;40939:419::-;;41143:2;41132:9;41128:18;41120:26;;41192:9;41186:4;41182:20;41178:1;41167:9;41163:17;41156:47;41220:131;41346:4;41220:131;:::i;:::-;41212:139;;41110:248;;;:::o;41364:419::-;;41568:2;41557:9;41553:18;41545:26;;41617:9;41611:4;41607:20;41603:1;41592:9;41588:17;41581:47;41645:131;41771:4;41645:131;:::i;:::-;41637:139;;41535:248;;;:::o;41789:419::-;;41993:2;41982:9;41978:18;41970:26;;42042:9;42036:4;42032:20;42028:1;42017:9;42013:17;42006:47;42070:131;42196:4;42070:131;:::i;:::-;42062:139;;41960:248;;;:::o;42214:419::-;;42418:2;42407:9;42403:18;42395:26;;42467:9;42461:4;42457:20;42453:1;42442:9;42438:17;42431:47;42495:131;42621:4;42495:131;:::i;:::-;42487:139;;42385:248;;;:::o;42639:419::-;;42843:2;42832:9;42828:18;42820:26;;42892:9;42886:4;42882:20;42878:1;42867:9;42863:17;42856:47;42920:131;43046:4;42920:131;:::i;:::-;42912:139;;42810:248;;;:::o;43064:419::-;;43268:2;43257:9;43253:18;43245:26;;43317:9;43311:4;43307:20;43303:1;43292:9;43288:17;43281:47;43345:131;43471:4;43345:131;:::i;:::-;43337:139;;43235:248;;;:::o;43489:419::-;;43693:2;43682:9;43678:18;43670:26;;43742:9;43736:4;43732:20;43728:1;43717:9;43713:17;43706:47;43770:131;43896:4;43770:131;:::i;:::-;43762:139;;43660:248;;;:::o;43914:419::-;;44118:2;44107:9;44103:18;44095:26;;44167:9;44161:4;44157:20;44153:1;44142:9;44138:17;44131:47;44195:131;44321:4;44195:131;:::i;:::-;44187:139;;44085:248;;;:::o;44339:419::-;;44543:2;44532:9;44528:18;44520:26;;44592:9;44586:4;44582:20;44578:1;44567:9;44563:17;44556:47;44620:131;44746:4;44620:131;:::i;:::-;44612:139;;44510:248;;;:::o;44764:419::-;;44968:2;44957:9;44953:18;44945:26;;45017:9;45011:4;45007:20;45003:1;44992:9;44988:17;44981:47;45045:131;45171:4;45045:131;:::i;:::-;45037:139;;44935:248;;;:::o;45189:419::-;;45393:2;45382:9;45378:18;45370:26;;45442:9;45436:4;45432:20;45428:1;45417:9;45413:17;45406:47;45470:131;45596:4;45470:131;:::i;:::-;45462:139;;45360:248;;;:::o;45614:419::-;;45818:2;45807:9;45803:18;45795:26;;45867:9;45861:4;45857:20;45853:1;45842:9;45838:17;45831:47;45895:131;46021:4;45895:131;:::i;:::-;45887:139;;45785:248;;;:::o;46039:419::-;;46243:2;46232:9;46228:18;46220:26;;46292:9;46286:4;46282:20;46278:1;46267:9;46263:17;46256:47;46320:131;46446:4;46320:131;:::i;:::-;46312:139;;46210:248;;;:::o;46464:222::-;;46595:2;46584:9;46580:18;46572:26;;46608:71;46676:1;46665:9;46661:17;46652:6;46608:71;:::i;:::-;46562:124;;;;:::o;46692:218::-;;46821:2;46810:9;46806:18;46798:26;;46834:69;46900:1;46889:9;46885:17;46876:6;46834:69;:::i;:::-;46788:122;;;;:::o;46916:214::-;;47043:2;47032:9;47028:18;47020:26;;47056:67;47120:1;47109:9;47105:17;47096:6;47056:67;:::i;:::-;47010:120;;;;:::o;47136:283::-;;47202:2;47196:9;47186:19;;47244:4;47236:6;47232:17;47351:6;47339:10;47336:22;47315:18;47303:10;47300:34;47297:62;47294:2;;;47362:18;;:::i;:::-;47294:2;47402:10;47398:2;47391:22;47176:243;;;;:::o;47425:331::-;;47576:18;47568:6;47565:30;47562:2;;;47598:18;;:::i;:::-;47562:2;47683:4;47679:9;47672:4;47664:6;47660:17;47656:33;47648:41;;47744:4;47738;47734:15;47726:23;;47491:265;;;:::o;47762:332::-;;47914:18;47906:6;47903:30;47900:2;;;47936:18;;:::i;:::-;47900:2;48021:4;48017:9;48010:4;48002:6;47998:17;47994:33;47986:41;;48082:4;48076;48072:15;48064:23;;47829:265;;;:::o;48100:132::-;;48190:3;48182:11;;48220:4;48215:3;48211:14;48203:22;;48172:60;;;:::o;48238:141::-;;48310:3;48302:11;;48333:3;48330:1;48323:14;48367:4;48364:1;48354:18;48346:26;;48292:87;;;:::o;48385:114::-;;48486:5;48480:12;48470:22;;48459:40;;;:::o;48505:98::-;;48590:5;48584:12;48574:22;;48563:40;;;:::o;48609:99::-;;48695:5;48689:12;48679:22;;48668:40;;;:::o;48714:113::-;;48816:4;48811:3;48807:14;48799:22;;48789:38;;;:::o;48833:184::-;;48966:6;48961:3;48954:19;49006:4;49001:3;48997:14;48982:29;;48944:73;;;;:::o;49023:168::-;;49140:6;49135:3;49128:19;49180:4;49175:3;49171:14;49156:29;;49118:73;;;;:::o;49197:147::-;;49335:3;49320:18;;49310:34;;;;:::o;49350:169::-;;49468:6;49463:3;49456:19;49508:4;49503:3;49499:14;49484:29;;49446:73;;;;:::o;49525:148::-;;49664:3;49649:18;;49639:34;;;;:::o;49679:305::-;;49738:20;49756:1;49738:20;:::i;:::-;49733:25;;49772:20;49790:1;49772:20;:::i;:::-;49767:25;;49926:1;49858:66;49854:74;49851:1;49848:81;49845:2;;;49932:18;;:::i;:::-;49845:2;49976:1;49973;49969:9;49962:16;;49723:261;;;;:::o;49990:246::-;;50048:19;50065:1;50048:19;:::i;:::-;50043:24;;50081:19;50098:1;50081:19;:::i;:::-;50076:24;;50178:1;50166:10;50162:18;50159:1;50156:25;50153:2;;;50184:18;;:::i;:::-;50153:2;50228:1;50225;50221:9;50214:16;;50033:203;;;;:::o;50242:185::-;;50299:20;50317:1;50299:20;:::i;:::-;50294:25;;50333:20;50351:1;50333:20;:::i;:::-;50328:25;;50372:1;50362:2;;50377:18;;:::i;:::-;50362:2;50419:1;50416;50412:9;50407:14;;50284:143;;;;:::o;50433:348::-;;50496:20;50514:1;50496:20;:::i;:::-;50491:25;;50530:20;50548:1;50530:20;:::i;:::-;50525:25;;50718:1;50650:66;50646:74;50643:1;50640:81;50635:1;50628:9;50621:17;50617:105;50614:2;;;50725:18;;:::i;:::-;50614:2;50773:1;50770;50766:9;50755:20;;50481:300;;;;:::o;50787:191::-;;50847:20;50865:1;50847:20;:::i;:::-;50842:25;;50881:20;50899:1;50881:20;:::i;:::-;50876:25;;50920:1;50917;50914:8;50911:2;;;50925:18;;:::i;:::-;50911:2;50970:1;50967;50963:9;50955:17;;50832:146;;;;:::o;50984:185::-;;51042:18;51058:1;51042:18;:::i;:::-;51037:23;;51074:18;51090:1;51074:18;:::i;:::-;51069:23;;51111:1;51108;51105:8;51102:2;;;51116:18;;:::i;:::-;51102:2;51161:1;51158;51154:9;51146:17;;51027:142;;;;:::o;51175:96::-;;51241:24;51259:5;51241:24;:::i;:::-;51230:35;;51220:51;;;:::o;51277:90::-;;51354:5;51347:13;51340:21;51329:32;;51319:48;;;:::o;51373:77::-;;51439:5;51428:16;;51418:32;;;:::o;51456:149::-;;51532:66;51525:5;51521:78;51510:89;;51500:105;;;:::o;51611:126::-;;51688:42;51681:5;51677:54;51666:65;;51656:81;;;:::o;51743:77::-;;51809:5;51798:16;;51788:32;;;:::o;51826:93::-;;51902:10;51895:5;51891:22;51880:33;;51870:49;;;:::o;51925:86::-;;52000:4;51993:5;51989:16;51978:27;;51968:43;;;:::o;52017:154::-;52101:6;52096:3;52091;52078:30;52163:1;52154:6;52149:3;52145:16;52138:27;52068:103;;;:::o;52177:307::-;52245:1;52255:113;52269:6;52266:1;52263:13;52255:113;;;52354:1;52349:3;52345:11;52339:18;52335:1;52330:3;52326:11;52319:39;52291:2;52288:1;52284:10;52279:15;;52255:113;;;52386:6;52383:1;52380:13;52377:2;;;52466:1;52457:6;52452:3;52448:16;52441:27;52377:2;52226:258;;;;:::o;52490:167::-;;52550:22;52566:5;52550:22;:::i;:::-;52541:31;;52594:4;52587:5;52584:15;52581:2;;;52602:18;;:::i;:::-;52581:2;52649:1;52642:5;52638:13;52631:20;;52531:126;;;:::o;52663:320::-;;52744:1;52738:4;52734:12;52724:22;;52791:1;52785:4;52781:12;52812:18;52802:2;;52868:4;52860:6;52856:17;52846:27;;52802:2;52930;52922:6;52919:14;52899:18;52896:38;52893:2;;;52949:18;;:::i;:::-;52893:2;52714:269;;;;:::o;52989:233::-;;53051:24;53069:5;53051:24;:::i;:::-;53042:33;;53097:66;53090:5;53087:77;53084:2;;;53167:18;;:::i;:::-;53084:2;53214:1;53207:5;53203:13;53196:20;;53032:190;;;:::o;53228:175::-;;53289:23;53306:5;53289:23;:::i;:::-;53280:32;;53334:10;53327:5;53324:21;53321:2;;;53348:18;;:::i;:::-;53321:2;53395:1;53388:5;53384:13;53377:20;;53270:133;;;:::o;53409:100::-;;53477:26;53497:5;53477:26;:::i;:::-;53466:37;;53456:53;;;:::o;53515:79::-;;53583:5;53572:16;;53562:32;;;:::o;53600:94::-;;53668:20;53682:5;53668:20;:::i;:::-;53657:31;;53647:47;;;:::o;53700:176::-;;53749:20;53767:1;53749:20;:::i;:::-;53744:25;;53783:20;53801:1;53783:20;:::i;:::-;53778:25;;53822:1;53812:2;;53827:18;;:::i;:::-;53812:2;53868:1;53865;53861:9;53856:14;;53734:142;;;;:::o;53882:180::-;53930:77;53927:1;53920:88;54027:4;54024:1;54017:15;54051:4;54048:1;54041:15;54068:180;54116:77;54113:1;54106:88;54213:4;54210:1;54203:15;54237:4;54234:1;54227:15;54254:180;54302:77;54299:1;54292:88;54399:4;54396:1;54389:15;54423:4;54420:1;54413:15;54440:180;54488:77;54485:1;54478:88;54585:4;54582:1;54575:15;54609:4;54606:1;54599:15;54626:102;;54718:2;54714:7;54709:2;54702:5;54698:14;54694:28;54684:38;;54674:54;;;:::o;54734:94::-;;54815:5;54811:2;54807:14;54786:35;;54776:52;;;:::o;54834:122::-;54907:24;54925:5;54907:24;:::i;:::-;54900:5;54897:35;54887:2;;54946:1;54943;54936:12;54887:2;54877:79;:::o;54962:116::-;55032:21;55047:5;55032:21;:::i;:::-;55025:5;55022:32;55012:2;;55068:1;55065;55058:12;55012:2;55002:76;:::o;55084:120::-;55156:23;55173:5;55156:23;:::i;:::-;55149:5;55146:34;55136:2;;55194:1;55191;55184:12;55136:2;55126:78;:::o;55210:122::-;55283:24;55301:5;55283:24;:::i;:::-;55276:5;55273:35;55263:2;;55322:1;55319;55312:12;55263:2;55253:79;:::o;55338:120::-;55410:23;55427:5;55410:23;:::i;:::-;55403:5;55400:34;55390:2;;55448:1;55445;55438:12;55390:2;55380:78;:::o;55464:118::-;55535:22;55551:5;55535:22;:::i;:::-;55528:5;55525:33;55515:2;;55572:1;55569;55562:12;55515:2;55505:77;:::o

Swarm Source

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