ETH Price: $3,313.27 (-4.29%)

Token

MBSalvation (FANSIFM)
 

Overview

Max Total Supply

761 FANSIFM

Holders

377

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
aidaha.eth
Balance
1 FANSIFM
0xcb9ebfe6aa4297c4be3946e208a8316fb4313ffb
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
MBSalvation

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 11 of 15: MBSalvation.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

import "./ERC721.sol";
import "./Ownable.sol";
import "./ReentrancyGuard.sol";
import "./ERC721Enumerable.sol";
import "./MerkleProof.sol";

contract MBSalvation is Ownable, ReentrancyGuard, ERC721Enumerable {
    using Strings for uint256;

    string public baseTokenURI;
    bool public isPaused = false;
  
    bytes32 public merkleRoot = 0xd874139d5d95549f9cc83cacf592aceecd4f6c2f554e5d486db783bff4e35282;
    
    uint256 public startTime = 1678863600;
    uint256 public endTime = 1679814000;
    uint256 public lastMint = 1678863600;

    uint8[] public rarityList;
    mapping(uint256 => uint8) public tokenRarityList;
    mapping(uint8 => uint256) public tokenRarityCount;

    struct rarities {
        uint8 level;
        uint8 rarity;
    }
    
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri
    ) ERC721(_name, _symbol) {
        baseTokenURI = _uri;
    }

    function freeMint(bytes32[] calldata _merkleProof)
        external
        onlyUser
        nonReentrant
    {
        require(!isPaused, "MBS: currently paused");
        require(
            block.timestamp >= startTime,
            "MBS: Free mint is not started yet"
        );

        require(
            block.timestamp < endTime,
            "MBS: Free mint is ended"
        );

        require(verifyAddress(_merkleProof), 
            "MBS: You are not allow to mint"
        );

        uint256 curTokenId = totalSupply() + 1;

        _safeMint(_msgSender(), curTokenId);
        uint256 rarity = ((block.timestamp - lastMint) % 600) / 30;
        tokenRarityList[curTokenId] = rarityList[rarity];
        tokenRarityCount[rarityList[rarity]]++;
        lastMint = block.timestamp;
    }

    function ownerMInt(address _addr) external onlyOwner {
        uint256 curTokenId = totalSupply() + 1;
        _safeMint(_addr, curTokenId);

        uint256 rarity = ((block.timestamp - lastMint) % 600) / 30;
        tokenRarityList[curTokenId] = rarityList[rarity];
        tokenRarityCount[rarityList[rarity]]++;
        lastMint = block.timestamp;            
    }

    modifier onlyUser() {
        require(_msgSender() == tx.origin, "MBS: no contract mint");
        _;
    }

    function verifyAddress(bytes32[] calldata _merkleProof) public view returns (bool) {
        if(balanceOf(_msgSender()) > 0){
            return true;
        }else{
            bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));        
            return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
        }        
    }

    function verifyWalletAddress(bytes32[] calldata _merkleProof, address _addr) public view returns (bool) {
        if(balanceOf(_addr) > 0){
            return true;
        }else{
            bytes32 leaf = keccak256(abi.encodePacked(_addr));        
            return MerkleProof.verify(_merkleProof, merkleRoot, leaf);
        }        
    }

    function setMerkleRoot(bytes32 _merkleRootHash) external onlyOwner
    {
        merkleRoot = _merkleRootHash;
    }

    function setRarityList(uint8[] memory _rarities) external onlyOwner
    {
        delete rarityList;
        for (uint8 i = 0; i < _rarities.length; i++) {
            rarityList.push(_rarities[i]);
        }
    }

    function setStartTime(uint256 _time) external onlyOwner {
        startTime = _time;
    }

    function setEndTime(uint256 _time) external onlyOwner {
        endTime = _time;
    }

    function setBaseURI(string memory _baseURI) external onlyOwner {
        baseTokenURI = _baseURI;
    }

    function setPause(bool _isPaused) external onlyOwner returns (bool) {
        isPaused = _isPaused;
        return isPaused;
    }

    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return string(
                    abi.encodePacked(
                        baseTokenURI,                        
                        Strings.toString(tokenRarityList[_tokenId]),
                        ".json"
                    )
                );
    }
}

File 1 of 15: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/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 functionCallWithValue(target, data, 0, "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");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, 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) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or 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 {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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

pragma solidity ^0.8.0;

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

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

File 3 of 15: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.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 4 of 15: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.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: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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: caller is not token owner or 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: caller is not token owner or 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 the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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 _ownerOf(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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

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

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

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

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @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 from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

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

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 /* firstTokenId */,
        uint256 batchSize
    ) internal virtual {
        if (batchSize > 1) {
            if (from != address(0)) {
                _balances[from] -= batchSize;
            }
            if (to != address(0)) {
                _balances[to] += batchSize;
            }
        }
    }

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(address from, address to, uint256 firstTokenId, uint256 batchSize) internal virtual {}
}

File 5 of 15: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.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 See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

        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 6 of 15: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 7 of 15: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

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

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

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

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

File 8 of 15: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.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);

    /**
     * @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 9 of 15: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.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 10 of 15: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 12 of 15: MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuilds the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value from the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i]
                ? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
                : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            unchecked {
                return hashes[totalHashes - 1];
            }
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 13 of 15: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.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() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 14 of 15: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

    /**
     * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
     * `nonReentrant` function in the call stack.
     */
    function _reentrancyGuardEntered() internal view returns (bool) {
        return _status == _ENTERED;
    }
}

File 15 of 15: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"ownerMInt","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rarityList","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setEndTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRootHash","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isPaused","type":"bool"}],"name":"setPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8[]","name":"_rarities","type":"uint8[]"}],"name":"setRarityList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"setStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"tokenRarityCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenRarityList","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"verifyAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"},{"internalType":"address","name":"_addr","type":"address"}],"name":"verifyWalletAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600d60006101000a81548160ff0219169083151502179055507fd874139d5d95549f9cc83cacf592aceecd4f6c2f554e5d486db783bff4e3528260001b600e556364116cf0600f5563641fed706010556364116cf06011553480156200006b57600080fd5b506040516200536e3803806200536e83398181016040528101906200009191906200035a565b8282620000b3620000a7620000fb60201b60201c565b6200010360201b60201c565b600180819055508160029081620000cb91906200065e565b508060039081620000dd91906200065e565b50505080600c9081620000f191906200065e565b5050505062000745565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200023082620001e5565b810181811067ffffffffffffffff82111715620002525762000251620001f6565b5b80604052505050565b600062000267620001c7565b905062000275828262000225565b919050565b600067ffffffffffffffff821115620002985762000297620001f6565b5b620002a382620001e5565b9050602081019050919050565b60005b83811015620002d0578082015181840152602081019050620002b3565b60008484015250505050565b6000620002f3620002ed846200027a565b6200025b565b905082815260208101848484011115620003125762000311620001e0565b5b6200031f848285620002b0565b509392505050565b600082601f8301126200033f576200033e620001db565b5b815162000351848260208601620002dc565b91505092915050565b600080600060608486031215620003765762000375620001d1565b5b600084015167ffffffffffffffff811115620003975762000396620001d6565b5b620003a58682870162000327565b935050602084015167ffffffffffffffff811115620003c957620003c8620001d6565b5b620003d78682870162000327565b925050604084015167ffffffffffffffff811115620003fb57620003fa620001d6565b5b620004098682870162000327565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200046657607f821691505b6020821081036200047c576200047b6200041e565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004e67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004a7565b620004f28683620004a7565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200053f6200053962000533846200050a565b62000514565b6200050a565b9050919050565b6000819050919050565b6200055b836200051e565b620005736200056a8262000546565b848454620004b4565b825550505050565b600090565b6200058a6200057b565b6200059781848462000550565b505050565b5b81811015620005bf57620005b360008262000580565b6001810190506200059d565b5050565b601f8211156200060e57620005d88162000482565b620005e38462000497565b81016020851015620005f3578190505b6200060b620006028562000497565b8301826200059c565b50505b505050565b600082821c905092915050565b6000620006336000198460080262000613565b1980831691505092915050565b60006200064e838362000620565b9150826002028217905092915050565b620006698262000413565b67ffffffffffffffff811115620006855762000684620001f6565b5b6200069182546200044d565b6200069e828285620005c3565b600060209050601f831160018114620006d65760008415620006c1578287015190505b620006cd858262000640565b8655506200073d565b601f198416620006e68662000482565b60005b828110156200071057848901518255600182019150602085019450602081019050620006e9565b868310156200073057848901516200072c601f89168262000620565b8355505b6001600288020188555050505b505050505050565b614c1980620007556000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c806378e979251161013b578063bedb86fb116100b8578063d59ef3991161007c578063d59ef39914610715578063e7cc9a9f14610731578063e985e9c51461074d578063f2fde38b1461077d578063f53e97c61461079957610248565b8063bedb86fb1461064b578063c87b56dd1461067b578063ccb98ffc146106ab578063d1e60b4c146106c7578063d547cfb7146106f757610248565b806395d89b41116100ff57806395d89b41146105a7578063a22cb465146105c5578063b187bd26146105e1578063b88d4fde146105ff578063bb4eaebb1461061b57610248565b806378e97925146105035780637cb64759146105215780638462151c1461053d57806388d15d501461056d5780638da5cb5b1461058957610248565b80633ccfd60b116101c9578063586fc5b51161018d578063586fc5b51461044b5780636352211e146104695780636fd3d9e21461049957806370a08231146104c9578063715018a6146104f957610248565b80633ccfd60b146103bd5780633e0a322d146103c757806342842e0e146103e35780634f6ccce7146103ff57806355f804b31461042f57610248565b806323b872dd1161021057806323b872dd146103055780632eb4a7ab146103215780632f745c591461033f5780633197cbb61461036f57806336591c211461038d57610248565b806301ffc9a71461024d57806306fdde031461027d578063081812fc1461029b578063095ea7b3146102cb57806318160ddd146102e7575b600080fd5b61026760048036038101906102629190612f03565b6107c9565b6040516102749190612f4b565b60405180910390f35b610285610843565b6040516102929190612ff6565b60405180910390f35b6102b560048036038101906102b0919061304e565b6108d5565b6040516102c291906130bc565b60405180910390f35b6102e560048036038101906102e09190613103565b61091b565b005b6102ef610a32565b6040516102fc9190613152565b60405180910390f35b61031f600480360381019061031a919061316d565b610a3f565b005b610329610a9f565b60405161033691906131d9565b60405180910390f35b61035960048036038101906103549190613103565b610aa5565b6040516103669190613152565b60405180910390f35b610377610b4a565b6040516103849190613152565b60405180910390f35b6103a760048036038101906103a29190613259565b610b50565b6040516103b49190612f4b565b60405180910390f35b6103c5610bfc565b005b6103e160048036038101906103dc919061304e565b610c54565b005b6103fd60048036038101906103f8919061316d565b610c66565b005b6104196004803603810190610414919061304e565b610c86565b6040516104269190613152565b60405180910390f35b610449600480360381019061044491906133d6565b610cf7565b005b610453610d12565b6040516104609190613152565b60405180910390f35b610483600480360381019061047e919061304e565b610d18565b60405161049091906130bc565b60405180910390f35b6104b360048036038101906104ae919061304e565b610d9e565b6040516104c0919061343b565b60405180910390f35b6104e360048036038101906104de9190613456565b610dd2565b6040516104f09190613152565b60405180910390f35b610501610e89565b005b61050b610e9d565b6040516105189190613152565b60405180910390f35b61053b600480360381019061053691906134af565b610ea3565b005b61055760048036038101906105529190613456565b610eb5565b604051610564919061359a565b60405180910390f35b61058760048036038101906105829190613259565b610fbe565b005b610591611287565b60405161059e91906130bc565b60405180910390f35b6105af6112b0565b6040516105bc9190612ff6565b60405180910390f35b6105df60048036038101906105da91906135e8565b611342565b005b6105e9611358565b6040516105f69190612f4b565b60405180910390f35b610619600480360381019061061491906136c9565b61136b565b005b61063560048036038101906106309190613778565b6113cd565b6040516106429190613152565b60405180910390f35b610665600480360381019061066091906137a5565b6113e5565b6040516106729190612f4b565b60405180910390f35b6106956004803603810190610690919061304e565b611420565b6040516106a29190612ff6565b60405180910390f35b6106c560048036038101906106c0919061304e565b611477565b005b6106e160048036038101906106dc919061304e565b611489565b6040516106ee919061343b565b60405180910390f35b6106ff6114a9565b60405161070c9190612ff6565b60405180910390f35b61072f600480360381019061072a9190613456565b611537565b005b61074b60048036038101906107469190613895565b611659565b005b610767600480360381019061076291906138de565b6116f7565b6040516107749190612f4b565b60405180910390f35b61079760048036038101906107929190613456565b61178b565b005b6107b360048036038101906107ae919061391e565b61180e565b6040516107c09190612f4b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083c575061083b826118ad565b5b9050919050565b606060028054610852906139ad565b80601f016020809104026020016040519081016040528092919081815260200182805461087e906139ad565b80156108cb5780601f106108a0576101008083540402835291602001916108cb565b820191906000526020600020905b8154815290600101906020018083116108ae57829003601f168201915b5050505050905090565b60006108e08261198f565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092682610d18565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098d90613a50565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b56119da565b73ffffffffffffffffffffffffffffffffffffffff1614806109e457506109e3816109de6119da565b6116f7565b5b610a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1a90613ae2565b60405180910390fd5b610a2d83836119e2565b505050565b6000600a80549050905090565b610a50610a4a6119da565b82611a9b565b610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613b74565b60405180910390fd5b610a9a838383611b30565b505050565b600e5481565b6000610ab083610dd2565b8210610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890613c06565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b600080610b63610b5e6119da565b610dd2565b1115610b725760019050610bf6565b6000610b7c6119da565b604051602001610b8c9190613c6e565b604051602081830303815290604052805190602001209050610bf2848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483611e29565b9150505b92915050565b610c04611e40565b610c0c611287565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c51573d6000803e3d6000fd5b50565b610c5c611e40565b80600f8190555050565b610c818383836040518060200160405280600081525061136b565b505050565b6000610c90610a32565b8210610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890613cfb565b60405180910390fd5b600a8281548110610ce557610ce4613d1b565b5b90600052602060002001549050919050565b610cff611e40565b80600c9081610d0e9190613ef6565b5050565b60115481565b600080610d2483611ebe565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614014565b60405180910390fd5b80915050919050565b60128181548110610dae57600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e39906140a6565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e91611e40565b610e9b6000611efb565b565b600f5481565b610eab611e40565b80600e8190555050565b60606000610ec283610dd2565b905060008103610f1e57600067ffffffffffffffff811115610ee757610ee66132ab565b5b604051908082528060200260200182016040528015610f155781602001602082028036833780820191505090505b50915050610fb9565b60008167ffffffffffffffff811115610f3a57610f396132ab565b5b604051908082528060200260200182016040528015610f685781602001602082028036833780820191505090505b50905060005b82811015610fb257610f808582610aa5565b828281518110610f9357610f92613d1b565b5b6020026020010181815250508080610faa906140f5565b915050610f6e565b8193505050505b919050565b3273ffffffffffffffffffffffffffffffffffffffff16610fdd6119da565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90614189565b60405180910390fd5b61103b611fbf565b600d60009054906101000a900460ff161561108b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611082906141f5565b60405180910390fd5b600f544210156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790614287565b60405180910390fd5b6010544210611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906142f3565b60405180910390fd5b61111e8282610b50565b61115d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111549061435f565b60405180910390fd5b60006001611169610a32565b611173919061437f565b90506111866111806119da565b8261200e565b6000601e6102586011544261119b91906143b3565b6111a59190614416565b6111af9190614447565b9050601281815481106111c5576111c4613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff166013600084815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460006012838154811061122857611227613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff168152602001908152602001600020600081548092919061126d906140f5565b919050555042601181905550505061128361202c565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112bf906139ad565b80601f01602080910402602001604051908101604052809291908181526020018280546112eb906139ad565b80156113385780601f1061130d57610100808354040283529160200191611338565b820191906000526020600020905b81548152906001019060200180831161131b57829003601f168201915b5050505050905090565b61135461134d6119da565b8383612035565b5050565b600d60009054906101000a900460ff1681565b61137c6113766119da565b83611a9b565b6113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290613b74565b60405180910390fd5b6113c7848484846121a1565b50505050565b60146020528060005260406000206000915090505481565b60006113ef611e40565b81600d60006101000a81548160ff021916908315150217905550600d60009054906101000a900460ff169050919050565b6060600c6114506013600085815260200190815260200160002060009054906101000a900460ff1660ff166121fd565b604051602001611461929190614583565b6040516020818303038152906040529050919050565b61147f611e40565b8060108190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b600c80546114b6906139ad565b80601f01602080910402602001604051908101604052809291908181526020018280546114e2906139ad565b801561152f5780601f106115045761010080835404028352916020019161152f565b820191906000526020600020905b81548152906001019060200180831161151257829003601f168201915b505050505081565b61153f611e40565b6000600161154b610a32565b611555919061437f565b9050611561828261200e565b6000601e6102586011544261157691906143b3565b6115809190614416565b61158a9190614447565b9050601281815481106115a05761159f613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff166013600084815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460006012838154811061160357611602613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff1681526020019081526020016000206000815480929190611648906140f5565b919050555042601181905550505050565b611661611e40565b6012600061166f9190612e52565b60005b81518160ff1610156116f3576012828260ff168151811061169657611695613d1b565b5b602002602001015190806001815401808255809150506001900390600052602060002090602091828204019190069091909190916101000a81548160ff021916908360ff16021790555080806116eb906145b2565b915050611672565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611793611e40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f99061464d565b60405180910390fd5b61180b81611efb565b50565b60008061181a83610dd2565b111561182957600190506118a6565b60008260405160200161183c9190613c6e565b6040516020818303038152906040528051906020012090506118a2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483611e29565b9150505b9392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061197857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061198857506119878261235d565b5b9050919050565b611998816123c7565b6119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90614014565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5583610d18565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611aa783610d18565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae95750611ae881856116f7565b5b80611b2757508373ffffffffffffffffffffffffffffffffffffffff16611b0f846108d5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b5082610d18565b73ffffffffffffffffffffffffffffffffffffffff1614611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d906146df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c90614771565b60405180910390fd5b611c228383836001612408565b8273ffffffffffffffffffffffffffffffffffffffff16611c4282610d18565b73ffffffffffffffffffffffffffffffffffffffff1614611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f906146df565b60405180910390fd5b6006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e248383836001612566565b505050565b600082611e36858461256c565b1490509392505050565b611e486119da565b73ffffffffffffffffffffffffffffffffffffffff16611e66611287565b73ffffffffffffffffffffffffffffffffffffffff1614611ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb3906147dd565b60405180910390fd5b565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260015403612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614849565b60405180910390fd5b6002600181905550565b6120288282604051806020016040528060008152506125c2565b5050565b60018081905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a906148b5565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121949190612f4b565b60405180910390a3505050565b6121ac848484611b30565b6121b88484848461261d565b6121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90614947565b60405180910390fd5b50505050565b606060008203612244576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612358565b600082905060005b6000821461227657808061225f906140f5565b915050600a8261226f9190614447565b915061224c565b60008167ffffffffffffffff811115612292576122916132ab565b5b6040519080825280601f01601f1916602001820160405280156122c45781602001600182028036833780820191505090505b5090505b60008514612351576001826122dd91906143b3565b9150600a856122ec9190614416565b60306122f8919061437f565b60f81b81838151811061230e5761230d613d1b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561234a9190614447565b94506122c8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166123e983611ebe565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612414848484846127a4565b6001811115612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f906149d9565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361249f5761249a816128ca565b6124de565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146124dd576124dc8582612913565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125205761251b81612a80565b61255f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461255e5761255d8482612b51565b5b5b5050505050565b50505050565b60008082905060005b84518110156125b7576125a28286838151811061259557612594613d1b565b5b6020026020010151612bd0565b915080806125af906140f5565b915050612575565b508091505092915050565b6125cc8383612bfb565b6125d9600084848461261d565b612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614947565b60405180910390fd5b505050565b600061263e8473ffffffffffffffffffffffffffffffffffffffff16612e18565b15612797578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126676119da565b8786866040518563ffffffff1660e01b81526004016126899493929190614a4e565b6020604051808303816000875af19250505080156126c557506040513d601f19601f820116820180604052508101906126c29190614aaf565b60015b612747573d80600081146126f5576040519150601f19603f3d011682016040523d82523d6000602084013e6126fa565b606091505b50600081510361273f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273690614947565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061279c565b600190505b949350505050565b60018111156128c457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128385780600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283091906143b3565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128c35780600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128bb919061437f565b925050819055505b5b50505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161292084610dd2565b61292a91906143b3565b9050600060096000848152602001908152602001600020549050818114612a0f576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612a9491906143b3565b90506000600b60008481526020019081526020016000205490506000600a8381548110612ac457612ac3613d1b565b5b9060005260206000200154905080600a8381548110612ae657612ae5613d1b565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612b3557612b34614adc565b5b6001900381819060005260206000200160009055905550505050565b6000612b5c83610dd2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b6000818310612be857612be38284612e3b565b612bf3565b612bf28383612e3b565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6190614b57565b60405180910390fd5b612c73816123c7565b15612cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caa90614bc3565b60405180910390fd5b612cc1600083836001612408565b612cca816123c7565b15612d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0190614bc3565b60405180910390fd5b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e14600083836001612566565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b50805460008255601f016020900490600052602060002090810190612e779190612e7a565b50565b5b80821115612e93576000816000905550600101612e7b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ee081612eab565b8114612eeb57600080fd5b50565b600081359050612efd81612ed7565b92915050565b600060208284031215612f1957612f18612ea1565b5b6000612f2784828501612eee565b91505092915050565b60008115159050919050565b612f4581612f30565b82525050565b6000602082019050612f606000830184612f3c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa0578082015181840152602081019050612f85565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fc882612f66565b612fd28185612f71565b9350612fe2818560208601612f82565b612feb81612fac565b840191505092915050565b600060208201905081810360008301526130108184612fbd565b905092915050565b6000819050919050565b61302b81613018565b811461303657600080fd5b50565b60008135905061304881613022565b92915050565b60006020828403121561306457613063612ea1565b5b600061307284828501613039565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130a68261307b565b9050919050565b6130b68161309b565b82525050565b60006020820190506130d160008301846130ad565b92915050565b6130e08161309b565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b6000806040838503121561311a57613119612ea1565b5b6000613128858286016130ee565b925050602061313985828601613039565b9150509250929050565b61314c81613018565b82525050565b60006020820190506131676000830184613143565b92915050565b60008060006060848603121561318657613185612ea1565b5b6000613194868287016130ee565b93505060206131a5868287016130ee565b92505060406131b686828701613039565b9150509250925092565b6000819050919050565b6131d3816131c0565b82525050565b60006020820190506131ee60008301846131ca565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613219576132186131f4565b5b8235905067ffffffffffffffff811115613236576132356131f9565b5b602083019150836020820283011115613252576132516131fe565b5b9250929050565b600080602083850312156132705761326f612ea1565b5b600083013567ffffffffffffffff81111561328e5761328d612ea6565b5b61329a85828601613203565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132e382612fac565b810181811067ffffffffffffffff82111715613302576133016132ab565b5b80604052505050565b6000613315612e97565b905061332182826132da565b919050565b600067ffffffffffffffff821115613341576133406132ab565b5b61334a82612fac565b9050602081019050919050565b82818337600083830152505050565b600061337961337484613326565b61330b565b905082815260208101848484011115613395576133946132a6565b5b6133a0848285613357565b509392505050565b600082601f8301126133bd576133bc6131f4565b5b81356133cd848260208601613366565b91505092915050565b6000602082840312156133ec576133eb612ea1565b5b600082013567ffffffffffffffff81111561340a57613409612ea6565b5b613416848285016133a8565b91505092915050565b600060ff82169050919050565b6134358161341f565b82525050565b6000602082019050613450600083018461342c565b92915050565b60006020828403121561346c5761346b612ea1565b5b600061347a848285016130ee565b91505092915050565b61348c816131c0565b811461349757600080fd5b50565b6000813590506134a981613483565b92915050565b6000602082840312156134c5576134c4612ea1565b5b60006134d38482850161349a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61351181613018565b82525050565b60006135238383613508565b60208301905092915050565b6000602082019050919050565b6000613547826134dc565b61355181856134e7565b935061355c836134f8565b8060005b8381101561358d5781516135748882613517565b975061357f8361352f565b925050600181019050613560565b5085935050505092915050565b600060208201905081810360008301526135b4818461353c565b905092915050565b6135c581612f30565b81146135d057600080fd5b50565b6000813590506135e2816135bc565b92915050565b600080604083850312156135ff576135fe612ea1565b5b600061360d858286016130ee565b925050602061361e858286016135d3565b9150509250929050565b600067ffffffffffffffff821115613643576136426132ab565b5b61364c82612fac565b9050602081019050919050565b600061366c61366784613628565b61330b565b905082815260208101848484011115613688576136876132a6565b5b613693848285613357565b509392505050565b600082601f8301126136b0576136af6131f4565b5b81356136c0848260208601613659565b91505092915050565b600080600080608085870312156136e3576136e2612ea1565b5b60006136f1878288016130ee565b9450506020613702878288016130ee565b935050604061371387828801613039565b925050606085013567ffffffffffffffff81111561373457613733612ea6565b5b6137408782880161369b565b91505092959194509250565b6137558161341f565b811461376057600080fd5b50565b6000813590506137728161374c565b92915050565b60006020828403121561378e5761378d612ea1565b5b600061379c84828501613763565b91505092915050565b6000602082840312156137bb576137ba612ea1565b5b60006137c9848285016135d3565b91505092915050565b600067ffffffffffffffff8211156137ed576137ec6132ab565b5b602082029050602081019050919050565b600061381161380c846137d2565b61330b565b90508083825260208201905060208402830185811115613834576138336131fe565b5b835b8181101561385d57806138498882613763565b845260208401935050602081019050613836565b5050509392505050565b600082601f83011261387c5761387b6131f4565b5b813561388c8482602086016137fe565b91505092915050565b6000602082840312156138ab576138aa612ea1565b5b600082013567ffffffffffffffff8111156138c9576138c8612ea6565b5b6138d584828501613867565b91505092915050565b600080604083850312156138f5576138f4612ea1565b5b6000613903858286016130ee565b9250506020613914858286016130ee565b9150509250929050565b60008060006040848603121561393757613936612ea1565b5b600084013567ffffffffffffffff81111561395557613954612ea6565b5b61396186828701613203565b93509350506020613974868287016130ee565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139c557607f821691505b6020821081036139d8576139d761397e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3a602183612f71565b9150613a45826139de565b604082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613acc603d83612f71565b9150613ad782613a70565b604082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b5e602d83612f71565b9150613b6982613b02565b604082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613bf0602b83612f71565b9150613bfb82613b94565b604082019050919050565b60006020820190508181036000830152613c1f81613be3565b9050919050565b60008160601b9050919050565b6000613c3e82613c26565b9050919050565b6000613c5082613c33565b9050919050565b613c68613c638261309b565b613c45565b82525050565b6000613c7a8284613c57565b60148201915081905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ce5602c83612f71565b9150613cf082613c89565b604082019050919050565b60006020820190508181036000830152613d1481613cd8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613dac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d6f565b613db68683613d6f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613df3613dee613de984613018565b613dce565b613018565b9050919050565b6000819050919050565b613e0d83613dd8565b613e21613e1982613dfa565b848454613d7c565b825550505050565b600090565b613e36613e29565b613e41818484613e04565b505050565b5b81811015613e6557613e5a600082613e2e565b600181019050613e47565b5050565b601f821115613eaa57613e7b81613d4a565b613e8484613d5f565b81016020851015613e93578190505b613ea7613e9f85613d5f565b830182613e46565b50505b505050565b600082821c905092915050565b6000613ecd60001984600802613eaf565b1980831691505092915050565b6000613ee68383613ebc565b9150826002028217905092915050565b613eff82612f66565b67ffffffffffffffff811115613f1857613f176132ab565b5b613f2282546139ad565b613f2d828285613e69565b600060209050601f831160018114613f605760008415613f4e578287015190505b613f588582613eda565b865550613fc0565b601f198416613f6e86613d4a565b60005b82811015613f9657848901518255600182019150602085019450602081019050613f71565b86831015613fb35784890151613faf601f891682613ebc565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ffe601883612f71565b915061400982613fc8565b602082019050919050565b6000602082019050818103600083015261402d81613ff1565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614090602983612f71565b915061409b82614034565b604082019050919050565b600060208201905081810360008301526140bf81614083565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061410082613018565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614132576141316140c6565b5b600182019050919050565b7f4d42533a206e6f20636f6e7472616374206d696e740000000000000000000000600082015250565b6000614173601583612f71565b915061417e8261413d565b602082019050919050565b600060208201905081810360008301526141a281614166565b9050919050565b7f4d42533a2063757272656e746c79207061757365640000000000000000000000600082015250565b60006141df601583612f71565b91506141ea826141a9565b602082019050919050565b6000602082019050818103600083015261420e816141d2565b9050919050565b7f4d42533a2046726565206d696e74206973206e6f74207374617274656420796560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614271602183612f71565b915061427c82614215565b604082019050919050565b600060208201905081810360008301526142a081614264565b9050919050565b7f4d42533a2046726565206d696e7420697320656e646564000000000000000000600082015250565b60006142dd601783612f71565b91506142e8826142a7565b602082019050919050565b6000602082019050818103600083015261430c816142d0565b9050919050565b7f4d42533a20596f7520617265206e6f7420616c6c6f7720746f206d696e740000600082015250565b6000614349601e83612f71565b915061435482614313565b602082019050919050565b600060208201905081810360008301526143788161433c565b9050919050565b600061438a82613018565b915061439583613018565b92508282019050808211156143ad576143ac6140c6565b5b92915050565b60006143be82613018565b91506143c983613018565b92508282039050818111156143e1576143e06140c6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061442182613018565b915061442c83613018565b92508261443c5761443b6143e7565b5b828206905092915050565b600061445282613018565b915061445d83613018565b92508261446d5761446c6143e7565b5b828204905092915050565b600081905092915050565b60008154614490816139ad565b61449a8186614478565b945060018216600081146144b557600181146144ca576144fd565b60ff19831686528115158202860193506144fd565b6144d385613d4a565b60005b838110156144f5578154818901526001820191506020810190506144d6565b838801955050505b50505092915050565b600061451182612f66565b61451b8185614478565b935061452b818560208601612f82565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061456d600583614478565b915061457882614537565b600582019050919050565b600061458f8285614483565b915061459b8284614506565b91506145a682614560565b91508190509392505050565b60006145bd8261341f565b915060ff82036145d0576145cf6140c6565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614637602683612f71565b9150614642826145db565b604082019050919050565b600060208201905081810360008301526146668161462a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146c9602583612f71565b91506146d48261466d565b604082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475b602483612f71565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147c7602083612f71565b91506147d282614791565b602082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614833601f83612f71565b915061483e826147fd565b602082019050919050565b6000602082019050818103600083015261486281614826565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061489f601983612f71565b91506148aa82614869565b602082019050919050565b600060208201905081810360008301526148ce81614892565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614931603283612f71565b915061493c826148d5565b604082019050919050565b6000602082019050818103600083015261496081614924565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006149c3603583612f71565b91506149ce82614967565b604082019050919050565b600060208201905081810360008301526149f2816149b6565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614a20826149f9565b614a2a8185614a04565b9350614a3a818560208601612f82565b614a4381612fac565b840191505092915050565b6000608082019050614a6360008301876130ad565b614a7060208301866130ad565b614a7d6040830185613143565b8181036060830152614a8f8184614a15565b905095945050505050565b600081519050614aa981612ed7565b92915050565b600060208284031215614ac557614ac4612ea1565b5b6000614ad384828501614a9a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614b41602083612f71565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614bad601c83612f71565b9150614bb882614b77565b602082019050919050565b60006020820190508181036000830152614bdc81614ba0565b905091905056fea2646970667358221220da91afee45bc6fbd6e40fe7ae7ed5ca0cbf44d0ffafd7ec8fc5349e084a474ba64736f6c63430008110033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b4d4253616c766174696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746414e5349464d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d654866474c58754b37477962676e53474b456b364b594a73464a72613142446d42586d5a4e373563457246672f000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102485760003560e01c806378e979251161013b578063bedb86fb116100b8578063d59ef3991161007c578063d59ef39914610715578063e7cc9a9f14610731578063e985e9c51461074d578063f2fde38b1461077d578063f53e97c61461079957610248565b8063bedb86fb1461064b578063c87b56dd1461067b578063ccb98ffc146106ab578063d1e60b4c146106c7578063d547cfb7146106f757610248565b806395d89b41116100ff57806395d89b41146105a7578063a22cb465146105c5578063b187bd26146105e1578063b88d4fde146105ff578063bb4eaebb1461061b57610248565b806378e97925146105035780637cb64759146105215780638462151c1461053d57806388d15d501461056d5780638da5cb5b1461058957610248565b80633ccfd60b116101c9578063586fc5b51161018d578063586fc5b51461044b5780636352211e146104695780636fd3d9e21461049957806370a08231146104c9578063715018a6146104f957610248565b80633ccfd60b146103bd5780633e0a322d146103c757806342842e0e146103e35780634f6ccce7146103ff57806355f804b31461042f57610248565b806323b872dd1161021057806323b872dd146103055780632eb4a7ab146103215780632f745c591461033f5780633197cbb61461036f57806336591c211461038d57610248565b806301ffc9a71461024d57806306fdde031461027d578063081812fc1461029b578063095ea7b3146102cb57806318160ddd146102e7575b600080fd5b61026760048036038101906102629190612f03565b6107c9565b6040516102749190612f4b565b60405180910390f35b610285610843565b6040516102929190612ff6565b60405180910390f35b6102b560048036038101906102b0919061304e565b6108d5565b6040516102c291906130bc565b60405180910390f35b6102e560048036038101906102e09190613103565b61091b565b005b6102ef610a32565b6040516102fc9190613152565b60405180910390f35b61031f600480360381019061031a919061316d565b610a3f565b005b610329610a9f565b60405161033691906131d9565b60405180910390f35b61035960048036038101906103549190613103565b610aa5565b6040516103669190613152565b60405180910390f35b610377610b4a565b6040516103849190613152565b60405180910390f35b6103a760048036038101906103a29190613259565b610b50565b6040516103b49190612f4b565b60405180910390f35b6103c5610bfc565b005b6103e160048036038101906103dc919061304e565b610c54565b005b6103fd60048036038101906103f8919061316d565b610c66565b005b6104196004803603810190610414919061304e565b610c86565b6040516104269190613152565b60405180910390f35b610449600480360381019061044491906133d6565b610cf7565b005b610453610d12565b6040516104609190613152565b60405180910390f35b610483600480360381019061047e919061304e565b610d18565b60405161049091906130bc565b60405180910390f35b6104b360048036038101906104ae919061304e565b610d9e565b6040516104c0919061343b565b60405180910390f35b6104e360048036038101906104de9190613456565b610dd2565b6040516104f09190613152565b60405180910390f35b610501610e89565b005b61050b610e9d565b6040516105189190613152565b60405180910390f35b61053b600480360381019061053691906134af565b610ea3565b005b61055760048036038101906105529190613456565b610eb5565b604051610564919061359a565b60405180910390f35b61058760048036038101906105829190613259565b610fbe565b005b610591611287565b60405161059e91906130bc565b60405180910390f35b6105af6112b0565b6040516105bc9190612ff6565b60405180910390f35b6105df60048036038101906105da91906135e8565b611342565b005b6105e9611358565b6040516105f69190612f4b565b60405180910390f35b610619600480360381019061061491906136c9565b61136b565b005b61063560048036038101906106309190613778565b6113cd565b6040516106429190613152565b60405180910390f35b610665600480360381019061066091906137a5565b6113e5565b6040516106729190612f4b565b60405180910390f35b6106956004803603810190610690919061304e565b611420565b6040516106a29190612ff6565b60405180910390f35b6106c560048036038101906106c0919061304e565b611477565b005b6106e160048036038101906106dc919061304e565b611489565b6040516106ee919061343b565b60405180910390f35b6106ff6114a9565b60405161070c9190612ff6565b60405180910390f35b61072f600480360381019061072a9190613456565b611537565b005b61074b60048036038101906107469190613895565b611659565b005b610767600480360381019061076291906138de565b6116f7565b6040516107749190612f4b565b60405180910390f35b61079760048036038101906107929190613456565b61178b565b005b6107b360048036038101906107ae919061391e565b61180e565b6040516107c09190612f4b565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061083c575061083b826118ad565b5b9050919050565b606060028054610852906139ad565b80601f016020809104026020016040519081016040528092919081815260200182805461087e906139ad565b80156108cb5780601f106108a0576101008083540402835291602001916108cb565b820191906000526020600020905b8154815290600101906020018083116108ae57829003601f168201915b5050505050905090565b60006108e08261198f565b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092682610d18565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610996576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098d90613a50565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b56119da565b73ffffffffffffffffffffffffffffffffffffffff1614806109e457506109e3816109de6119da565b6116f7565b5b610a23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1a90613ae2565b60405180910390fd5b610a2d83836119e2565b505050565b6000600a80549050905090565b610a50610a4a6119da565b82611a9b565b610a8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8690613b74565b60405180910390fd5b610a9a838383611b30565b505050565b600e5481565b6000610ab083610dd2565b8210610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890613c06565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60105481565b600080610b63610b5e6119da565b610dd2565b1115610b725760019050610bf6565b6000610b7c6119da565b604051602001610b8c9190613c6e565b604051602081830303815290604052805190602001209050610bf2848480806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483611e29565b9150505b92915050565b610c04611e40565b610c0c611287565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610c51573d6000803e3d6000fd5b50565b610c5c611e40565b80600f8190555050565b610c818383836040518060200160405280600081525061136b565b505050565b6000610c90610a32565b8210610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890613cfb565b60405180910390fd5b600a8281548110610ce557610ce4613d1b565b5b90600052602060002001549050919050565b610cff611e40565b80600c9081610d0e9190613ef6565b5050565b60115481565b600080610d2483611ebe565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614014565b60405180910390fd5b80915050919050565b60128181548110610dae57600080fd5b9060005260206000209060209182820401919006915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e39906140a6565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e91611e40565b610e9b6000611efb565b565b600f5481565b610eab611e40565b80600e8190555050565b60606000610ec283610dd2565b905060008103610f1e57600067ffffffffffffffff811115610ee757610ee66132ab565b5b604051908082528060200260200182016040528015610f155781602001602082028036833780820191505090505b50915050610fb9565b60008167ffffffffffffffff811115610f3a57610f396132ab565b5b604051908082528060200260200182016040528015610f685781602001602082028036833780820191505090505b50905060005b82811015610fb257610f808582610aa5565b828281518110610f9357610f92613d1b565b5b6020026020010181815250508080610faa906140f5565b915050610f6e565b8193505050505b919050565b3273ffffffffffffffffffffffffffffffffffffffff16610fdd6119da565b73ffffffffffffffffffffffffffffffffffffffff1614611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a90614189565b60405180910390fd5b61103b611fbf565b600d60009054906101000a900460ff161561108b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611082906141f5565b60405180910390fd5b600f544210156110d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c790614287565b60405180910390fd5b6010544210611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b906142f3565b60405180910390fd5b61111e8282610b50565b61115d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111549061435f565b60405180910390fd5b60006001611169610a32565b611173919061437f565b90506111866111806119da565b8261200e565b6000601e6102586011544261119b91906143b3565b6111a59190614416565b6111af9190614447565b9050601281815481106111c5576111c4613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff166013600084815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460006012838154811061122857611227613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff168152602001908152602001600020600081548092919061126d906140f5565b919050555042601181905550505061128361202c565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112bf906139ad565b80601f01602080910402602001604051908101604052809291908181526020018280546112eb906139ad565b80156113385780601f1061130d57610100808354040283529160200191611338565b820191906000526020600020905b81548152906001019060200180831161131b57829003601f168201915b5050505050905090565b61135461134d6119da565b8383612035565b5050565b600d60009054906101000a900460ff1681565b61137c6113766119da565b83611a9b565b6113bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b290613b74565b60405180910390fd5b6113c7848484846121a1565b50505050565b60146020528060005260406000206000915090505481565b60006113ef611e40565b81600d60006101000a81548160ff021916908315150217905550600d60009054906101000a900460ff169050919050565b6060600c6114506013600085815260200190815260200160002060009054906101000a900460ff1660ff166121fd565b604051602001611461929190614583565b6040516020818303038152906040529050919050565b61147f611e40565b8060108190555050565b60136020528060005260406000206000915054906101000a900460ff1681565b600c80546114b6906139ad565b80601f01602080910402602001604051908101604052809291908181526020018280546114e2906139ad565b801561152f5780601f106115045761010080835404028352916020019161152f565b820191906000526020600020905b81548152906001019060200180831161151257829003601f168201915b505050505081565b61153f611e40565b6000600161154b610a32565b611555919061437f565b9050611561828261200e565b6000601e6102586011544261157691906143b3565b6115809190614416565b61158a9190614447565b9050601281815481106115a05761159f613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff166013600084815260200190815260200160002060006101000a81548160ff021916908360ff160217905550601460006012838154811061160357611602613d1b565b5b90600052602060002090602091828204019190069054906101000a900460ff1660ff1660ff1681526020019081526020016000206000815480929190611648906140f5565b919050555042601181905550505050565b611661611e40565b6012600061166f9190612e52565b60005b81518160ff1610156116f3576012828260ff168151811061169657611695613d1b565b5b602002602001015190806001815401808255809150506001900390600052602060002090602091828204019190069091909190916101000a81548160ff021916908360ff16021790555080806116eb906145b2565b915050611672565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611793611e40565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f99061464d565b60405180910390fd5b61180b81611efb565b50565b60008061181a83610dd2565b111561182957600190506118a6565b60008260405160200161183c9190613c6e565b6040516020818303038152906040528051906020012090506118a2858580806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600e5483611e29565b9150505b9392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061197857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061198857506119878261235d565b5b9050919050565b611998816123c7565b6119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce90614014565b60405180910390fd5b50565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611a5583610d18565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080611aa783610d18565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ae95750611ae881856116f7565b5b80611b2757508373ffffffffffffffffffffffffffffffffffffffff16611b0f846108d5565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b5082610d18565b73ffffffffffffffffffffffffffffffffffffffff1614611ba6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9d906146df565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c90614771565b60405180910390fd5b611c228383836001612408565b8273ffffffffffffffffffffffffffffffffffffffff16611c4282610d18565b73ffffffffffffffffffffffffffffffffffffffff1614611c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8f906146df565b60405180910390fd5b6006600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e248383836001612566565b505050565b600082611e36858461256c565b1490509392505050565b611e486119da565b73ffffffffffffffffffffffffffffffffffffffff16611e66611287565b73ffffffffffffffffffffffffffffffffffffffff1614611ebc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb3906147dd565b60405180910390fd5b565b60006004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600260015403612004576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ffb90614849565b60405180910390fd5b6002600181905550565b6120288282604051806020016040528060008152506125c2565b5050565b60018081905550565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036120a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209a906148b5565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121949190612f4b565b60405180910390a3505050565b6121ac848484611b30565b6121b88484848461261d565b6121f7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121ee90614947565b60405180910390fd5b50505050565b606060008203612244576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612358565b600082905060005b6000821461227657808061225f906140f5565b915050600a8261226f9190614447565b915061224c565b60008167ffffffffffffffff811115612292576122916132ab565b5b6040519080825280601f01601f1916602001820160405280156122c45781602001600182028036833780820191505090505b5090505b60008514612351576001826122dd91906143b3565b9150600a856122ec9190614416565b60306122f8919061437f565b60f81b81838151811061230e5761230d613d1b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561234a9190614447565b94506122c8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166123e983611ebe565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b612414848484846127a4565b6001811115612458576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244f906149d9565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361249f5761249a816128ca565b6124de565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16146124dd576124dc8582612913565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125205761251b81612a80565b61255f565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161461255e5761255d8482612b51565b5b5b5050505050565b50505050565b60008082905060005b84518110156125b7576125a28286838151811061259557612594613d1b565b5b6020026020010151612bd0565b915080806125af906140f5565b915050612575565b508091505092915050565b6125cc8383612bfb565b6125d9600084848461261d565b612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260f90614947565b60405180910390fd5b505050565b600061263e8473ffffffffffffffffffffffffffffffffffffffff16612e18565b15612797578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126676119da565b8786866040518563ffffffff1660e01b81526004016126899493929190614a4e565b6020604051808303816000875af19250505080156126c557506040513d601f19601f820116820180604052508101906126c29190614aaf565b60015b612747573d80600081146126f5576040519150601f19603f3d011682016040523d82523d6000602084013e6126fa565b606091505b50600081510361273f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273690614947565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061279c565b600190505b949350505050565b60018111156128c457600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146128385780600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461283091906143b3565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128c35780600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128bb919061437f565b925050819055505b5b50505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161292084610dd2565b61292a91906143b3565b9050600060096000848152602001908152602001600020549050818114612a0f576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612a9491906143b3565b90506000600b60008481526020019081526020016000205490506000600a8381548110612ac457612ac3613d1b565b5b9060005260206000200154905080600a8381548110612ae657612ae5613d1b565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612b3557612b34614adc565b5b6001900381819060005260206000200160009055905550505050565b6000612b5c83610dd2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b6000818310612be857612be38284612e3b565b612bf3565b612bf28383612e3b565b5b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c6190614b57565b60405180910390fd5b612c73816123c7565b15612cb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612caa90614bc3565b60405180910390fd5b612cc1600083836001612408565b612cca816123c7565b15612d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0190614bc3565b60405180910390fd5b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612e14600083836001612566565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600082600052816020526040600020905092915050565b50805460008255601f016020900490600052602060002090810190612e779190612e7a565b50565b5b80821115612e93576000816000905550600101612e7b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ee081612eab565b8114612eeb57600080fd5b50565b600081359050612efd81612ed7565b92915050565b600060208284031215612f1957612f18612ea1565b5b6000612f2784828501612eee565b91505092915050565b60008115159050919050565b612f4581612f30565b82525050565b6000602082019050612f606000830184612f3c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fa0578082015181840152602081019050612f85565b60008484015250505050565b6000601f19601f8301169050919050565b6000612fc882612f66565b612fd28185612f71565b9350612fe2818560208601612f82565b612feb81612fac565b840191505092915050565b600060208201905081810360008301526130108184612fbd565b905092915050565b6000819050919050565b61302b81613018565b811461303657600080fd5b50565b60008135905061304881613022565b92915050565b60006020828403121561306457613063612ea1565b5b600061307284828501613039565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006130a68261307b565b9050919050565b6130b68161309b565b82525050565b60006020820190506130d160008301846130ad565b92915050565b6130e08161309b565b81146130eb57600080fd5b50565b6000813590506130fd816130d7565b92915050565b6000806040838503121561311a57613119612ea1565b5b6000613128858286016130ee565b925050602061313985828601613039565b9150509250929050565b61314c81613018565b82525050565b60006020820190506131676000830184613143565b92915050565b60008060006060848603121561318657613185612ea1565b5b6000613194868287016130ee565b93505060206131a5868287016130ee565b92505060406131b686828701613039565b9150509250925092565b6000819050919050565b6131d3816131c0565b82525050565b60006020820190506131ee60008301846131ca565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112613219576132186131f4565b5b8235905067ffffffffffffffff811115613236576132356131f9565b5b602083019150836020820283011115613252576132516131fe565b5b9250929050565b600080602083850312156132705761326f612ea1565b5b600083013567ffffffffffffffff81111561328e5761328d612ea6565b5b61329a85828601613203565b92509250509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6132e382612fac565b810181811067ffffffffffffffff82111715613302576133016132ab565b5b80604052505050565b6000613315612e97565b905061332182826132da565b919050565b600067ffffffffffffffff821115613341576133406132ab565b5b61334a82612fac565b9050602081019050919050565b82818337600083830152505050565b600061337961337484613326565b61330b565b905082815260208101848484011115613395576133946132a6565b5b6133a0848285613357565b509392505050565b600082601f8301126133bd576133bc6131f4565b5b81356133cd848260208601613366565b91505092915050565b6000602082840312156133ec576133eb612ea1565b5b600082013567ffffffffffffffff81111561340a57613409612ea6565b5b613416848285016133a8565b91505092915050565b600060ff82169050919050565b6134358161341f565b82525050565b6000602082019050613450600083018461342c565b92915050565b60006020828403121561346c5761346b612ea1565b5b600061347a848285016130ee565b91505092915050565b61348c816131c0565b811461349757600080fd5b50565b6000813590506134a981613483565b92915050565b6000602082840312156134c5576134c4612ea1565b5b60006134d38482850161349a565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61351181613018565b82525050565b60006135238383613508565b60208301905092915050565b6000602082019050919050565b6000613547826134dc565b61355181856134e7565b935061355c836134f8565b8060005b8381101561358d5781516135748882613517565b975061357f8361352f565b925050600181019050613560565b5085935050505092915050565b600060208201905081810360008301526135b4818461353c565b905092915050565b6135c581612f30565b81146135d057600080fd5b50565b6000813590506135e2816135bc565b92915050565b600080604083850312156135ff576135fe612ea1565b5b600061360d858286016130ee565b925050602061361e858286016135d3565b9150509250929050565b600067ffffffffffffffff821115613643576136426132ab565b5b61364c82612fac565b9050602081019050919050565b600061366c61366784613628565b61330b565b905082815260208101848484011115613688576136876132a6565b5b613693848285613357565b509392505050565b600082601f8301126136b0576136af6131f4565b5b81356136c0848260208601613659565b91505092915050565b600080600080608085870312156136e3576136e2612ea1565b5b60006136f1878288016130ee565b9450506020613702878288016130ee565b935050604061371387828801613039565b925050606085013567ffffffffffffffff81111561373457613733612ea6565b5b6137408782880161369b565b91505092959194509250565b6137558161341f565b811461376057600080fd5b50565b6000813590506137728161374c565b92915050565b60006020828403121561378e5761378d612ea1565b5b600061379c84828501613763565b91505092915050565b6000602082840312156137bb576137ba612ea1565b5b60006137c9848285016135d3565b91505092915050565b600067ffffffffffffffff8211156137ed576137ec6132ab565b5b602082029050602081019050919050565b600061381161380c846137d2565b61330b565b90508083825260208201905060208402830185811115613834576138336131fe565b5b835b8181101561385d57806138498882613763565b845260208401935050602081019050613836565b5050509392505050565b600082601f83011261387c5761387b6131f4565b5b813561388c8482602086016137fe565b91505092915050565b6000602082840312156138ab576138aa612ea1565b5b600082013567ffffffffffffffff8111156138c9576138c8612ea6565b5b6138d584828501613867565b91505092915050565b600080604083850312156138f5576138f4612ea1565b5b6000613903858286016130ee565b9250506020613914858286016130ee565b9150509250929050565b60008060006040848603121561393757613936612ea1565b5b600084013567ffffffffffffffff81111561395557613954612ea6565b5b61396186828701613203565b93509350506020613974868287016130ee565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139c557607f821691505b6020821081036139d8576139d761397e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3a602183612f71565b9150613a45826139de565b604082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613acc603d83612f71565b9150613ad782613a70565b604082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b5e602d83612f71565b9150613b6982613b02565b604082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613bf0602b83612f71565b9150613bfb82613b94565b604082019050919050565b60006020820190508181036000830152613c1f81613be3565b9050919050565b60008160601b9050919050565b6000613c3e82613c26565b9050919050565b6000613c5082613c33565b9050919050565b613c68613c638261309b565b613c45565b82525050565b6000613c7a8284613c57565b60148201915081905092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613ce5602c83612f71565b9150613cf082613c89565b604082019050919050565b60006020820190508181036000830152613d1481613cd8565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613dac7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613d6f565b613db68683613d6f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613df3613dee613de984613018565b613dce565b613018565b9050919050565b6000819050919050565b613e0d83613dd8565b613e21613e1982613dfa565b848454613d7c565b825550505050565b600090565b613e36613e29565b613e41818484613e04565b505050565b5b81811015613e6557613e5a600082613e2e565b600181019050613e47565b5050565b601f821115613eaa57613e7b81613d4a565b613e8484613d5f565b81016020851015613e93578190505b613ea7613e9f85613d5f565b830182613e46565b50505b505050565b600082821c905092915050565b6000613ecd60001984600802613eaf565b1980831691505092915050565b6000613ee68383613ebc565b9150826002028217905092915050565b613eff82612f66565b67ffffffffffffffff811115613f1857613f176132ab565b5b613f2282546139ad565b613f2d828285613e69565b600060209050601f831160018114613f605760008415613f4e578287015190505b613f588582613eda565b865550613fc0565b601f198416613f6e86613d4a565b60005b82811015613f9657848901518255600182019150602085019450602081019050613f71565b86831015613fb35784890151613faf601f891682613ebc565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ffe601883612f71565b915061400982613fc8565b602082019050919050565b6000602082019050818103600083015261402d81613ff1565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b6000614090602983612f71565b915061409b82614034565b604082019050919050565b600060208201905081810360008301526140bf81614083565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061410082613018565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614132576141316140c6565b5b600182019050919050565b7f4d42533a206e6f20636f6e7472616374206d696e740000000000000000000000600082015250565b6000614173601583612f71565b915061417e8261413d565b602082019050919050565b600060208201905081810360008301526141a281614166565b9050919050565b7f4d42533a2063757272656e746c79207061757365640000000000000000000000600082015250565b60006141df601583612f71565b91506141ea826141a9565b602082019050919050565b6000602082019050818103600083015261420e816141d2565b9050919050565b7f4d42533a2046726565206d696e74206973206e6f74207374617274656420796560008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000614271602183612f71565b915061427c82614215565b604082019050919050565b600060208201905081810360008301526142a081614264565b9050919050565b7f4d42533a2046726565206d696e7420697320656e646564000000000000000000600082015250565b60006142dd601783612f71565b91506142e8826142a7565b602082019050919050565b6000602082019050818103600083015261430c816142d0565b9050919050565b7f4d42533a20596f7520617265206e6f7420616c6c6f7720746f206d696e740000600082015250565b6000614349601e83612f71565b915061435482614313565b602082019050919050565b600060208201905081810360008301526143788161433c565b9050919050565b600061438a82613018565b915061439583613018565b92508282019050808211156143ad576143ac6140c6565b5b92915050565b60006143be82613018565b91506143c983613018565b92508282039050818111156143e1576143e06140c6565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061442182613018565b915061442c83613018565b92508261443c5761443b6143e7565b5b828206905092915050565b600061445282613018565b915061445d83613018565b92508261446d5761446c6143e7565b5b828204905092915050565b600081905092915050565b60008154614490816139ad565b61449a8186614478565b945060018216600081146144b557600181146144ca576144fd565b60ff19831686528115158202860193506144fd565b6144d385613d4a565b60005b838110156144f5578154818901526001820191506020810190506144d6565b838801955050505b50505092915050565b600061451182612f66565b61451b8185614478565b935061452b818560208601612f82565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061456d600583614478565b915061457882614537565b600582019050919050565b600061458f8285614483565b915061459b8284614506565b91506145a682614560565b91508190509392505050565b60006145bd8261341f565b915060ff82036145d0576145cf6140c6565b5b600182019050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614637602683612f71565b9150614642826145db565b604082019050919050565b600060208201905081810360008301526146668161462a565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006146c9602583612f71565b91506146d48261466d565b604082019050919050565b600060208201905081810360008301526146f8816146bc565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061475b602483612f71565b9150614766826146ff565b604082019050919050565b6000602082019050818103600083015261478a8161474e565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006147c7602083612f71565b91506147d282614791565b602082019050919050565b600060208201905081810360008301526147f6816147ba565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614833601f83612f71565b915061483e826147fd565b602082019050919050565b6000602082019050818103600083015261486281614826565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061489f601983612f71565b91506148aa82614869565b602082019050919050565b600060208201905081810360008301526148ce81614892565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614931603283612f71565b915061493c826148d5565b604082019050919050565b6000602082019050818103600083015261496081614924565b9050919050565b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b60006149c3603583612f71565b91506149ce82614967565b604082019050919050565b600060208201905081810360008301526149f2816149b6565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614a20826149f9565b614a2a8185614a04565b9350614a3a818560208601612f82565b614a4381612fac565b840191505092915050565b6000608082019050614a6360008301876130ad565b614a7060208301866130ad565b614a7d6040830185613143565b8181036060830152614a8f8184614a15565b905095945050505050565b600081519050614aa981612ed7565b92915050565b600060208284031215614ac557614ac4612ea1565b5b6000614ad384828501614a9a565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614b41602083612f71565b9150614b4c82614b0b565b602082019050919050565b60006020820190508181036000830152614b7081614b34565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614bad601c83612f71565b9150614bb882614b77565b602082019050919050565b60006020820190508181036000830152614bdc81614ba0565b905091905056fea2646970667358221220da91afee45bc6fbd6e40fe7ae7ed5ca0cbf44d0ffafd7ec8fc5349e084a474ba64736f6c63430008110033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000b4d4253616c766174696f6e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000746414e5349464d00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005168747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d654866474c58754b37477962676e53474b456b364b594a73464a72613142446d42586d5a4e373563457246672f000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): MBSalvation
Arg [1] : _symbol (string): FANSIFM
Arg [2] : _uri (string): https://gateway.pinata.cloud/ipfs/QmeHfGLXuK7GybgnSGKEk6KYJsFJra1BDmBXmZN75cErFg/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 000000000000000000000000000000000000000000000000000000000000000b
Arg [4] : 4d4253616c766174696f6e000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [6] : 46414e5349464d00000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000051
Arg [8] : 68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066
Arg [9] : 732f516d654866474c58754b37477962676e53474b456b364b594a73464a7261
Arg [10] : 3142446d42586d5a4e373563457246672f000000000000000000000000000000


Deployed Bytecode Sourcemap

207:4742:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1033:224:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2484:100:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3996:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3514:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1673:113:4;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4696:301:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;387:94:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1341:256:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;538:35:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2370:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3888:106;;;:::i;:::-;;3438:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5068:151:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1863:233:4;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3634:105:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;580:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2194:223:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;625:25:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1925:207:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:103:12;;;:::i;:::-;;494:37:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3083:119;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4002:534;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1030:829;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1236:87:12;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2653:104:3;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4239:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;348:28:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5290:279:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;712:49:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3747:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4544:402;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3538:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;657:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;315:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1867:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3210:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4465:164:3;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2142:201:12;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2723:352:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1033:224:4;1135:4;1174:35;1159:50;;;:11;:50;;;;:90;;;;1213:36;1237:11;1213:23;:36::i;:::-;1159:90;1152:97;;1033:224;;;:::o;2484:100:3:-;2538:13;2571:5;2564:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2484:100;:::o;3996:171::-;4072:7;4092:23;4107:7;4092:14;:23::i;:::-;4135:15;:24;4151:7;4135:24;;;;;;;;;;;;;;;;;;;;;4128:31;;3996:171;;;:::o;3514:416::-;3595:13;3611:23;3626:7;3611:14;:23::i;:::-;3595:39;;3659:5;3653:11;;:2;:11;;;3645:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3753:5;3737:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3762:37;3779:5;3786:12;:10;:12::i;:::-;3762:16;:37::i;:::-;3737:62;3715:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;3901:21;3910:2;3914:7;3901:8;:21::i;:::-;3584:346;3514:416;;:::o;1673:113:4:-;1734:7;1761:10;:17;;;;1754:24;;1673:113;:::o;4696:301:3:-;4857:41;4876:12;:10;:12::i;:::-;4890:7;4857:18;:41::i;:::-;4849:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;4961:28;4971:4;4977:2;4981:7;4961:9;:28::i;:::-;4696:301;;;:::o;387:94:10:-;;;;:::o;1341:256:4:-;1438:7;1474:23;1491:5;1474:16;:23::i;:::-;1466:5;:31;1458:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1563:12;:19;1576:5;1563:19;;;;;;;;;;;;;;;:26;1583:5;1563:26;;;;;;;;;;;;1556:33;;1341:256;;;;:::o;538:35:10:-;;;;:::o;2370:345::-;2447:4;2493:1;2467:23;2477:12;:10;:12::i;:::-;2467:9;:23::i;:::-;:27;2464:236;;;2517:4;2510:11;;;;2464:236;2552:12;2594;:10;:12::i;:::-;2577:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;2567:41;;;;;;2552:56;;2638:50;2657:12;;2638:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2671:10;;2683:4;2638:18;:50::i;:::-;2631:57;;;2370:345;;;;;:::o;3888:106::-;1122:13:12;:11;:13::i;:::-;3946:7:10::1;:5;:7::i;:::-;3938:25;;:48;3964:21;3938:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3888:106::o:0;3438:92::-;1122:13:12;:11;:13::i;:::-;3517:5:10::1;3505:9;:17;;;;3438:92:::0;:::o;5068:151:3:-;5172:39;5189:4;5195:2;5199:7;5172:39;;;;;;;;;;;;:16;:39::i;:::-;5068:151;;;:::o;1863:233:4:-;1938:7;1974:30;:28;:30::i;:::-;1966:5;:38;1958:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2071:10;2082:5;2071:17;;;;;;;;:::i;:::-;;;;;;;;;;2064:24;;1863:233;;;:::o;3634:105:10:-;1122:13:12;:11;:13::i;:::-;3723:8:10::1;3708:12;:23;;;;;;:::i;:::-;;3634:105:::0;:::o;580:36::-;;;;:::o;2194:223:3:-;2266:7;2286:13;2302:17;2311:7;2302:8;:17::i;:::-;2286:33;;2355:1;2338:19;;:5;:19;;;2330:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2404:5;2397:12;;;2194:223;;;:::o;625:25:10:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1925:207:3:-;1997:7;2042:1;2025:19;;:5;:19;;;2017:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2108:9;:16;2118:5;2108:16;;;;;;;;;;;;;;;;2101:23;;1925:207;;;:::o;1884:103:12:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;:::-;1884:103::o:0;494:37:10:-;;;;:::o;3083:119::-;1122:13:12;:11;:13::i;:::-;3179:15:10::1;3166:10;:28;;;;3083:119:::0;:::o;4002:534::-;4091:16;4125:18;4146:17;4156:6;4146:9;:17::i;:::-;4125:38;;4192:1;4178:10;:15;4174:355;;4231:1;4217:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4210:23;;;;;4174:355;4266:23;4306:10;4292:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4266:51;;4332:13;4360:130;4384:10;4376:5;:18;4360:130;;;4440:34;4460:6;4468:5;4440:19;:34::i;:::-;4424:6;4431:5;4424:13;;;;;;;;:::i;:::-;;;;;;;:50;;;;;4396:7;;;;;:::i;:::-;;;;4360:130;;;4511:6;4504:13;;;;;4002:534;;;;:::o;1030:829::-;2307:9;2291:25;;:12;:10;:12::i;:::-;:25;;;2283:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;2311:21:13::1;:19;:21::i;:::-;1164:8:10::2;;;;;;;;;;;1163:9;1155:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;1250:9;;1231:15;:28;;1209:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;1373:7;;1355:15;:25;1333:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;1452:27;1466:12;;1452:13;:27::i;:::-;1444:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;1551:18;1588:1;1572:13;:11;:13::i;:::-;:17;;;;:::i;:::-;1551:38;;1602:35;1612:12;:10;:12::i;:::-;1626:10;1602:9;:35::i;:::-;1648:14;1704:2;1697:3;1685:8;;1667:15;:26;;;;:::i;:::-;1666:34;;;;:::i;:::-;1665:41;;;;:::i;:::-;1648:58;;1747:10;1758:6;1747:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1717:15;:27;1733:10;1717:27;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;1776:16;:36;1793:10;1804:6;1793:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;1776:36;;;;;;;;;;;;;;;;:38;;;;;;;;;:::i;:::-;;;;;;1836:15;1825:8;:26;;;;1144:715;;2355:20:13::1;:18;:20::i;:::-;1030:829:10::0;;:::o;1236:87:12:-;1282:7;1309:6;;;;;;;;;;;1302:13;;1236:87;:::o;2653:104:3:-;2709:13;2742:7;2735:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2653:104;:::o;4239:155::-;4334:52;4353:12;:10;:12::i;:::-;4367:8;4377;4334:18;:52::i;:::-;4239:155;;:::o;348:28:10:-;;;;;;;;;;;;;:::o;5290:279:3:-;5421:41;5440:12;:10;:12::i;:::-;5454:7;5421:18;:41::i;:::-;5413:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;5523:38;5537:4;5543:2;5547:7;5556:4;5523:13;:38::i;:::-;5290:279;;;;:::o;712:49:10:-;;;;;;;;;;;;;;;;;:::o;3747:133::-;3809:4;1122:13:12;:11;:13::i;:::-;3837:9:10::1;3826:8;;:20;;;;;;;;;;;;;;;;;;3864:8;;;;;;;;;;;3857:15;;3747:133:::0;;;:::o;4544:402::-;4646:13;4756:12;4819:43;4836:15;:25;4852:8;4836:25;;;;;;;;;;;;;;;;;;;;;4819:43;;:16;:43::i;:::-;4713:206;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4677:261;;4544:402;;;:::o;3538:88::-;1122:13:12;:11;:13::i;:::-;3613:5:10::1;3603:7;:15;;;;3538:88:::0;:::o;657:48::-;;;;;;;;;;;;;;;;;;;;;;:::o;315:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1867:377::-;1122:13:12;:11;:13::i;:::-;1931:18:10::1;1968:1;1952:13;:11;:13::i;:::-;:17;;;;:::i;:::-;1931:38;;1980:28;1990:5;1997:10;1980:9;:28::i;:::-;2021:14;2077:2;2070:3;2058:8;;2040:15;:26;;;;:::i;:::-;2039:34;;;;:::i;:::-;2038:41;;;;:::i;:::-;2021:58;;2120:10;2131:6;2120:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2090:15;:27;2106:10;2090:27;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;2149:16;:36;2166:10;2177:6;2166:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;2149:36;;;;;;;;;;;;;;;;:38;;;;;;;;;:::i;:::-;;;;;;2209:15;2198:8;:26;;;;1920:324;;1867:377:::0;:::o;3210:220::-;1122:13:12;:11;:13::i;:::-;3301:10:10::1;;3294:17;;;;:::i;:::-;3327:7;3322:101;3344:9;:16;3340:1;:20;;;3322:101;;;3382:10;3398:9;3408:1;3398:12;;;;;;;;;;:::i;:::-;;;;;;;;3382:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3362:3;;;;;:::i;:::-;;;;3322:101;;;;3210:220:::0;:::o;4465:164:3:-;4562:4;4586:18;:25;4605:5;4586:25;;;;;;;;;;;;;;;:35;4612:8;4586:35;;;;;;;;;;;;;;;;;;;;;;;;;4579:42;;4465:164;;;;:::o;2142:201:12:-;1122:13;:11;:13::i;:::-;2251:1:::1;2231:22;;:8;:22;;::::0;2223:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2307:28;2326:8;2307:18;:28::i;:::-;2142:201:::0;:::o;2723:352:10:-;2821:4;2860:1;2841:16;2851:5;2841:9;:16::i;:::-;:20;2838:222;;;2884:4;2877:11;;;;2838:222;2919:12;2961:5;2944:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;2934:34;;;;;;2919:49;;2998:50;3017:12;;2998:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3031:10;;3043:4;2998:18;:50::i;:::-;2991:57;;;2723:352;;;;;;:::o;1556:305:3:-;1658:4;1710:25;1695:40;;;:11;:40;;;;:105;;;;1767:33;1752:48;;;:11;:48;;;;1695:105;:158;;;;1817:36;1841:11;1817:23;:36::i;:::-;1695:158;1675:178;;1556:305;;;:::o;13559:135::-;13641:16;13649:7;13641;:16::i;:::-;13633:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;13559:135;:::o;656:98:1:-;709:7;736:10;729:17;;656:98;:::o;12872:174:3:-;12974:2;12947:15;:24;12963:7;12947:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;13030:7;13026:2;12992:46;;13001:23;13016:7;13001:14;:23::i;:::-;12992:46;;;;;;;;;;;;12872:174;;:::o;7559:264::-;7652:4;7669:13;7685:23;7700:7;7685:14;:23::i;:::-;7669:39;;7738:5;7727:16;;:7;:16;;;:52;;;;7747:32;7764:5;7771:7;7747:16;:32::i;:::-;7727:52;:87;;;;7807:7;7783:31;;:20;7795:7;7783:11;:20::i;:::-;:31;;;7727:87;7719:96;;;7559:264;;;;:::o;11524:1229::-;11649:4;11622:31;;:23;11637:7;11622:14;:23::i;:::-;:31;;;11614:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;11728:1;11714:16;;:2;:16;;;11706:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;11784:42;11805:4;11811:2;11815:7;11824:1;11784:20;:42::i;:::-;11956:4;11929:31;;:23;11944:7;11929:14;:23::i;:::-;:31;;;11921:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;12074:15;:24;12090:7;12074:24;;;;;;;;;;;;12067:31;;;;;;;;;;;12569:1;12550:9;:15;12560:4;12550:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;12602:1;12585:9;:13;12595:2;12585:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;12644:2;12625:7;:16;12633:7;12625:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;12683:7;12679:2;12664:27;;12673:4;12664:27;;;;;;;;;;;;12704:41;12724:4;12730:2;12734:7;12743:1;12704:19;:41::i;:::-;11524:1229;;;:::o;1182:156:11:-;1273:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;1290:40;;1182:156;;;;;:::o;1401:132:12:-;1476:12;:10;:12::i;:::-;1465:23;;:7;:5;:7::i;:::-;:23;;;1457:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1401:132::o;6834:117:3:-;6900:7;6927;:16;6935:7;6927:16;;;;;;;;;;;;;;;;;;;;;6920:23;;6834:117;;;:::o;2503:191:12:-;2577:16;2596:6;;;;;;;;;;;2577:25;;2622:8;2613:6;;:17;;;;;;;;;;;;;;;;;;2677:8;2646:40;;2667:8;2646:40;;;;;;;;;;;;2566:128;2503:191;:::o;2391:293:13:-;1793:1;2525:7;;:19;2517:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1793:1;2658:7;:18;;;;2391:293::o;8165:110:3:-;8241:26;8251:2;8255:7;8241:26;;;;;;;;;;;;:9;:26::i;:::-;8165:110;;:::o;2692:213:13:-;1749:1;2875:7;:22;;;;2692:213::o;13189:281:3:-;13310:8;13301:17;;:5;:17;;;13293:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;13397:8;13359:18;:25;13378:5;13359:25;;;;;;;;;;;;;;;:35;13385:8;13359:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;13443:8;13421:41;;13436:5;13421:41;;;13453:8;13421:41;;;;;;:::i;:::-;;;;;;;;13189:281;;;:::o;6450:270::-;6563:28;6573:4;6579:2;6583:7;6563:9;:28::i;:::-;6610:47;6633:4;6639:2;6643:7;6652:4;6610:22;:47::i;:::-;6602:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;6450:270;;;;:::o;342:723:14:-;398:13;628:1;619:5;:10;615:53;;646:10;;;;;;;;;;;;;;;;;;;;;615:53;678:12;693:5;678:20;;709:14;734:78;749:1;741:4;:9;734:78;;767:8;;;;;:::i;:::-;;;;798:2;790:10;;;;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;822:39;;872:154;888:1;879:5;:10;872:154;;916:1;906:11;;;;;:::i;:::-;;;983:2;975:5;:10;;;;:::i;:::-;962:2;:24;;;;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1012:2;1003:11;;;;;:::i;:::-;;;872:154;;;1050:6;1036:21;;;;;342:723;;;;:::o;854:157:2:-;939:4;978:25;963:40;;;:11;:40;;;;956:47;;854:157;;;:::o;7264:128:3:-;7329:4;7382:1;7353:31;;:17;7362:7;7353:8;:17::i;:::-;:31;;;;7346:38;;7264:128;;;:::o;2170:915:4:-;2347:61;2374:4;2380:2;2384:12;2398:9;2347:26;:61::i;:::-;2437:1;2425:9;:13;2421:222;;;2568:63;;;;;;;;;;:::i;:::-;;;;;;;;2421:222;2655:15;2673:12;2655:30;;2718:1;2702:18;;:4;:18;;;2698:187;;2737:40;2769:7;2737:31;:40::i;:::-;2698:187;;;2807:2;2799:10;;:4;:10;;;2795:90;;2826:47;2859:4;2865:7;2826:32;:47::i;:::-;2795:90;2698:187;2913:1;2899:16;;:2;:16;;;2895:183;;2932:45;2969:7;2932:36;:45::i;:::-;2895:183;;;3005:4;2999:10;;:2;:10;;;2995:83;;3026:40;3054:2;3058:7;3026:27;:40::i;:::-;2995:83;2895:183;2336:749;2170:915;;;;:::o;16975:115:3:-;;;;;:::o;1981:296:11:-;2064:7;2084:20;2107:4;2084:27;;2127:9;2122:118;2146:5;:12;2142:1;:16;2122:118;;;2195:33;2205:12;2219:5;2225:1;2219:8;;;;;;;;:::i;:::-;;;;;;;;2195:9;:33::i;:::-;2180:48;;2160:3;;;;;:::i;:::-;;;;2122:118;;;;2257:12;2250:19;;;1981:296;;;;:::o;8502:285:3:-;8597:18;8603:2;8607:7;8597:5;:18::i;:::-;8648:53;8679:1;8683:2;8687:7;8696:4;8648:22;:53::i;:::-;8626:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;8502:285;;;:::o;14258:853::-;14412:4;14433:15;:2;:13;;;:15::i;:::-;14429:675;;;14485:2;14469:36;;;14506:12;:10;:12::i;:::-;14520:4;14526:7;14535:4;14469:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14465:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14727:1;14710:6;:13;:18;14706:328;;14753:60;;;;;;;;;;:::i;:::-;;;;;;;;14706:328;14984:6;14978:13;14969:6;14965:2;14961:15;14954:38;14465:584;14601:41;;;14591:51;;;:6;:51;;;;14584:58;;;;;14429:675;15088:4;15081:11;;14258:853;;;;;;;:::o;15843:410::-;16033:1;16021:9;:13;16017:229;;;16071:1;16055:18;;:4;:18;;;16051:87;;16113:9;16094;:15;16104:4;16094:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;16051:87;16170:1;16156:16;;:2;:16;;;16152:83;;16210:9;16193;:13;16203:2;16193:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;16152:83;16017:229;15843:410;;;;:::o;3808:164:4:-;3912:10;:17;;;;3885:15;:24;3901:7;3885:24;;;;;;;;;;;:44;;;;3940:10;3956:7;3940:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3808:164;:::o;4599:988::-;4865:22;4915:1;4890:22;4907:4;4890:16;:22::i;:::-;:26;;;;:::i;:::-;4865:51;;4927:18;4948:17;:26;4966:7;4948:26;;;;;;;;;;;;4927:47;;5095:14;5081:10;:28;5077:328;;5126:19;5148:12;:18;5161:4;5148:18;;;;;;;;;;;;;;;:34;5167:14;5148:34;;;;;;;;;;;;5126:56;;5232:11;5199:12;:18;5212:4;5199:18;;;;;;;;;;;;;;;:30;5218:10;5199:30;;;;;;;;;;;:44;;;;5349:10;5316:17;:30;5334:11;5316:30;;;;;;;;;;;:43;;;;5111:294;5077:328;5501:17;:26;5519:7;5501:26;;;;;;;;;;;5494:33;;;5545:12;:18;5558:4;5545:18;;;;;;;;;;;;;;;:34;5564:14;5545:34;;;;;;;;;;;5538:41;;;4680:907;;4599:988;;:::o;5882:1079::-;6135:22;6180:1;6160:10;:17;;;;:21;;;;:::i;:::-;6135:46;;6192:18;6213:15;:24;6229:7;6213:24;;;;;;;;;;;;6192:45;;6564:19;6586:10;6597:14;6586:26;;;;;;;;:::i;:::-;;;;;;;;;;6564:48;;6650:11;6625:10;6636;6625:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6761:10;6730:15;:28;6746:11;6730:28;;;;;;;;;;;:41;;;;6902:15;:24;6918:7;6902:24;;;;;;;;;;;6895:31;;;6937:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5953:1008;;;5882:1079;:::o;3386:221::-;3471:14;3488:20;3505:2;3488:16;:20::i;:::-;3471:37;;3546:7;3519:12;:16;3532:2;3519:16;;;;;;;;;;;;;;;:24;3536:6;3519:24;;;;;;;;;;;:34;;;;3593:6;3564:17;:26;3582:7;3564:26;;;;;;;;;;;:35;;;;3460:147;3386:221;;:::o;9185:149:11:-;9248:7;9279:1;9275;:5;:51;;9306:20;9321:1;9324;9306:14;:20::i;:::-;9275:51;;;9283:20;9298:1;9301;9283:14;:20::i;:::-;9275:51;9268:58;;9185:149;;;;:::o;9123:942:3:-;9217:1;9203:16;;:2;:16;;;9195:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9276:16;9284:7;9276;:16::i;:::-;9275:17;9267:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9338:48;9367:1;9371:2;9375:7;9384:1;9338:20;:48::i;:::-;9485:16;9493:7;9485;:16::i;:::-;9484:17;9476:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9900:1;9883:9;:13;9893:2;9883:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;9944:2;9925:7;:16;9933:7;9925:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9989:7;9985:2;9964:33;;9981:1;9964:33;;;;;;;;;;;;10010:47;10038:1;10042:2;10046:7;10055:1;10010:19;:47::i;:::-;9123:942;;:::o;1451:326:0:-;1511:4;1768:1;1746:7;:19;;;:23;1739:30;;1451:326;;;:::o;9342:268:11:-;9410:13;9517:1;9511:4;9504:15;9546:1;9540:4;9533:15;9587:4;9581;9571:21;9562:30;;9342:268;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:15:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:118::-;6037:24;6055:5;6037:24;:::i;:::-;6032:3;6025:37;5950:118;;:::o;6074:222::-;6167:4;6205:2;6194:9;6190:18;6182:26;;6218:71;6286:1;6275:9;6271:17;6262:6;6218:71;:::i;:::-;6074:222;;;;:::o;6302:117::-;6411:1;6408;6401:12;6425:117;6534:1;6531;6524:12;6548:117;6657:1;6654;6647:12;6688:568;6761:8;6771:6;6821:3;6814:4;6806:6;6802:17;6798:27;6788:122;;6829:79;;:::i;:::-;6788:122;6942:6;6929:20;6919:30;;6972:18;6964:6;6961:30;6958:117;;;6994:79;;:::i;:::-;6958:117;7108:4;7100:6;7096:17;7084:29;;7162:3;7154:4;7146:6;7142:17;7132:8;7128:32;7125:41;7122:128;;;7169:79;;:::i;:::-;7122:128;6688:568;;;;;:::o;7262:559::-;7348:6;7356;7405:2;7393:9;7384:7;7380:23;7376:32;7373:119;;;7411:79;;:::i;:::-;7373:119;7559:1;7548:9;7544:17;7531:31;7589:18;7581:6;7578:30;7575:117;;;7611:79;;:::i;:::-;7575:117;7724:80;7796:7;7787:6;7776:9;7772:22;7724:80;:::i;:::-;7706:98;;;;7502:312;7262:559;;;;;:::o;7827:117::-;7936:1;7933;7926:12;7950:180;7998:77;7995:1;7988:88;8095:4;8092:1;8085:15;8119:4;8116:1;8109:15;8136:281;8219:27;8241:4;8219:27;:::i;:::-;8211:6;8207:40;8349:6;8337:10;8334:22;8313:18;8301:10;8298:34;8295:62;8292:88;;;8360:18;;:::i;:::-;8292:88;8400:10;8396:2;8389:22;8179:238;8136:281;;:::o;8423:129::-;8457:6;8484:20;;:::i;:::-;8474:30;;8513:33;8541:4;8533:6;8513:33;:::i;:::-;8423:129;;;:::o;8558:308::-;8620:4;8710:18;8702:6;8699:30;8696:56;;;8732:18;;:::i;:::-;8696:56;8770:29;8792:6;8770:29;:::i;:::-;8762:37;;8854:4;8848;8844:15;8836:23;;8558:308;;;:::o;8872:146::-;8969:6;8964:3;8959;8946:30;9010:1;9001:6;8996:3;8992:16;8985:27;8872:146;;;:::o;9024:425::-;9102:5;9127:66;9143:49;9185:6;9143:49;:::i;:::-;9127:66;:::i;:::-;9118:75;;9216:6;9209:5;9202:21;9254:4;9247:5;9243:16;9292:3;9283:6;9278:3;9274:16;9271:25;9268:112;;;9299:79;;:::i;:::-;9268:112;9389:54;9436:6;9431:3;9426;9389:54;:::i;:::-;9108:341;9024:425;;;;;:::o;9469:340::-;9525:5;9574:3;9567:4;9559:6;9555:17;9551:27;9541:122;;9582:79;;:::i;:::-;9541:122;9699:6;9686:20;9724:79;9799:3;9791:6;9784:4;9776:6;9772:17;9724:79;:::i;:::-;9715:88;;9531:278;9469:340;;;;:::o;9815:509::-;9884:6;9933:2;9921:9;9912:7;9908:23;9904:32;9901:119;;;9939:79;;:::i;:::-;9901:119;10087:1;10076:9;10072:17;10059:31;10117:18;10109:6;10106:30;10103:117;;;10139:79;;:::i;:::-;10103:117;10244:63;10299:7;10290:6;10279:9;10275:22;10244:63;:::i;:::-;10234:73;;10030:287;9815:509;;;;:::o;10330:86::-;10365:7;10405:4;10398:5;10394:16;10383:27;;10330:86;;;:::o;10422:112::-;10505:22;10521:5;10505:22;:::i;:::-;10500:3;10493:35;10422:112;;:::o;10540:214::-;10629:4;10667:2;10656:9;10652:18;10644:26;;10680:67;10744:1;10733:9;10729:17;10720:6;10680:67;:::i;:::-;10540:214;;;;:::o;10760:329::-;10819:6;10868:2;10856:9;10847:7;10843:23;10839:32;10836:119;;;10874:79;;:::i;:::-;10836:119;10994:1;11019:53;11064:7;11055:6;11044:9;11040:22;11019:53;:::i;:::-;11009:63;;10965:117;10760:329;;;;:::o;11095:122::-;11168:24;11186:5;11168:24;:::i;:::-;11161:5;11158:35;11148:63;;11207:1;11204;11197:12;11148:63;11095:122;:::o;11223:139::-;11269:5;11307:6;11294:20;11285:29;;11323:33;11350:5;11323:33;:::i;:::-;11223:139;;;;:::o;11368:329::-;11427:6;11476:2;11464:9;11455:7;11451:23;11447:32;11444:119;;;11482:79;;:::i;:::-;11444:119;11602:1;11627:53;11672:7;11663:6;11652:9;11648:22;11627:53;:::i;:::-;11617:63;;11573:117;11368:329;;;;:::o;11703:114::-;11770:6;11804:5;11798:12;11788:22;;11703:114;;;:::o;11823:184::-;11922:11;11956:6;11951:3;11944:19;11996:4;11991:3;11987:14;11972:29;;11823:184;;;;:::o;12013:132::-;12080:4;12103:3;12095:11;;12133:4;12128:3;12124:14;12116:22;;12013:132;;;:::o;12151:108::-;12228:24;12246:5;12228:24;:::i;:::-;12223:3;12216:37;12151:108;;:::o;12265:179::-;12334:10;12355:46;12397:3;12389:6;12355:46;:::i;:::-;12433:4;12428:3;12424:14;12410:28;;12265:179;;;;:::o;12450:113::-;12520:4;12552;12547:3;12543:14;12535:22;;12450:113;;;:::o;12599:732::-;12718:3;12747:54;12795:5;12747:54;:::i;:::-;12817:86;12896:6;12891:3;12817:86;:::i;:::-;12810:93;;12927:56;12977:5;12927:56;:::i;:::-;13006:7;13037:1;13022:284;13047:6;13044:1;13041:13;13022:284;;;13123:6;13117:13;13150:63;13209:3;13194:13;13150:63;:::i;:::-;13143:70;;13236:60;13289:6;13236:60;:::i;:::-;13226:70;;13082:224;13069:1;13066;13062:9;13057:14;;13022:284;;;13026:14;13322:3;13315:10;;12723:608;;;12599:732;;;;:::o;13337:373::-;13480:4;13518:2;13507:9;13503:18;13495:26;;13567:9;13561:4;13557:20;13553:1;13542:9;13538:17;13531:47;13595:108;13698:4;13689:6;13595:108;:::i;:::-;13587:116;;13337:373;;;;:::o;13716:116::-;13786:21;13801:5;13786:21;:::i;:::-;13779:5;13776:32;13766:60;;13822:1;13819;13812:12;13766:60;13716:116;:::o;13838:133::-;13881:5;13919:6;13906:20;13897:29;;13935:30;13959:5;13935:30;:::i;:::-;13838:133;;;;:::o;13977:468::-;14042:6;14050;14099:2;14087:9;14078:7;14074:23;14070:32;14067:119;;;14105:79;;:::i;:::-;14067:119;14225:1;14250:53;14295:7;14286:6;14275:9;14271:22;14250:53;:::i;:::-;14240:63;;14196:117;14352:2;14378:50;14420:7;14411:6;14400:9;14396:22;14378:50;:::i;:::-;14368:60;;14323:115;13977:468;;;;;:::o;14451:307::-;14512:4;14602:18;14594:6;14591:30;14588:56;;;14624:18;;:::i;:::-;14588:56;14662:29;14684:6;14662:29;:::i;:::-;14654:37;;14746:4;14740;14736:15;14728:23;;14451:307;;;:::o;14764:423::-;14841:5;14866:65;14882:48;14923:6;14882:48;:::i;:::-;14866:65;:::i;:::-;14857:74;;14954:6;14947:5;14940:21;14992:4;14985:5;14981:16;15030:3;15021:6;15016:3;15012:16;15009:25;15006:112;;;15037:79;;:::i;:::-;15006:112;15127:54;15174:6;15169:3;15164;15127:54;:::i;:::-;14847:340;14764:423;;;;;:::o;15206:338::-;15261:5;15310:3;15303:4;15295:6;15291:17;15287:27;15277:122;;15318:79;;:::i;:::-;15277:122;15435:6;15422:20;15460:78;15534:3;15526:6;15519:4;15511:6;15507:17;15460:78;:::i;:::-;15451:87;;15267:277;15206:338;;;;:::o;15550:943::-;15645:6;15653;15661;15669;15718:3;15706:9;15697:7;15693:23;15689:33;15686:120;;;15725:79;;:::i;:::-;15686:120;15845:1;15870:53;15915:7;15906:6;15895:9;15891:22;15870:53;:::i;:::-;15860:63;;15816:117;15972:2;15998:53;16043:7;16034:6;16023:9;16019:22;15998:53;:::i;:::-;15988:63;;15943:118;16100:2;16126:53;16171:7;16162:6;16151:9;16147:22;16126:53;:::i;:::-;16116:63;;16071:118;16256:2;16245:9;16241:18;16228:32;16287:18;16279:6;16276:30;16273:117;;;16309:79;;:::i;:::-;16273:117;16414:62;16468:7;16459:6;16448:9;16444:22;16414:62;:::i;:::-;16404:72;;16199:287;15550:943;;;;;;;:::o;16499:118::-;16570:22;16586:5;16570:22;:::i;:::-;16563:5;16560:33;16550:61;;16607:1;16604;16597:12;16550:61;16499:118;:::o;16623:135::-;16667:5;16705:6;16692:20;16683:29;;16721:31;16746:5;16721:31;:::i;:::-;16623:135;;;;:::o;16764:325::-;16821:6;16870:2;16858:9;16849:7;16845:23;16841:32;16838:119;;;16876:79;;:::i;:::-;16838:119;16996:1;17021:51;17064:7;17055:6;17044:9;17040:22;17021:51;:::i;:::-;17011:61;;16967:115;16764:325;;;;:::o;17095:323::-;17151:6;17200:2;17188:9;17179:7;17175:23;17171:32;17168:119;;;17206:79;;:::i;:::-;17168:119;17326:1;17351:50;17393:7;17384:6;17373:9;17369:22;17351:50;:::i;:::-;17341:60;;17297:114;17095:323;;;;:::o;17424:309::-;17499:4;17589:18;17581:6;17578:30;17575:56;;;17611:18;;:::i;:::-;17575:56;17661:4;17653:6;17649:17;17641:25;;17721:4;17715;17711:15;17703:23;;17424:309;;;:::o;17754:704::-;17848:5;17873:79;17889:62;17944:6;17889:62;:::i;:::-;17873:79;:::i;:::-;17864:88;;17972:5;18001:6;17994:5;17987:21;18035:4;18028:5;18024:16;18017:23;;18088:4;18080:6;18076:17;18068:6;18064:30;18117:3;18109:6;18106:15;18103:122;;;18136:79;;:::i;:::-;18103:122;18251:6;18234:218;18268:6;18263:3;18260:15;18234:218;;;18343:3;18372:35;18403:3;18391:10;18372:35;:::i;:::-;18367:3;18360:48;18437:4;18432:3;18428:14;18421:21;;18310:142;18294:4;18289:3;18285:14;18278:21;;18234:218;;;18238:21;17854:604;;17754:704;;;;;:::o;18479:366::-;18548:5;18597:3;18590:4;18582:6;18578:17;18574:27;18564:122;;18605:79;;:::i;:::-;18564:122;18722:6;18709:20;18747:92;18835:3;18827:6;18820:4;18812:6;18808:17;18747:92;:::i;:::-;18738:101;;18554:291;18479:366;;;;:::o;18851:535::-;18933:6;18982:2;18970:9;18961:7;18957:23;18953:32;18950:119;;;18988:79;;:::i;:::-;18950:119;19136:1;19125:9;19121:17;19108:31;19166:18;19158:6;19155:30;19152:117;;;19188:79;;:::i;:::-;19152:117;19293:76;19361:7;19352:6;19341:9;19337:22;19293:76;:::i;:::-;19283:86;;19079:300;18851:535;;;;:::o;19392:474::-;19460:6;19468;19517:2;19505:9;19496:7;19492:23;19488:32;19485:119;;;19523:79;;:::i;:::-;19485:119;19643:1;19668:53;19713:7;19704:6;19693:9;19689:22;19668:53;:::i;:::-;19658:63;;19614:117;19770:2;19796:53;19841:7;19832:6;19821:9;19817:22;19796:53;:::i;:::-;19786:63;;19741:118;19392:474;;;;;:::o;19872:704::-;19967:6;19975;19983;20032:2;20020:9;20011:7;20007:23;20003:32;20000:119;;;20038:79;;:::i;:::-;20000:119;20186:1;20175:9;20171:17;20158:31;20216:18;20208:6;20205:30;20202:117;;;20238:79;;:::i;:::-;20202:117;20351:80;20423:7;20414:6;20403:9;20399:22;20351:80;:::i;:::-;20333:98;;;;20129:312;20480:2;20506:53;20551:7;20542:6;20531:9;20527:22;20506:53;:::i;:::-;20496:63;;20451:118;19872:704;;;;;:::o;20582:180::-;20630:77;20627:1;20620:88;20727:4;20724:1;20717:15;20751:4;20748:1;20741:15;20768:320;20812:6;20849:1;20843:4;20839:12;20829:22;;20896:1;20890:4;20886:12;20917:18;20907:81;;20973:4;20965:6;20961:17;20951:27;;20907:81;21035:2;21027:6;21024:14;21004:18;21001:38;20998:84;;21054:18;;:::i;:::-;20998:84;20819:269;20768:320;;;:::o;21094:220::-;21234:34;21230:1;21222:6;21218:14;21211:58;21303:3;21298:2;21290:6;21286:15;21279:28;21094:220;:::o;21320:366::-;21462:3;21483:67;21547:2;21542:3;21483:67;:::i;:::-;21476:74;;21559:93;21648:3;21559:93;:::i;:::-;21677:2;21672:3;21668:12;21661:19;;21320:366;;;:::o;21692:419::-;21858:4;21896:2;21885:9;21881:18;21873:26;;21945:9;21939:4;21935:20;21931:1;21920:9;21916:17;21909:47;21973:131;22099:4;21973:131;:::i;:::-;21965:139;;21692:419;;;:::o;22117:248::-;22257:34;22253:1;22245:6;22241:14;22234:58;22326:31;22321:2;22313:6;22309:15;22302:56;22117:248;:::o;22371:366::-;22513:3;22534:67;22598:2;22593:3;22534:67;:::i;:::-;22527:74;;22610:93;22699:3;22610:93;:::i;:::-;22728:2;22723:3;22719:12;22712:19;;22371:366;;;:::o;22743:419::-;22909:4;22947:2;22936:9;22932:18;22924:26;;22996:9;22990:4;22986:20;22982:1;22971:9;22967:17;22960:47;23024:131;23150:4;23024:131;:::i;:::-;23016:139;;22743:419;;;:::o;23168:232::-;23308:34;23304:1;23296:6;23292:14;23285:58;23377:15;23372:2;23364:6;23360:15;23353:40;23168:232;:::o;23406:366::-;23548:3;23569:67;23633:2;23628:3;23569:67;:::i;:::-;23562:74;;23645:93;23734:3;23645:93;:::i;:::-;23763:2;23758:3;23754:12;23747:19;;23406:366;;;:::o;23778:419::-;23944:4;23982:2;23971:9;23967:18;23959:26;;24031:9;24025:4;24021:20;24017:1;24006:9;24002:17;23995:47;24059:131;24185:4;24059:131;:::i;:::-;24051:139;;23778:419;;;:::o;24203:230::-;24343:34;24339:1;24331:6;24327:14;24320:58;24412:13;24407:2;24399:6;24395:15;24388:38;24203:230;:::o;24439:366::-;24581:3;24602:67;24666:2;24661:3;24602:67;:::i;:::-;24595:74;;24678:93;24767:3;24678:93;:::i;:::-;24796:2;24791:3;24787:12;24780:19;;24439:366;;;:::o;24811:419::-;24977:4;25015:2;25004:9;25000:18;24992:26;;25064:9;25058:4;25054:20;25050:1;25039:9;25035:17;25028:47;25092:131;25218:4;25092:131;:::i;:::-;25084:139;;24811:419;;;:::o;25236:94::-;25269:8;25317:5;25313:2;25309:14;25288:35;;25236:94;;;:::o;25336:::-;25375:7;25404:20;25418:5;25404:20;:::i;:::-;25393:31;;25336:94;;;:::o;25436:100::-;25475:7;25504:26;25524:5;25504:26;:::i;:::-;25493:37;;25436:100;;;:::o;25542:157::-;25647:45;25667:24;25685:5;25667:24;:::i;:::-;25647:45;:::i;:::-;25642:3;25635:58;25542:157;;:::o;25705:256::-;25817:3;25832:75;25903:3;25894:6;25832:75;:::i;:::-;25932:2;25927:3;25923:12;25916:19;;25952:3;25945:10;;25705:256;;;;:::o;25967:231::-;26107:34;26103:1;26095:6;26091:14;26084:58;26176:14;26171:2;26163:6;26159:15;26152:39;25967:231;:::o;26204:366::-;26346:3;26367:67;26431:2;26426:3;26367:67;:::i;:::-;26360:74;;26443:93;26532:3;26443:93;:::i;:::-;26561:2;26556:3;26552:12;26545:19;;26204:366;;;:::o;26576:419::-;26742:4;26780:2;26769:9;26765:18;26757:26;;26829:9;26823:4;26819:20;26815:1;26804:9;26800:17;26793:47;26857:131;26983:4;26857:131;:::i;:::-;26849:139;;26576:419;;;:::o;27001:180::-;27049:77;27046:1;27039:88;27146:4;27143:1;27136:15;27170:4;27167:1;27160:15;27187:141;27236:4;27259:3;27251:11;;27282:3;27279:1;27272:14;27316:4;27313:1;27303:18;27295:26;;27187:141;;;:::o;27334:93::-;27371:6;27418:2;27413;27406:5;27402:14;27398:23;27388:33;;27334:93;;;:::o;27433:107::-;27477:8;27527:5;27521:4;27517:16;27496:37;;27433:107;;;;:::o;27546:393::-;27615:6;27665:1;27653:10;27649:18;27688:97;27718:66;27707:9;27688:97;:::i;:::-;27806:39;27836:8;27825:9;27806:39;:::i;:::-;27794:51;;27878:4;27874:9;27867:5;27863:21;27854:30;;27927:4;27917:8;27913:19;27906:5;27903:30;27893:40;;27622:317;;27546:393;;;;;:::o;27945:60::-;27973:3;27994:5;27987:12;;27945:60;;;:::o;28011:142::-;28061:9;28094:53;28112:34;28121:24;28139:5;28121:24;:::i;:::-;28112:34;:::i;:::-;28094:53;:::i;:::-;28081:66;;28011:142;;;:::o;28159:75::-;28202:3;28223:5;28216:12;;28159:75;;;:::o;28240:269::-;28350:39;28381:7;28350:39;:::i;:::-;28411:91;28460:41;28484:16;28460:41;:::i;:::-;28452:6;28445:4;28439:11;28411:91;:::i;:::-;28405:4;28398:105;28316:193;28240:269;;;:::o;28515:73::-;28560:3;28515:73;:::o;28594:189::-;28671:32;;:::i;:::-;28712:65;28770:6;28762;28756:4;28712:65;:::i;:::-;28647:136;28594:189;;:::o;28789:186::-;28849:120;28866:3;28859:5;28856:14;28849:120;;;28920:39;28957:1;28950:5;28920:39;:::i;:::-;28893:1;28886:5;28882:13;28873:22;;28849:120;;;28789:186;;:::o;28981:543::-;29082:2;29077:3;29074:11;29071:446;;;29116:38;29148:5;29116:38;:::i;:::-;29200:29;29218:10;29200:29;:::i;:::-;29190:8;29186:44;29383:2;29371:10;29368:18;29365:49;;;29404:8;29389:23;;29365:49;29427:80;29483:22;29501:3;29483:22;:::i;:::-;29473:8;29469:37;29456:11;29427:80;:::i;:::-;29086:431;;29071:446;28981:543;;;:::o;29530:117::-;29584:8;29634:5;29628:4;29624:16;29603:37;;29530:117;;;;:::o;29653:169::-;29697:6;29730:51;29778:1;29774:6;29766:5;29763:1;29759:13;29730:51;:::i;:::-;29726:56;29811:4;29805;29801:15;29791:25;;29704:118;29653:169;;;;:::o;29827:295::-;29903:4;30049:29;30074:3;30068:4;30049:29;:::i;:::-;30041:37;;30111:3;30108:1;30104:11;30098:4;30095:21;30087:29;;29827:295;;;;:::o;30127:1395::-;30244:37;30277:3;30244:37;:::i;:::-;30346:18;30338:6;30335:30;30332:56;;;30368:18;;:::i;:::-;30332:56;30412:38;30444:4;30438:11;30412:38;:::i;:::-;30497:67;30557:6;30549;30543:4;30497:67;:::i;:::-;30591:1;30615:4;30602:17;;30647:2;30639:6;30636:14;30664:1;30659:618;;;;31321:1;31338:6;31335:77;;;31387:9;31382:3;31378:19;31372:26;31363:35;;31335:77;31438:67;31498:6;31491:5;31438:67;:::i;:::-;31432:4;31425:81;31294:222;30629:887;;30659:618;30711:4;30707:9;30699:6;30695:22;30745:37;30777:4;30745:37;:::i;:::-;30804:1;30818:208;30832:7;30829:1;30826:14;30818:208;;;30911:9;30906:3;30902:19;30896:26;30888:6;30881:42;30962:1;30954:6;30950:14;30940:24;;31009:2;30998:9;30994:18;30981:31;;30855:4;30852:1;30848:12;30843:17;;30818:208;;;31054:6;31045:7;31042:19;31039:179;;;31112:9;31107:3;31103:19;31097:26;31155:48;31197:4;31189:6;31185:17;31174:9;31155:48;:::i;:::-;31147:6;31140:64;31062:156;31039:179;31264:1;31260;31252:6;31248:14;31244:22;31238:4;31231:36;30666:611;;;30629:887;;30219:1303;;;30127:1395;;:::o;31528:174::-;31668:26;31664:1;31656:6;31652:14;31645:50;31528:174;:::o;31708:366::-;31850:3;31871:67;31935:2;31930:3;31871:67;:::i;:::-;31864:74;;31947:93;32036:3;31947:93;:::i;:::-;32065:2;32060:3;32056:12;32049:19;;31708:366;;;:::o;32080:419::-;32246:4;32284:2;32273:9;32269:18;32261:26;;32333:9;32327:4;32323:20;32319:1;32308:9;32304:17;32297:47;32361:131;32487:4;32361:131;:::i;:::-;32353:139;;32080:419;;;:::o;32505:228::-;32645:34;32641:1;32633:6;32629:14;32622:58;32714:11;32709:2;32701:6;32697:15;32690:36;32505:228;:::o;32739:366::-;32881:3;32902:67;32966:2;32961:3;32902:67;:::i;:::-;32895:74;;32978:93;33067:3;32978:93;:::i;:::-;33096:2;33091:3;33087:12;33080:19;;32739:366;;;:::o;33111:419::-;33277:4;33315:2;33304:9;33300:18;33292:26;;33364:9;33358:4;33354:20;33350:1;33339:9;33335:17;33328:47;33392:131;33518:4;33392:131;:::i;:::-;33384:139;;33111:419;;;:::o;33536:180::-;33584:77;33581:1;33574:88;33681:4;33678:1;33671:15;33705:4;33702:1;33695:15;33722:233;33761:3;33784:24;33802:5;33784:24;:::i;:::-;33775:33;;33830:66;33823:5;33820:77;33817:103;;33900:18;;:::i;:::-;33817:103;33947:1;33940:5;33936:13;33929:20;;33722:233;;;:::o;33961:171::-;34101:23;34097:1;34089:6;34085:14;34078:47;33961:171;:::o;34138:366::-;34280:3;34301:67;34365:2;34360:3;34301:67;:::i;:::-;34294:74;;34377:93;34466:3;34377:93;:::i;:::-;34495:2;34490:3;34486:12;34479:19;;34138:366;;;:::o;34510:419::-;34676:4;34714:2;34703:9;34699:18;34691:26;;34763:9;34757:4;34753:20;34749:1;34738:9;34734:17;34727:47;34791:131;34917:4;34791:131;:::i;:::-;34783:139;;34510:419;;;:::o;34935:171::-;35075:23;35071:1;35063:6;35059:14;35052:47;34935:171;:::o;35112:366::-;35254:3;35275:67;35339:2;35334:3;35275:67;:::i;:::-;35268:74;;35351:93;35440:3;35351:93;:::i;:::-;35469:2;35464:3;35460:12;35453:19;;35112:366;;;:::o;35484:419::-;35650:4;35688:2;35677:9;35673:18;35665:26;;35737:9;35731:4;35727:20;35723:1;35712:9;35708:17;35701:47;35765:131;35891:4;35765:131;:::i;:::-;35757:139;;35484:419;;;:::o;35909:220::-;36049:34;36045:1;36037:6;36033:14;36026:58;36118:3;36113:2;36105:6;36101:15;36094:28;35909:220;:::o;36135:366::-;36277:3;36298:67;36362:2;36357:3;36298:67;:::i;:::-;36291:74;;36374:93;36463:3;36374:93;:::i;:::-;36492:2;36487:3;36483:12;36476:19;;36135:366;;;:::o;36507:419::-;36673:4;36711:2;36700:9;36696:18;36688:26;;36760:9;36754:4;36750:20;36746:1;36735:9;36731:17;36724:47;36788:131;36914:4;36788:131;:::i;:::-;36780:139;;36507:419;;;:::o;36932:173::-;37072:25;37068:1;37060:6;37056:14;37049:49;36932:173;:::o;37111:366::-;37253:3;37274:67;37338:2;37333:3;37274:67;:::i;:::-;37267:74;;37350:93;37439:3;37350:93;:::i;:::-;37468:2;37463:3;37459:12;37452:19;;37111:366;;;:::o;37483:419::-;37649:4;37687:2;37676:9;37672:18;37664:26;;37736:9;37730:4;37726:20;37722:1;37711:9;37707:17;37700:47;37764:131;37890:4;37764:131;:::i;:::-;37756:139;;37483:419;;;:::o;37908:180::-;38048:32;38044:1;38036:6;38032:14;38025:56;37908:180;:::o;38094:366::-;38236:3;38257:67;38321:2;38316:3;38257:67;:::i;:::-;38250:74;;38333:93;38422:3;38333:93;:::i;:::-;38451:2;38446:3;38442:12;38435:19;;38094:366;;;:::o;38466:419::-;38632:4;38670:2;38659:9;38655:18;38647:26;;38719:9;38713:4;38709:20;38705:1;38694:9;38690:17;38683:47;38747:131;38873:4;38747:131;:::i;:::-;38739:139;;38466:419;;;:::o;38891:191::-;38931:3;38950:20;38968:1;38950:20;:::i;:::-;38945:25;;38984:20;39002:1;38984:20;:::i;:::-;38979:25;;39027:1;39024;39020:9;39013:16;;39048:3;39045:1;39042:10;39039:36;;;39055:18;;:::i;:::-;39039:36;38891:191;;;;:::o;39088:194::-;39128:4;39148:20;39166:1;39148:20;:::i;:::-;39143:25;;39182:20;39200:1;39182:20;:::i;:::-;39177:25;;39226:1;39223;39219:9;39211:17;;39250:1;39244:4;39241:11;39238:37;;;39255:18;;:::i;:::-;39238:37;39088:194;;;;:::o;39288:180::-;39336:77;39333:1;39326:88;39433:4;39430:1;39423:15;39457:4;39454:1;39447:15;39474:176;39506:1;39523:20;39541:1;39523:20;:::i;:::-;39518:25;;39557:20;39575:1;39557:20;:::i;:::-;39552:25;;39596:1;39586:35;;39601:18;;:::i;:::-;39586:35;39642:1;39639;39635:9;39630:14;;39474:176;;;;:::o;39656:185::-;39696:1;39713:20;39731:1;39713:20;:::i;:::-;39708:25;;39747:20;39765:1;39747:20;:::i;:::-;39742:25;;39786:1;39776:35;;39791:18;;:::i;:::-;39776:35;39833:1;39830;39826:9;39821:14;;39656:185;;;;:::o;39847:148::-;39949:11;39986:3;39971:18;;39847:148;;;;:::o;40025:874::-;40128:3;40165:5;40159:12;40194:36;40220:9;40194:36;:::i;:::-;40246:89;40328:6;40323:3;40246:89;:::i;:::-;40239:96;;40366:1;40355:9;40351:17;40382:1;40377:166;;;;40557:1;40552:341;;;;40344:549;;40377:166;40461:4;40457:9;40446;40442:25;40437:3;40430:38;40523:6;40516:14;40509:22;40501:6;40497:35;40492:3;40488:45;40481:52;;40377:166;;40552:341;40619:38;40651:5;40619:38;:::i;:::-;40679:1;40693:154;40707:6;40704:1;40701:13;40693:154;;;40781:7;40775:14;40771:1;40766:3;40762:11;40755:35;40831:1;40822:7;40818:15;40807:26;;40729:4;40726:1;40722:12;40717:17;;40693:154;;;40876:6;40871:3;40867:16;40860:23;;40559:334;;40344:549;;40132:767;;40025:874;;;;:::o;40905:390::-;41011:3;41039:39;41072:5;41039:39;:::i;:::-;41094:89;41176:6;41171:3;41094:89;:::i;:::-;41087:96;;41192:65;41250:6;41245:3;41238:4;41231:5;41227:16;41192:65;:::i;:::-;41282:6;41277:3;41273:16;41266:23;;41015:280;40905:390;;;;:::o;41301:155::-;41441:7;41437:1;41429:6;41425:14;41418:31;41301:155;:::o;41462:400::-;41622:3;41643:84;41725:1;41720:3;41643:84;:::i;:::-;41636:91;;41736:93;41825:3;41736:93;:::i;:::-;41854:1;41849:3;41845:11;41838:18;;41462:400;;;:::o;41868:695::-;42146:3;42168:92;42256:3;42247:6;42168:92;:::i;:::-;42161:99;;42277:95;42368:3;42359:6;42277:95;:::i;:::-;42270:102;;42389:148;42533:3;42389:148;:::i;:::-;42382:155;;42554:3;42547:10;;41868:695;;;;;:::o;42569:167::-;42606:3;42629:22;42645:5;42629:22;:::i;:::-;42620:31;;42673:4;42666:5;42663:15;42660:41;;42681:18;;:::i;:::-;42660:41;42728:1;42721:5;42717:13;42710:20;;42569:167;;;:::o;42742:225::-;42882:34;42878:1;42870:6;42866:14;42859:58;42951:8;42946:2;42938:6;42934:15;42927:33;42742:225;:::o;42973:366::-;43115:3;43136:67;43200:2;43195:3;43136:67;:::i;:::-;43129:74;;43212:93;43301:3;43212:93;:::i;:::-;43330:2;43325:3;43321:12;43314:19;;42973:366;;;:::o;43345:419::-;43511:4;43549:2;43538:9;43534:18;43526:26;;43598:9;43592:4;43588:20;43584:1;43573:9;43569:17;43562:47;43626:131;43752:4;43626:131;:::i;:::-;43618:139;;43345:419;;;:::o;43770:224::-;43910:34;43906:1;43898:6;43894:14;43887:58;43979:7;43974:2;43966:6;43962:15;43955:32;43770:224;:::o;44000:366::-;44142:3;44163:67;44227:2;44222:3;44163:67;:::i;:::-;44156:74;;44239:93;44328:3;44239:93;:::i;:::-;44357:2;44352:3;44348:12;44341:19;;44000:366;;;:::o;44372:419::-;44538:4;44576:2;44565:9;44561:18;44553:26;;44625:9;44619:4;44615:20;44611:1;44600:9;44596:17;44589:47;44653:131;44779:4;44653:131;:::i;:::-;44645:139;;44372:419;;;:::o;44797:223::-;44937:34;44933:1;44925:6;44921:14;44914:58;45006:6;45001:2;44993:6;44989:15;44982:31;44797:223;:::o;45026:366::-;45168:3;45189:67;45253:2;45248:3;45189:67;:::i;:::-;45182:74;;45265:93;45354:3;45265:93;:::i;:::-;45383:2;45378:3;45374:12;45367:19;;45026:366;;;:::o;45398:419::-;45564:4;45602:2;45591:9;45587:18;45579:26;;45651:9;45645:4;45641:20;45637:1;45626:9;45622:17;45615:47;45679:131;45805:4;45679:131;:::i;:::-;45671:139;;45398:419;;;:::o;45823:182::-;45963:34;45959:1;45951:6;45947:14;45940:58;45823:182;:::o;46011:366::-;46153:3;46174:67;46238:2;46233:3;46174:67;:::i;:::-;46167:74;;46250:93;46339:3;46250:93;:::i;:::-;46368:2;46363:3;46359:12;46352:19;;46011:366;;;:::o;46383:419::-;46549:4;46587:2;46576:9;46572:18;46564:26;;46636:9;46630:4;46626:20;46622:1;46611:9;46607:17;46600:47;46664:131;46790:4;46664:131;:::i;:::-;46656:139;;46383:419;;;:::o;46808:181::-;46948:33;46944:1;46936:6;46932:14;46925:57;46808:181;:::o;46995:366::-;47137:3;47158:67;47222:2;47217:3;47158:67;:::i;:::-;47151:74;;47234:93;47323:3;47234:93;:::i;:::-;47352:2;47347:3;47343:12;47336:19;;46995:366;;;:::o;47367:419::-;47533:4;47571:2;47560:9;47556:18;47548:26;;47620:9;47614:4;47610:20;47606:1;47595:9;47591:17;47584:47;47648:131;47774:4;47648:131;:::i;:::-;47640:139;;47367:419;;;:::o;47792:175::-;47932:27;47928:1;47920:6;47916:14;47909:51;47792:175;:::o;47973:366::-;48115:3;48136:67;48200:2;48195:3;48136:67;:::i;:::-;48129:74;;48212:93;48301:3;48212:93;:::i;:::-;48330:2;48325:3;48321:12;48314:19;;47973:366;;;:::o;48345:419::-;48511:4;48549:2;48538:9;48534:18;48526:26;;48598:9;48592:4;48588:20;48584:1;48573:9;48569:17;48562:47;48626:131;48752:4;48626:131;:::i;:::-;48618:139;;48345:419;;;:::o;48770:237::-;48910:34;48906:1;48898:6;48894:14;48887:58;48979:20;48974:2;48966:6;48962:15;48955:45;48770:237;:::o;49013:366::-;49155:3;49176:67;49240:2;49235:3;49176:67;:::i;:::-;49169:74;;49252:93;49341:3;49252:93;:::i;:::-;49370:2;49365:3;49361:12;49354:19;;49013:366;;;:::o;49385:419::-;49551:4;49589:2;49578:9;49574:18;49566:26;;49638:9;49632:4;49628:20;49624:1;49613:9;49609:17;49602:47;49666:131;49792:4;49666:131;:::i;:::-;49658:139;;49385:419;;;:::o;49810:240::-;49950:34;49946:1;49938:6;49934:14;49927:58;50019:23;50014:2;50006:6;50002:15;49995:48;49810:240;:::o;50056:366::-;50198:3;50219:67;50283:2;50278:3;50219:67;:::i;:::-;50212:74;;50295:93;50384:3;50295:93;:::i;:::-;50413:2;50408:3;50404:12;50397:19;;50056:366;;;:::o;50428:419::-;50594:4;50632:2;50621:9;50617:18;50609:26;;50681:9;50675:4;50671:20;50667:1;50656:9;50652:17;50645:47;50709:131;50835:4;50709:131;:::i;:::-;50701:139;;50428:419;;;:::o;50853:98::-;50904:6;50938:5;50932:12;50922:22;;50853:98;;;:::o;50957:168::-;51040:11;51074:6;51069:3;51062:19;51114:4;51109:3;51105:14;51090:29;;50957:168;;;;:::o;51131:373::-;51217:3;51245:38;51277:5;51245:38;:::i;:::-;51299:70;51362:6;51357:3;51299:70;:::i;:::-;51292:77;;51378:65;51436:6;51431:3;51424:4;51417:5;51413:16;51378:65;:::i;:::-;51468:29;51490:6;51468:29;:::i;:::-;51463:3;51459:39;51452:46;;51221:283;51131:373;;;;:::o;51510:640::-;51705:4;51743:3;51732:9;51728:19;51720:27;;51757:71;51825:1;51814:9;51810:17;51801:6;51757:71;:::i;:::-;51838:72;51906:2;51895:9;51891:18;51882:6;51838:72;:::i;:::-;51920;51988:2;51977:9;51973:18;51964:6;51920:72;:::i;:::-;52039:9;52033:4;52029:20;52024:2;52013:9;52009:18;52002:48;52067:76;52138:4;52129:6;52067:76;:::i;:::-;52059:84;;51510:640;;;;;;;:::o;52156:141::-;52212:5;52243:6;52237:13;52228:22;;52259:32;52285:5;52259:32;:::i;:::-;52156:141;;;;:::o;52303:349::-;52372:6;52421:2;52409:9;52400:7;52396:23;52392:32;52389:119;;;52427:79;;:::i;:::-;52389:119;52547:1;52572:63;52627:7;52618:6;52607:9;52603:22;52572:63;:::i;:::-;52562:73;;52518:127;52303:349;;;;:::o;52658:180::-;52706:77;52703:1;52696:88;52803:4;52800:1;52793:15;52827:4;52824:1;52817:15;52844:182;52984:34;52980:1;52972:6;52968:14;52961:58;52844:182;:::o;53032:366::-;53174:3;53195:67;53259:2;53254:3;53195:67;:::i;:::-;53188:74;;53271:93;53360:3;53271:93;:::i;:::-;53389:2;53384:3;53380:12;53373:19;;53032:366;;;:::o;53404:419::-;53570:4;53608:2;53597:9;53593:18;53585:26;;53657:9;53651:4;53647:20;53643:1;53632:9;53628:17;53621:47;53685:131;53811:4;53685:131;:::i;:::-;53677:139;;53404:419;;;:::o;53829:178::-;53969:30;53965:1;53957:6;53953:14;53946:54;53829:178;:::o;54013:366::-;54155:3;54176:67;54240:2;54235:3;54176:67;:::i;:::-;54169:74;;54252:93;54341:3;54252:93;:::i;:::-;54370:2;54365:3;54361:12;54354:19;;54013:366;;;:::o;54385:419::-;54551:4;54589:2;54578:9;54574:18;54566:26;;54638:9;54632:4;54628:20;54624:1;54613:9;54609:17;54602:47;54666:131;54792:4;54666:131;:::i;:::-;54658:139;;54385:419;;;:::o

Swarm Source

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