Token HiddenFishDAOVIP

Overview CRC721

Total Supply:
1,000 HiFiVIP

Holders:
392 addresses
Balance
1 HiFiVIP
0xdafc5436cabb478e35c5e74bbc5673ca3ee04252
Loading
[ Download CSV Export  ] 
Loading
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
HiddenFishDAOVIP

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license
File 1 of 24 : HiddenFishVIP.sol
//SPDX-License-Identifier: unlicensed
pragma solidity ^0.8.4;

import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC1155/utils/ERC1155Holder.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
import "@openzeppelin/contracts-upgradeable/interfaces/IERC1155ReceiverUpgradeable.sol";

interface IMembershipStaker is IERC1155ReceiverUpgradeable {

    /**
     * @dev Emitted when `staker` adds stakes one or more memberships for a new `totalStaked`
     */
    event MembershipStaked(address indexed staker, uint256 totalStaked);

    /**
     * @dev Emmited when `staker` unstaked for a new `totalStaked`
     */
     event MembershipUnstaked(address indexed staker, uint256 totalStaked);

     function stake(uint256 amount) external;

     function unstake(uint256 amount) external;

     function amountStaked(address staker) external view returns (uint256);

     function totalStaked() external view returns (uint256);

     function currentStaked() external view returns (address[] memory stakers, uint256[] memory amounts);

     function harvest(address _harvester) external;

     function getReward(address _address) external returns(uint256);

}

abstract contract Market {
    function isMember(address user) public view virtual returns (bool);
    function addToEscrow(address _address) external virtual payable;
}
abstract contract BaseDrop is ERC721Enumerable, Ownable, Pausable, ReentrancyGuard {
    using Address for address payable;
   
    address public artist = 0x454cfAa623A629CC0b4017aEb85d54C42e91479d;
    uint128 constant internal SCALE = 10000;
    uint128 internal fee = 2500;
    uint16[] internal order;
    address public marketContract;

    function isMember(address _address) public view returns (bool) {
        return Market(marketContract).isMember(_address);
    }

    function payDirect(uint256 amount) internal {
        Market(marketContract).addToEscrow{value: amount}(artist);
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

    function withdraw() public virtual onlyOwner{
        payable(msg.sender).sendValue(address(this).balance);
    }

    function pause() public onlyOwner{
        _pause();
    }

    function unpause() public onlyOwner{
        _unpause();
    }
}

interface IDrop {
    struct Info {
        uint256 regularCost;
        uint256 memberCost;
        uint256 whitelistCost;
        uint256 maxSupply;
        uint256 totalSupply;
        uint256 maxMintPerAddress;
        uint256 maxMintPerTx;
    }

    function mintCost(address _minter) external view returns(uint256);
    function canMint(address _minter) external view returns (uint256);
    function mint(uint256 _amount) external payable;
    function maxSupply() external view returns (uint256);
    function getInfo() external view returns (Info memory);
}

contract HiddenFishDAOVIP is IDrop, BaseDrop, ERC1155Holder {
    using SafeMath for uint256;
    using Counters for Counters.Counter;

    address payable addrDev;
    address payable addrVipWallet;

    uint256 devFee = 3 ether;
    Counters.Counter private _tokenIDs;

    string tokenURL;

    uint256 iPhase2TimeStamp = 1653418800;
    bool bPhase2 = false;

    Info infoDAOVIP;

    IERC1155 ebisusVIP;
    IMembershipStaker ebisusStake;
    
    constructor(address vipwallet, IERC1155 _member, IMembershipStaker _stake, address _market) ERC721("HiddenFishDAOVIP", "HiFiVIP") {
        addrDev = payable(0x4bE2beCFdD81f173ac97a445680eB438C5496eA1);
        marketContract = payable(_market);

        infoDAOVIP.regularCost = 1200 ether;
        infoDAOVIP.memberCost = 1200 ether;
        infoDAOVIP.maxSupply = 1000;
        infoDAOVIP.maxMintPerTx = 5;
        infoDAOVIP.maxMintPerAddress = 5;

        addrVipWallet = payable(vipwallet);
        ebisusStake = _stake;
        ebisusVIP = _member;

        setTokenURI("https://hifidao.mypinata.cloud/ipfs/QmcSCPgciWuNvvmJ3KqsFKzea9AUoNGLmExpPbeBCZu2hj");
    }

    modifier _needsDAOCEO() {
        require(msg.sender == addrVipWallet, "ALERT: Not allowed to!");

        _;
    }

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        return tokenURL;
    }

    function setTokenURI(string memory uri) public onlyOwner() {
        tokenURL = uri;
    }

    function mintCost(address _minter) override external view returns(uint256) {
        bool _isMember = isMember(_minter);

        if(_isMember){
            return infoDAOVIP.memberCost;
        } else {
            return infoDAOVIP.regularCost;
        }
    }

    function canMint(address _minter) override external view returns(uint256) {
        return infoDAOVIP.maxMintPerTx;
    }

    function nextStep() public onlyOwner() {
        bPhase2 = true;
    }

    function mint(uint256 _amount) override external payable {
        if(block.timestamp > iPhase2TimeStamp) {
            bPhase2 = true;
        }

        uint256 ebisusVIPStaked = ebisusStake.amountStaked(msg.sender);
        uint256 ebisusVIPCount = ebisusVIP.balanceOf(msg.sender, 2);
        uint256 ebisusOverallVIP = ebisusVIPStaked + ebisusVIPCount;
        require(ebisusOverallVIP > 0, "ALERT: Only VIPs can mint");

        uint256 owned = balanceOf(msg.sender);

        if(bPhase2) {
            require(ebisusVIPCount >= _amount, "Alert: not enough VIPs");
            require(owned < ebisusVIPCount, "Alert: not enough VIPs");
            require(owned < infoDAOVIP.maxMintPerAddress, "ALERT: Max 5 NFT per Wallet");

            uint256 newOwned = owned + _amount;
            require(newOwned <= infoDAOVIP.maxMintPerAddress, "ALERT: New Amount bigger than 5 NFT");
            require(newOwned <= ebisusVIPCount, "ALERT: Not Enough VIPs");

            uint256 price = _amount * infoDAOVIP.memberCost;
            require(msg.value >= price, "ALERT: Not enough funds");

            uint256 devPart = devFee * _amount;
            addrDev.transfer(devPart);
            addrVipWallet.transfer(address(this).balance);

            for(uint256 i = 0; i < _amount; i++) {
                uint256 itemID = _tokenIDs.current();
                _mint(msg.sender, itemID);
                _tokenIDs.increment();
                infoDAOVIP.totalSupply++;
            }
        } else {
            require(_amount == 1, "ALERT: Only 1 per Wallet the first 48h");
            require(owned < 1, "ALERT: Only 1 per Wallet the first 48h");
            uint256 price = _amount * infoDAOVIP.memberCost;
            require(msg.value >= price, "ALERT: Not enough funds");

            uint256 devPart = devFee * _amount;
            addrDev.transfer(devPart);
            addrVipWallet.transfer(address(this).balance);

            for(uint256 i = 0; i < _amount; i++) {
                uint256 itemID = _tokenIDs.current();
                _mint(msg.sender, itemID);
                _tokenIDs.increment();
                infoDAOVIP.totalSupply++;
            }
        }
    }

    function maxSupply() override external view returns(uint256) {
        return infoDAOVIP.maxSupply;
    }

    function totalSupply() override public view returns(uint256) {
        return infoDAOVIP.totalSupply;
    }

    function getInfo() override external view returns(Info memory) {
        return infoDAOVIP;
    }

    function supportsInterface(bytes4 interfaceId) public view override(BaseDrop, ERC1155Receiver) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

File 2 of 24 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

File 3 of 24 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (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 Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 4 of 24 : ERC1155Holder.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/utils/ERC1155Holder.sol)

pragma solidity ^0.8.0;

import "./ERC1155Receiver.sol";

/**
 * Simple implementation of `ERC1155Receiver` that will allow a contract to hold ERC1155 tokens.
 *
 * IMPORTANT: When inheriting this contract, you must include a way to use the received tokens, otherwise they will be
 * stuck.
 *
 * @dev _Available since v3.1._
 */
contract ERC1155Holder is ERC1155Receiver {
    function onERC1155Received(
        address,
        address,
        uint256,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155Received.selector;
    }

    function onERC1155BatchReceived(
        address,
        address,
        uint256[] memory,
        uint256[] memory,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC1155BatchReceived.selector;
    }
}

File 5 of 24 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

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

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

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

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 6 of 24 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

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

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

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

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

File 7 of 24 : Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 8 of 24 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 9 of 24 : 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);
    }
}

File 10 of 24 : SafeMath.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 11 of 24 : IERC1155ReceiverUpgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (interfaces/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../token/ERC1155/IERC1155ReceiverUpgradeable.sol";

File 12 of 24 : 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 13 of 24 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/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: balance query for the zero address");
        return _balances[owner];
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _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: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 14 of 24 : 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 15 of 24 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

File 16 of 24 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 17 of 24 : 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 18 of 24 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 19 of 24 : 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 20 of 24 : 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 21 of 24 : ERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/utils/ERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../IERC1155Receiver.sol";
import "../../../utils/introspection/ERC165.sol";

/**
 * @dev _Available since v3.1._
 */
abstract contract ERC1155Receiver is ERC165, IERC1155Receiver {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return interfaceId == type(IERC1155Receiver).interfaceId || super.supportsInterface(interfaceId);
    }
}

File 22 of 24 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

File 23 of 24 : IERC1155ReceiverUpgradeable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165Upgradeable.sol";

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

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

File 24 of 24 : IERC165Upgradeable.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 IERC165Upgradeable {
    /**
     * @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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"vipwallet","type":"address"},{"internalType":"contract IERC1155","name":"_member","type":"address"},{"internalType":"contract IMembershipStaker","name":"_stake","type":"address"},{"internalType":"address","name":"_market","type":"address"}],"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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artist","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"canMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getInfo","outputs":[{"components":[{"internalType":"uint256","name":"regularCost","type":"uint256"},{"internalType":"uint256","name":"memberCost","type":"uint256"},{"internalType":"uint256","name":"whitelistCost","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"},{"internalType":"uint256","name":"totalSupply","type":"uint256"},{"internalType":"uint256","name":"maxMintPerAddress","type":"uint256"},{"internalType":"uint256","name":"maxMintPerTx","type":"uint256"}],"internalType":"struct IDrop.Info","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"isMember","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_minter","type":"address"}],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextStep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273454cfaa623a629cc0b4017aeb85d54c42e91479d600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506109c4600d60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506729a2241af62c000060125563628d2b306015556000601660006101000a81548160ff021916908315150217905550348015620000d057600080fd5b5060405162005679380380620056798339818101604052810190620000f6919062000646565b6040518060400160405280601081526020017f48696464656e4669736844414f564950000000000000000000000000000000008152506040518060400160405280600781526020017f486946695649500000000000000000000000000000000000000000000000000081525081600090805190602001906200017a92919062000551565b5080600190805190602001906200019392919062000551565b505050620001b6620001aa620003ae60201b60201c565b620003b660201b60201c565b6000600a60146101000a81548160ff0219169083151502179055506001600b81905550734be2becfdd81f173ac97a445680eb438c5496ea1601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555068410d586a20a4c0000060176000018190555068410d586a20a4c000006017600101819055506103e86017600301819055506005601760060181905550600560176005018190555083601160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081601f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082601e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620003a460405180608001604052806052815260200162005627605291396200047c60201b60201c565b5050505062000844565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200048c620003ae60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620004b26200052760201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200050b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200050290620006d9565b60405180910390fd5b80601490805190602001906200052392919062000551565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200055f9062000768565b90600052602060002090601f016020900481019282620005835760008555620005cf565b82601f106200059e57805160ff1916838001178555620005cf565b82800160010185558215620005cf579182015b82811115620005ce578251825591602001919060010190620005b1565b5b509050620005de9190620005e2565b5090565b5b80821115620005fd576000816000905550600101620005e3565b5090565b6000815190506200061281620007f6565b92915050565b600081519050620006298162000810565b92915050565b60008151905062000640816200082a565b92915050565b600080600080608085870312156200065d57600080fd5b60006200066d8782880162000601565b9450506020620006808782880162000618565b935050604062000693878288016200062f565b9250506060620006a68782880162000601565b91505092959194509250565b6000620006c1602083620006fb565b9150620006ce82620007cd565b602082019050919050565b60006020820190508181036000830152620006f481620006b2565b9050919050565b600082825260208201905092915050565b6000620007198262000748565b9050919050565b60006200072d826200070c565b9050919050565b600062000741826200070c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200078157607f821691505b602082108114156200079857620007976200079e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000801816200070c565b81146200080d57600080fd5b50565b6200081b8162000720565b81146200082757600080fd5b50565b620008358162000734565b81146200084157600080fd5b50565b614dd380620008546000396000f3fe6080604052600436106102045760003560e01c8063715018a611610118578063bc197c81116100a0578063d5abeb011161006f578063d5abeb011461075c578063e0df5b6f14610787578063e985e9c5146107b0578063f23a6e61146107ed578063f2fde38b1461082a57610204565b8063bc197c811461068e578063c2ba4744146106cb578063c87b56dd14610708578063c90007261461074557610204565b8063a0712d68116100e7578063a0712d68146105b8578063a1794bcd146105d4578063a22cb465146105ff578063a230c52414610628578063b88d4fde1461066557610204565b8063715018a6146105345780638456cb591461054b5780638da5cb5b1461056257806395d89b411461058d57610204565b80633ccfd60b1161019b5780634f6ccce71161016a5780634f6ccce7146104275780635a9b0b89146104645780635c975abb1461048f5780636352211e146104ba57806370a08231146104f757610204565b80633ccfd60b146103a55780633f4ba83a146103bc57806342842e0e146103d357806343bc1612146103fc57610204565b806318160ddd116101d757806318160ddd146102d757806323b872dd146103025780632acc659e1461032b5780632f745c591461036857610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b919061378d565b610853565b60405161023d9190613e68565b60405180910390f35b34801561025257600080fd5b5061025b610865565b6040516102689190613e9e565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613820565b6108f7565b6040516102a59190613dd8565b60405180910390f35b3480156102ba57600080fd5b506102d560048036038101906102d09190613728565b61097c565b005b3480156102e357600080fd5b506102ec610a94565b6040516102f9919061425b565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613593565b610aa1565b005b34801561033757600080fd5b50610352600480360381019061034d919061346f565b610b01565b60405161035f919061425b565b60405180910390f35b34801561037457600080fd5b5061038f600480360381019061038a9190613728565b610b32565b60405161039c919061425b565b60405180910390f35b3480156103b157600080fd5b506103ba610bd7565b005b3480156103c857600080fd5b506103d1610c7e565b005b3480156103df57600080fd5b506103fa60048036038101906103f59190613593565b610d04565b005b34801561040857600080fd5b50610411610d24565b60405161041e9190613dd8565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613820565b610d4a565b60405161045b919061425b565b60405180910390f35b34801561047057600080fd5b50610479610de1565b6040516104869190614240565b60405180910390f35b34801561049b57600080fd5b506104a4610e41565b6040516104b19190613e68565b60405180910390f35b3480156104c657600080fd5b506104e160048036038101906104dc9190613820565b610e58565b6040516104ee9190613dd8565b60405180910390f35b34801561050357600080fd5b5061051e6004803603810190610519919061346f565b610f0a565b60405161052b919061425b565b60405180910390f35b34801561054057600080fd5b50610549610fc2565b005b34801561055757600080fd5b5061056061104a565b005b34801561056e57600080fd5b506105776110d0565b6040516105849190613dd8565b60405180910390f35b34801561059957600080fd5b506105a26110fa565b6040516105af9190613e9e565b60405180910390f35b6105d260048036038101906105cd9190613820565b61118c565b005b3480156105e057600080fd5b506105e96118b8565b6040516105f69190613dd8565b60405180910390f35b34801561060b57600080fd5b50610626600480360381019061062191906136ec565b6118de565b005b34801561063457600080fd5b5061064f600480360381019061064a919061346f565b6118f4565b60405161065c9190613e68565b60405180910390f35b34801561067157600080fd5b5061068c600480360381019061068791906135e2565b6119a8565b005b34801561069a57600080fd5b506106b560048036038101906106b091906134d4565b611a0a565b6040516106c29190613e83565b60405180910390f35b3480156106d757600080fd5b506106f260048036038101906106ed919061346f565b611a1f565b6040516106ff919061425b565b60405180910390f35b34801561071457600080fd5b5061072f600480360381019061072a9190613820565b611a2e565b60405161073c9190613e9e565b60405180910390f35b34801561075157600080fd5b5061075a611ac2565b005b34801561076857600080fd5b50610771611b5b565b60405161077e919061425b565b60405180910390f35b34801561079357600080fd5b506107ae60048036038101906107a991906137df565b611b68565b005b3480156107bc57600080fd5b506107d760048036038101906107d29190613498565b611bfe565b6040516107e49190613e68565b60405180910390f35b3480156107f957600080fd5b50610814600480360381019061080f919061365d565b611c92565b6040516108219190613e83565b60405180910390f35b34801561083657600080fd5b50610851600480360381019061084c919061346f565b611ca7565b005b600061085e82611d9f565b9050919050565b60606000805461087490614518565b80601f01602080910402602001604051908101604052809291908181526020018280546108a090614518565b80156108ed5780601f106108c2576101008083540402835291602001916108ed565b820191906000526020600020905b8154815290600101906020018083116108d057829003601f168201915b5050505050905090565b600061090282611e19565b610941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161093890614160565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061098782610e58565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ef906141a0565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a17611e85565b73ffffffffffffffffffffffffffffffffffffffff161480610a465750610a4581610a40611e85565b611bfe565b5b610a85576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7c906140c0565b60405180910390fd5b610a8f8383611e8d565b505050565b6000601760040154905090565b610ab2610aac611e85565b82611f46565b610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae8906141e0565b60405180910390fd5b610afc838383612024565b505050565b600080610b0d836118f4565b90508015610b2357601760010154915050610b2d565b6017600001549150505b919050565b6000610b3d83610f0a565b8210610b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7590613f00565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bdf611e85565b73ffffffffffffffffffffffffffffffffffffffff16610bfd6110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610c53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c4a90614180565b60405180910390fd5b610c7c473373ffffffffffffffffffffffffffffffffffffffff1661228b90919063ffffffff16565b565b610c86611e85565b73ffffffffffffffffffffffffffffffffffffffff16610ca46110d0565b73ffffffffffffffffffffffffffffffffffffffff1614610cfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf190614180565b60405180910390fd5b610d0261237f565b565b610d1f838383604051806020016040528060008152506119a8565b505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610d54612421565b8210610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90614200565b60405180910390fd5b60088281548110610dcf577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610de9613196565b60176040518060e0016040529081600082015481526020016001820154815260200160028201548152602001600382015481526020016004820154815260200160058201548152602001600682015481525050905090565b6000600a60149054906101000a900460ff16905090565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef890614100565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f72906140e0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fca611e85565b73ffffffffffffffffffffffffffffffffffffffff16610fe86110d0565b73ffffffffffffffffffffffffffffffffffffffff161461103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103590614180565b60405180910390fd5b611048600061242e565b565b611052611e85565b73ffffffffffffffffffffffffffffffffffffffff166110706110d0565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd90614180565b60405180910390fd5b6110ce6124f4565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461110990614518565b80601f016020809104026020016040519081016040528092919081815260200182805461113590614518565b80156111825780601f1061115757610100808354040283529160200191611182565b820191906000526020600020905b81548152906001019060200180831161116557829003601f168201915b5050505050905090565b6015544211156111b2576001601660006101000a81548160ff0219169083151502179055505b6000601f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ef40a670336040518263ffffffff1660e01b815260040161120f9190613dd8565b60206040518083038186803b15801561122757600080fd5b505afa15801561123b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125f9190613849565b90506000601e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1662fdd58e3360026040518363ffffffff1660e01b81526004016112c0929190613e3f565b60206040518083038186803b1580156112d857600080fd5b505afa1580156112ec573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113109190613849565b905060008183611320919061436c565b905060008111611365576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135c90613f60565b60405180910390fd5b600061137033610f0a565b9050601660009054906101000a900460ff161561168f57848310156113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c190614220565b60405180910390fd5b82811061140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390614220565b60405180910390fd5b6017600501548110611453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144a90613fc0565b60405180910390fd5b60008582611461919061436c565b90506017600501548111156114ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114a290614060565b60405180910390fd5b838111156114ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e590613ee0565b60405180910390fd5b60006017600101548761150191906143c2565b905080341015611546576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153d906141c0565b60405180910390fd5b60008760125461155691906143c2565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115c0573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611629573d6000803e3d6000fd5b5060005b888110156116865760006116416013612597565b905061164d33826125a5565b611657601361277f565b6017600401600081548092919061166d9061457b565b919050555050808061167e9061457b565b91505061162d565b505050506118b1565b600185146116d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c990614120565b60405180910390fd5b60018110611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c90614120565b60405180910390fd5b60006017600101548661172891906143c2565b90508034101561176d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611764906141c0565b60405180910390fd5b60008660125461177d91906143c2565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117e7573d6000803e3d6000fd5b50601160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015611850573d6000803e3d6000fd5b5060005b878110156118ad5760006118686013612597565b905061187433826125a5565b61187e601361277f565b601760040160008154809291906118949061457b565b91905055505080806118a59061457b565b915050611854565b5050505b5050505050565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6118f06118e9611e85565b8383612795565b5050565b6000600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a230c524836040518263ffffffff1660e01b81526004016119519190613dd8565b60206040518083038186803b15801561196957600080fd5b505afa15801561197d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119a19190613764565b9050919050565b6119b96119b3611e85565b83611f46565b6119f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ef906141e0565b60405180910390fd5b611a0484848484612902565b50505050565b600063bc197c8160e01b905095945050505050565b60006017600601549050919050565b606060148054611a3d90614518565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6990614518565b8015611ab65780601f10611a8b57610100808354040283529160200191611ab6565b820191906000526020600020905b815481529060010190602001808311611a9957829003601f168201915b50505050509050919050565b611aca611e85565b73ffffffffffffffffffffffffffffffffffffffff16611ae86110d0565b73ffffffffffffffffffffffffffffffffffffffff1614611b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3590614180565b60405180910390fd5b6001601660006101000a81548160ff021916908315150217905550565b6000601760030154905090565b611b70611e85565b73ffffffffffffffffffffffffffffffffffffffff16611b8e6110d0565b73ffffffffffffffffffffffffffffffffffffffff1614611be4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdb90614180565b60405180910390fd5b8060149080519060200190611bfa9291906131d3565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600063f23a6e6160e01b905095945050505050565b611caf611e85565b73ffffffffffffffffffffffffffffffffffffffff16611ccd6110d0565b73ffffffffffffffffffffffffffffffffffffffff1614611d23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1a90614180565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8a90613f40565b60405180910390fd5b611d9c8161242e565b50565b60007f4e2312e0000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e125750611e118261295e565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f0083610e58565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f5182611e19565b611f90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8790614080565b60405180910390fd5b6000611f9b83610e58565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061200a57508373ffffffffffffffffffffffffffffffffffffffff16611ff2846108f7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061201b575061201a8185611bfe565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661204482610e58565b73ffffffffffffffffffffffffffffffffffffffff161461209a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209190613f80565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561210a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210190613fe0565b60405180910390fd5b612115838383612970565b612120600082611e8d565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612170919061441c565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121c7919061436c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612286838383612980565b505050565b804710156122ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c590614040565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516122f490613dc3565b60006040518083038185875af1925050503d8060008114612331576040519150601f19603f3d011682016040523d82523d6000602084013e612336565b606091505b505090508061237a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161237190614020565b60405180910390fd5b505050565b612387610e41565b6123c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bd90613ec0565b60405180910390fd5b6000600a60146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa61240a611e85565b6040516124179190613dd8565b60405180910390a1565b6000600880549050905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6124fc610e41565b1561253c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612533906140a0565b60405180910390fd5b6001600a60146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612580611e85565b60405161258d9190613dd8565b60405180910390a1565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161260c90614140565b60405180910390fd5b61261e81611e19565b1561265e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265590613fa0565b60405180910390fd5b61266a60008383612970565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126ba919061436c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461277b60008383612980565b5050565b6001816000016000828254019250508190555050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612804576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb90614000565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128f59190613e68565b60405180910390a3505050565b61290d848484612024565b61291984848484612985565b612958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294f90613f20565b60405180910390fd5b50505050565b600061296982612b1c565b9050919050565b61297b838383612b96565b505050565b505050565b60006129a68473ffffffffffffffffffffffffffffffffffffffff16612caa565b15612b0f578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026129cf611e85565b8786866040518563ffffffff1660e01b81526004016129f19493929190613df3565b602060405180830381600087803b158015612a0b57600080fd5b505af1925050508015612a3c57506040513d601f19601f82011682018060405250810190612a3991906137b6565b60015b612abf573d8060008114612a6c576040519150601f19603f3d011682016040523d82523d6000602084013e612a71565b606091505b50600081511415612ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aae90613f20565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612b14565b600190505b949350505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612b8f5750612b8e82612ccd565b5b9050919050565b612ba1838383612daf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612be457612bdf81612db4565b612c23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c2257612c218382612dfd565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c6657612c6181612f6a565b612ca5565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612ca457612ca382826130ad565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d9857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612da85750612da78261312c565b5b9050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612e0a84610f0a565b612e14919061441c565b9050600060076000848152602001908152602001600020549050818114612ef9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f7e919061441c565b9050600060096000848152602001908152602001600020549050600060088381548110612fd4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061301c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613091577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006130b883610f0a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6040518060e00160405280600081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b8280546131df90614518565b90600052602060002090601f0160209004810192826132015760008555613248565b82601f1061321a57805160ff1916838001178555613248565b82800160010185558215613248579182015b8281111561324757825182559160200191906001019061322c565b5b5090506132559190613259565b5090565b5b8082111561327257600081600090555060010161325a565b5090565b60006132896132848461429b565b614276565b905080838252602082019050828560208602820111156132a857600080fd5b60005b858110156132d857816132be8882613445565b8452602084019350602083019250506001810190506132ab565b5050509392505050565b60006132f56132f0846142c7565b614276565b90508281526020810184848401111561330d57600080fd5b6133188482856144d6565b509392505050565b600061333361332e846142f8565b614276565b90508281526020810184848401111561334b57600080fd5b6133568482856144d6565b509392505050565b60008135905061336d81614d41565b92915050565b600082601f83011261338457600080fd5b8135613394848260208601613276565b91505092915050565b6000813590506133ac81614d58565b92915050565b6000815190506133c181614d58565b92915050565b6000813590506133d681614d6f565b92915050565b6000815190506133eb81614d6f565b92915050565b600082601f83011261340257600080fd5b81356134128482602086016132e2565b91505092915050565b600082601f83011261342c57600080fd5b813561343c848260208601613320565b91505092915050565b60008135905061345481614d86565b92915050565b60008151905061346981614d86565b92915050565b60006020828403121561348157600080fd5b600061348f8482850161335e565b91505092915050565b600080604083850312156134ab57600080fd5b60006134b98582860161335e565b92505060206134ca8582860161335e565b9150509250929050565b600080600080600060a086880312156134ec57600080fd5b60006134fa8882890161335e565b955050602061350b8882890161335e565b945050604086013567ffffffffffffffff81111561352857600080fd5b61353488828901613373565b935050606086013567ffffffffffffffff81111561355157600080fd5b61355d88828901613373565b925050608086013567ffffffffffffffff81111561357a57600080fd5b613586888289016133f1565b9150509295509295909350565b6000806000606084860312156135a857600080fd5b60006135b68682870161335e565b93505060206135c78682870161335e565b92505060406135d886828701613445565b9150509250925092565b600080600080608085870312156135f857600080fd5b60006136068782880161335e565b94505060206136178782880161335e565b935050604061362887828801613445565b925050606085013567ffffffffffffffff81111561364557600080fd5b613651878288016133f1565b91505092959194509250565b600080600080600060a0868803121561367557600080fd5b60006136838882890161335e565b95505060206136948882890161335e565b94505060406136a588828901613445565b93505060606136b688828901613445565b925050608086013567ffffffffffffffff8111156136d357600080fd5b6136df888289016133f1565b9150509295509295909350565b600080604083850312156136ff57600080fd5b600061370d8582860161335e565b925050602061371e8582860161339d565b9150509250929050565b6000806040838503121561373b57600080fd5b60006137498582860161335e565b925050602061375a85828601613445565b9150509250929050565b60006020828403121561377657600080fd5b6000613784848285016133b2565b91505092915050565b60006020828403121561379f57600080fd5b60006137ad848285016133c7565b91505092915050565b6000602082840312156137c857600080fd5b60006137d6848285016133dc565b91505092915050565b6000602082840312156137f157600080fd5b600082013567ffffffffffffffff81111561380b57600080fd5b6138178482850161341b565b91505092915050565b60006020828403121561383257600080fd5b600061384084828501613445565b91505092915050565b60006020828403121561385b57600080fd5b60006138698482850161345a565b91505092915050565b61387b81614450565b82525050565b61388a81614462565b82525050565b6138998161446e565b82525050565b60006138aa82614329565b6138b4818561433f565b93506138c48185602086016144e5565b6138cd81614651565b840191505092915050565b6138e1816144c4565b82525050565b60006138f282614334565b6138fc818561435b565b935061390c8185602086016144e5565b61391581614651565b840191505092915050565b600061392d60148361435b565b915061393882614662565b602082019050919050565b600061395060168361435b565b915061395b8261468b565b602082019050919050565b6000613973602b8361435b565b915061397e826146b4565b604082019050919050565b600061399660328361435b565b91506139a182614703565b604082019050919050565b60006139b960268361435b565b91506139c482614752565b604082019050919050565b60006139dc60198361435b565b91506139e7826147a1565b602082019050919050565b60006139ff60258361435b565b9150613a0a826147ca565b604082019050919050565b6000613a22601c8361435b565b9150613a2d82614819565b602082019050919050565b6000613a45601b8361435b565b9150613a5082614842565b602082019050919050565b6000613a6860248361435b565b9150613a738261486b565b604082019050919050565b6000613a8b60198361435b565b9150613a96826148ba565b602082019050919050565b6000613aae603a8361435b565b9150613ab9826148e3565b604082019050919050565b6000613ad1601d8361435b565b9150613adc82614932565b602082019050919050565b6000613af460238361435b565b9150613aff8261495b565b604082019050919050565b6000613b17602c8361435b565b9150613b22826149aa565b604082019050919050565b6000613b3a60108361435b565b9150613b45826149f9565b602082019050919050565b6000613b5d60388361435b565b9150613b6882614a22565b604082019050919050565b6000613b80602a8361435b565b9150613b8b82614a71565b604082019050919050565b6000613ba360298361435b565b9150613bae82614ac0565b604082019050919050565b6000613bc660268361435b565b9150613bd182614b0f565b604082019050919050565b6000613be960208361435b565b9150613bf482614b5e565b602082019050919050565b6000613c0c602c8361435b565b9150613c1782614b87565b604082019050919050565b6000613c2f60208361435b565b9150613c3a82614bd6565b602082019050919050565b6000613c5260218361435b565b9150613c5d82614bff565b604082019050919050565b6000613c7560178361435b565b9150613c8082614c4e565b602082019050919050565b6000613c98600083614350565b9150613ca382614c77565b600082019050919050565b6000613cbb60318361435b565b9150613cc682614c7a565b604082019050919050565b6000613cde602c8361435b565b9150613ce982614cc9565b604082019050919050565b6000613d0160168361435b565b9150613d0c82614d18565b602082019050919050565b60e082016000820151613d2d6000850182613da5565b506020820151613d406020850182613da5565b506040820151613d536040850182613da5565b506060820151613d666060850182613da5565b506080820151613d796080850182613da5565b5060a0820151613d8c60a0850182613da5565b5060c0820151613d9f60c0850182613da5565b50505050565b613dae816144ba565b82525050565b613dbd816144ba565b82525050565b6000613dce82613c8b565b9150819050919050565b6000602082019050613ded6000830184613872565b92915050565b6000608082019050613e086000830187613872565b613e156020830186613872565b613e226040830185613db4565b8181036060830152613e34818461389f565b905095945050505050565b6000604082019050613e546000830185613872565b613e6160208301846138d8565b9392505050565b6000602082019050613e7d6000830184613881565b92915050565b6000602082019050613e986000830184613890565b92915050565b60006020820190508181036000830152613eb881846138e7565b905092915050565b60006020820190508181036000830152613ed981613920565b9050919050565b60006020820190508181036000830152613ef981613943565b9050919050565b60006020820190508181036000830152613f1981613966565b9050919050565b60006020820190508181036000830152613f3981613989565b9050919050565b60006020820190508181036000830152613f59816139ac565b9050919050565b60006020820190508181036000830152613f79816139cf565b9050919050565b60006020820190508181036000830152613f99816139f2565b9050919050565b60006020820190508181036000830152613fb981613a15565b9050919050565b60006020820190508181036000830152613fd981613a38565b9050919050565b60006020820190508181036000830152613ff981613a5b565b9050919050565b6000602082019050818103600083015261401981613a7e565b9050919050565b6000602082019050818103600083015261403981613aa1565b9050919050565b6000602082019050818103600083015261405981613ac4565b9050919050565b6000602082019050818103600083015261407981613ae7565b9050919050565b6000602082019050818103600083015261409981613b0a565b9050919050565b600060208201905081810360008301526140b981613b2d565b9050919050565b600060208201905081810360008301526140d981613b50565b9050919050565b600060208201905081810360008301526140f981613b73565b9050919050565b6000602082019050818103600083015261411981613b96565b9050919050565b6000602082019050818103600083015261413981613bb9565b9050919050565b6000602082019050818103600083015261415981613bdc565b9050919050565b6000602082019050818103600083015261417981613bff565b9050919050565b6000602082019050818103600083015261419981613c22565b9050919050565b600060208201905081810360008301526141b981613c45565b9050919050565b600060208201905081810360008301526141d981613c68565b9050919050565b600060208201905081810360008301526141f981613cae565b9050919050565b6000602082019050818103600083015261421981613cd1565b9050919050565b6000602082019050818103600083015261423981613cf4565b9050919050565b600060e0820190506142556000830184613d17565b92915050565b60006020820190506142706000830184613db4565b92915050565b6000614280614291565b905061428c828261454a565b919050565b6000604051905090565b600067ffffffffffffffff8211156142b6576142b5614622565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156142e2576142e1614622565b5b6142eb82614651565b9050602081019050919050565b600067ffffffffffffffff82111561431357614312614622565b5b61431c82614651565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b6000614377826144ba565b9150614382836144ba565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143b7576143b66145c4565b5b828201905092915050565b60006143cd826144ba565b91506143d8836144ba565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614411576144106145c4565b5b828202905092915050565b6000614427826144ba565b9150614432836144ba565b925082821015614445576144446145c4565b5b828203905092915050565b600061445b8261449a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006144cf826144ba565b9050919050565b82818337600083830152505050565b60005b838110156145035780820151818401526020810190506144e8565b83811115614512576000848401525b50505050565b6000600282049050600182168061453057607f821691505b60208210811415614544576145436145f3565b5b50919050565b61455382614651565b810181811067ffffffffffffffff8211171561457257614571614622565b5b80604052505050565b6000614586826144ba565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145b9576145b86145c4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f414c4552543a204e6f7420456e6f756768205649507300000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f414c4552543a204f6e6c7920564950732063616e206d696e7400000000000000600082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f414c4552543a204d61782035204e4654207065722057616c6c65740000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f414c4552543a204e657720416d6f756e7420626967676572207468616e20352060008201527f4e46540000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f414c4552543a204f6e6c792031207065722057616c6c6574207468652066697260008201527f7374203438680000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f414c4552543a204e6f7420656e6f7567682066756e6473000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416c6572743a206e6f7420656e6f756768205649507300000000000000000000600082015250565b614d4a81614450565b8114614d5557600080fd5b50565b614d6181614462565b8114614d6c57600080fd5b50565b614d788161446e565b8114614d8357600080fd5b50565b614d8f816144ba565b8114614d9a57600080fd5b5056fea26469706673582212209eacf378c451aa745601150cbca7c825cee09e9ed02196a08eaf43afe1df3f3364736f6c6343000804003368747470733a2f2f6869666964616f2e6d7970696e6174612e636c6f75642f697066732f516d6353435067636957754e76766d4a334b7173464b7a65613941556f4e474c6d45787050626542435a7532686a00000000000000000000000000737a7305aa67814e4057e0bb9f346f55780d510000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5000000000000000000000000eb074cc764f20d8fe4317ab63f45a85bce2becb10000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a3

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

00000000000000000000000000737a7305aa67814e4057e0bb9f346f55780d510000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5000000000000000000000000eb074cc764f20d8fe4317ab63f45a85bce2becb10000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a3

-----Decoded View---------------
Arg [0] : vipwallet (address): 0x00737a7305aa67814e4057e0bb9f346f55780d51
Arg [1] : _member (address): 0x8d9232ebc4f06b7b8005ccff0ca401675ceb25f5
Arg [2] : _stake (address): 0xeb074cc764f20d8fe4317ab63f45a85bce2becb1
Arg [3] : _market (address): 0x7a3cdb2364f92369a602cae81167d0679087e6a3

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 00000000000000000000000000737a7305aa67814e4057e0bb9f346f55780d51
Arg [1] : 0000000000000000000000008d9232ebc4f06b7b8005ccff0ca401675ceb25f5
Arg [2] : 000000000000000000000000eb074cc764f20d8fe4317ab63f45a85bce2becb1
Arg [3] : 0000000000000000000000007a3cdb2364f92369a602cae81167d0679087e6a3


Deployed ByteCode Sourcemap

3549:4629:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8006:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2488:98:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3999:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3537:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;7790:107:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4726:330:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5021:262:23;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1291:253:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2732:113:23;;;;;;;;;;;;;:::i;:::-;;2915:62;;;;;;;;;;;;;:::i;:::-;;5122:179:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1876:66:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1798:230:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7903:97:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1098:84:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2191:235:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1929:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:3;;;;;;;;;;;;;:::i;:::-;;2851:58:23;;;;;;;;;;;;;:::i;:::-;;1036:85:3;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2650:102:10;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5492:2181:23;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2055:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4283:153:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2091:128:23;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5367:320:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;724:247:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5289:121:23;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4799:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5416:70;;;;;;;;;;;;;:::i;:::-;;7679:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4925:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4502:162:10;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;499:219:8;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:3;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8006:170:23;8110:4;8133:36;8157:11;8133:23;:36::i;:::-;8126:43;;8006:170;;;:::o;2488:98:10:-;2542:13;2574:5;2567:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2488:98;:::o;3999:217::-;4075:7;4102:16;4110:7;4102;:16::i;:::-;4094:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4185:15;:24;4201:7;4185:24;;;;;;;;;;;;;;;;;;;;;4178:31;;3999:217;;;:::o;3537:401::-;3617:13;3633:23;3648:7;3633:14;:23::i;:::-;3617:39;;3680:5;3674:11;;:2;:11;;;;3666:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3771:5;3755:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3780:37;3797:5;3804:12;:10;:12::i;:::-;3780:16;:37::i;:::-;3755:62;3734:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3910:21;3919:2;3923:7;3910:8;:21::i;:::-;3537:401;;;:::o;7790:107:23:-;7842:7;7868:10;:22;;;7861:29;;7790:107;:::o;4726:330:10:-;4915:41;4934:12;:10;:12::i;:::-;4948:7;4915:18;:41::i;:::-;4907:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5021:28;5031:4;5037:2;5041:7;5021:9;:28::i;:::-;4726:330;;;:::o;5021:262:23:-;5087:7;5106:14;5123:17;5132:7;5123:8;:17::i;:::-;5106:34;;5154:9;5151:126;;;5185:10;:21;;;5178:28;;;;;5151:126;5244:10;:22;;;5237:29;;;5021:262;;;;:::o;1291:253:13:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1511:12;:19;1524:5;1511:19;;;;;;;;;;;;;;;:26;1531:5;1511:26;;;;;;;;;;;;1504:33;;1291:253;;;;:::o;2732:113:23:-;1259:12:3;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2786:52:23::1;2816:21;2794:10;2786:29;;;;:52;;;;:::i;:::-;2732:113::o:0;2915:62::-;1259:12:3;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2960:10:23::1;:8;:10::i;:::-;2915:62::o:0;5122:179:10:-;5255:39;5272:4;5278:2;5282:7;5255:39;;;;;;;;;;;;:16;:39::i;:::-;5122:179;;;:::o;1876:66:23:-;;;;;;;;;;;;;:::o;1798:230:13:-;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:10;2015:5;2004:17;;;;;;;;;;;;;;;;;;;;;;;;1997:24;;1798:230;;;:::o;7903:97:23:-;7953:11;;:::i;:::-;7983:10;7976:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7903:97;:::o;1098:84:4:-;1145:4;1168:7;;;;;;;;;;;1161:14;;1098:84;:::o;2191:235:10:-;2263:7;2282:13;2298:7;:16;2306:7;2298:16;;;;;;;;;;;;;;;;;;;;;2282:32;;2349:1;2332:19;;:5;:19;;;;2324:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:5;2407:12;;;2191:235;;;:::o;1929:205::-;2001:7;2045:1;2028:19;;:5;:19;;;;2020:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2111:9;:16;2121:5;2111:16;;;;;;;;;;;;;;;;2104:23;;1929:205;;;:::o;1668:101:3:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;2851:58:23:-;1259:12:3;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2894:8:23::1;:6;:8::i;:::-;2851:58::o:0;1036:85:3:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2650:102:10:-;2706:13;2738:7;2731:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2650:102;:::o;5492:2181:23:-;5580:16;;5562:15;:34;5559:78;;;5622:4;5612:7;;:14;;;;;;;;;;;;;;;;;;5559:78;5647:23;5673:11;;;;;;;;;;;:24;;;5698:10;5673:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5647:62;;5719:22;5744:9;;;;;;;;;;;:19;;;5764:10;5776:1;5744:34;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5719:59;;5788:24;5833:14;5815:15;:32;;;;:::i;:::-;5788:59;;5884:1;5865:16;:20;5857:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;5926:13;5942:21;5952:10;5942:9;:21::i;:::-;5926:37;;5977:7;;;;;;;;;;;5974:1693;;;6026:7;6008:14;:25;;6000:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;6090:14;6082:5;:22;6074:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;6161:10;:28;;;6153:5;:36;6145:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;6236:16;6263:7;6255:5;:15;;;;:::i;:::-;6236:34;;6304:10;:28;;;6292:8;:40;;6284:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;6406:14;6394:8;:26;;6386:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;6462:13;6488:10;:21;;;6478:7;:31;;;;:::i;:::-;6462:47;;6544:5;6531:9;:18;;6523:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;6592:15;6619:7;6610:6;;:16;;;;:::i;:::-;6592:34;;6640:7;;;;;;;;;;;:16;;:25;6657:7;6640:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6679:13;;;;;;;;;;;:22;;:45;6702:21;6679:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6743:9;6739:230;6762:7;6758:1;:11;6739:230;;;6794:14;6811:19;:9;:17;:19::i;:::-;6794:36;;6848:25;6854:10;6866:6;6848:5;:25::i;:::-;6891:21;:9;:19;:21::i;:::-;6930:10;:22;;;:24;;;;;;;;;:::i;:::-;;;;;;6739:230;6771:3;;;;;:::i;:::-;;;;6739:230;;;;5974:1693;;;;;;7018:1;7007:7;:12;6999:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7092:1;7084:5;:9;7076:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;7150:13;7176:10;:21;;;7166:7;:31;;;;:::i;:::-;7150:47;;7232:5;7219:9;:18;;7211:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;7280:15;7307:7;7298:6;;:16;;;;:::i;:::-;7280:34;;7328:7;;;;;;;;;;;:16;;:25;7345:7;7328:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7367:13;;;;;;;;;;;:22;;:45;7390:21;7367:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7431:9;7427:230;7450:7;7446:1;:11;7427:230;;;7482:14;7499:19;:9;:17;:19::i;:::-;7482:36;;7536:25;7542:10;7554:6;7536:5;:25::i;:::-;7579:21;:9;:19;:21::i;:::-;7618:10;:22;;;:24;;;;;;;;;:::i;:::-;;;;;;7427:230;7459:3;;;;;:::i;:::-;;;;7427:230;;;;5974:1693;;;5492:2181;;;;;:::o;2055:29::-;;;;;;;;;;;;;:::o;4283:153:10:-;4377:52;4396:12;:10;:12::i;:::-;4410:8;4420;4377:18;:52::i;:::-;4283:153;;:::o;2091:128:23:-;2148:4;2178:14;;;;;;;;;;;2171:31;;;2203:8;2171:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2164:48;;2091:128;;;:::o;5367:320:10:-;5536:41;5555:12;:10;:12::i;:::-;5569:7;5536:18;:41::i;:::-;5528:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5641:39;5655:4;5661:2;5665:7;5674:5;5641:13;:39::i;:::-;5367:320;;;;:::o;724:247:8:-;903:6;928:36;;;921:43;;724:247;;;;;;;:::o;5289:121:23:-;5354:7;5380:10;:23;;;5373:30;;5289:121;;;:::o;4799:120::-;4872:13;4904:8;4897:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4799:120;;;:::o;5416:70::-;1259:12:3;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5475:4:23::1;5465:7;;:14;;;;;;;;;;;;;;;;;;5416:70::o:0;7679:105::-;7731:7;7757:10;:20;;;7750:27;;7679:105;:::o;4925:90::-;1259:12:3;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:3:23::1;4994:8;:14;;;;;;;;;;;;:::i;:::-;;4925:90:::0;:::o;4502:162:10:-;4599:4;4622:18;:25;4641:5;4622:25;;;;;;;;;;;;;;;:35;4648:8;4622:35;;;;;;;;;;;;;;;;;;;;;;;;;4615:42;;4502:162;;;;:::o;499:219:8:-;655:6;680:31;;;673:38;;499:219;;;;;;;:::o;1918:198:3:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;387:221:9:-;489:4;527:34;512:49;;;:11;:49;;;;:89;;;;565:36;589:11;565:23;:36::i;:::-;512:89;505:96;;387:221;;;:::o;7159:125:10:-;7224:4;7275:1;7247:30;;:7;:16;7255:7;7247:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7240:37;;7159:125;;;:::o;640:96:17:-;693:7;719:10;712:17;;640:96;:::o;11168:171:10:-;11269:2;11242:15;:24;11258:7;11242:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11324:7;11320:2;11286:46;;11295:23;11310:7;11295:14;:23::i;:::-;11286:46;;;;;;;;;;;;11168:171;;:::o;7442:344::-;7535:4;7559:16;7567:7;7559;:16::i;:::-;7551:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7634:13;7650:23;7665:7;7650:14;:23::i;:::-;7634:39;;7702:5;7691:16;;:7;:16;;;:51;;;;7735:7;7711:31;;:20;7723:7;7711:11;:20::i;:::-;:31;;;7691:51;:87;;;;7746:32;7763:5;7770:7;7746:16;:32::i;:::-;7691:87;7683:96;;;7442:344;;;;:::o;10452:605::-;10606:4;10579:31;;:23;10594:7;10579:14;:23::i;:::-;:31;;;10571:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;10684:1;10670:16;;:2;:16;;;;10662:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10738:39;10759:4;10765:2;10769:7;10738:20;:39::i;:::-;10839:29;10856:1;10860:7;10839:8;:29::i;:::-;10898:1;10879:9;:15;10889:4;10879:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10926:1;10909:9;:13;10919:2;10909:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10956:2;10937:7;:16;10945:7;10937:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10993:7;10989:2;10974:27;;10983:4;10974:27;;;;;;;;;;;;11012:38;11032:4;11038:2;11042:7;11012:19;:38::i;:::-;10452:605;;;:::o;2412:312:16:-;2526:6;2501:21;:31;;2493:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2578:12;2596:9;:14;;2618:6;2596:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2577:52;;;2647:7;2639:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;2412:312;;;:::o;2110:117:4:-;1677:8;:6;:8::i;:::-;1669:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2178:5:::1;2168:7;;:15;;;;;;;;;;;;;;;;;;2198:22;2207:12;:10;:12::i;:::-;2198:22;;;;;;:::i;:::-;;;;;;;;2110:117::o:0;1615:111:13:-;1676:7;1702:10;:17;;;;1695:24;;1615:111;:::o;2270:187:3:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2270:187;;:::o;1863:115:4:-;1412:8;:6;:8::i;:::-;1411:9;1403:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1932:4:::1;1922:7;;:14;;;;;;;;;;;;;;;;;;1951:20;1958:12;:10;:12::i;:::-;1951:20;;;;;;:::i;:::-;;;;;;;;1863:115::o:0;827:112:18:-;892:7;918;:14;;;911:21;;827:112;;;:::o;9078:427:10:-;9171:1;9157:16;;:2;:16;;;;9149:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9229:16;9237:7;9229;:16::i;:::-;9228:17;9220:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9289:45;9318:1;9322:2;9326:7;9289:20;:45::i;:::-;9362:1;9345:9;:13;9355:2;9345:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9392:2;9373:7;:16;9381:7;9373:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9435:7;9431:2;9410:33;;9427:1;9410:33;;;;;;;;;;;;9454:44;9482:1;9486:2;9490:7;9454:19;:44::i;:::-;9078:427;;:::o;945:123:18:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;11474:307:10:-;11624:8;11615:17;;:5;:17;;;;11607:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11710:8;11672:18;:25;11691:5;11672:25;;;;;;;;;;;;;;;:35;11698:8;11672:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11755:8;11733:41;;11748:5;11733:41;;;11765:8;11733:41;;;;;;:::i;:::-;;;;;;;;11474:307;;;:::o;6549:::-;6700:28;6710:4;6716:2;6720:7;6700:9;:28::i;:::-;6746:48;6769:4;6775:2;6779:7;6788:5;6746:22;:48::i;:::-;6738:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6549:307;;;;:::o;2575:151:23:-;2660:4;2683:36;2707:11;2683:23;:36::i;:::-;2676:43;;2575:151;;;:::o;2416:153::-;2517:45;2544:4;2550:2;2554:7;2517:26;:45::i;:::-;2416:153;;;:::o;14162:121:10:-;;;;:::o;12334:778::-;12484:4;12504:15;:2;:13;;;:15::i;:::-;12500:606;;;12555:2;12539:36;;;12576:12;:10;:12::i;:::-;12590:4;12596:7;12605:5;12539:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12535:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12795:1;12778:6;:13;:18;12774:266;;;12820:60;;;;;;;;;;:::i;:::-;;;;;;;;12774:266;12992:6;12986:13;12977:6;12973:2;12969:15;12962:38;12535:519;12671:41;;;12661:51;;;:6;:51;;;;12654:58;;;;;12500:606;13091:4;13084:11;;12334:778;;;;;;;:::o;990:222:13:-;1092:4;1130:35;1115:50;;;:11;:50;;;;:90;;;;1169:36;1193:11;1169:23;:36::i;:::-;1115:90;1108:97;;990:222;;;:::o;2624:572::-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;2839:1;2823:18;;:4;:18;;;2819:183;;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;2918:10;;:4;:10;;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;2914:88;2819:183;3029:1;3015:16;;:2;:16;;;3011:179;;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;3113:10;;:2;:10;;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;:::-;3109:81;3011:179;2624:572;;;:::o;1175:320:16:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;1570:300:10:-;1672:4;1722:25;1707:40;;;:11;:40;;;;:104;;;;1778:33;1763:48;;;:11;:48;;;;1707:104;:156;;;;1827:36;1851:11;1827:23;:36::i;:::-;1707:156;1688:175;;1570:300;;;:::o;13668:122::-;;;;:::o;3902:161:13:-;4005:10;:17;;;;3978:15;:24;3994:7;3978:24;;;;;;;;;;;:44;;;;4032:10;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3902:161;:::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;4942:51;;5003:18;5024:17;:26;5042:7;5024:26;;;;;;;;;;;;5003:47;;5168:14;5154:10;:28;5150:323;;5198:19;5220:12;:18;5233:4;5220:18;;;;;;;;;;;;;;;:34;5239:14;5220:34;;;;;;;;;;;;5198:56;;5302:11;5269:12;:18;5282:4;5269:18;;;;;;;;;;;;;;;:30;5288:10;5269:30;;;;;;;;;;;:44;;;;5418:10;5385:17;:30;5403:11;5385:30;;;;;;;;;;;:43;;;;5150:323;;5566:17;:26;5584:7;5566:26;;;;;;;;;;;5559:33;;;5609:12;:18;5622:4;5609:18;;;;;;;;;;;;;;;:34;5628:14;5609:34;;;;;;;;;;;5602:41;;;4680:970;;;;:::o;5938:1061::-;6187:22;6232:1;6212:10;:17;;;;:21;;;;:::i;:::-;6187:46;;6243:18;6264:15;:24;6280:7;6264:24;;;;;;;;;;;;6243:45;;6610:19;6632:10;6643:14;6632:26;;;;;;;;;;;;;;;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;6804:10;6773:15;:28;6789:11;6773:28;;;;;;;;;;;:41;;;;6942:15;:24;6958:7;6942:24;;;;;;;;;;;6935:31;;;6976:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5938:1061;;;;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;3574:37;;3648:7;3621:12;:16;3634:2;3621:16;;;;;;;;;;;;;;;:24;3638:6;3621:24;;;;;;;;;;;:34;;;;3694:6;3665:17;:26;3683:7;3665:26;;;;;;;;;;;:35;;;;3490:217;;;:::o;829:155:20:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:655:24:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:2;;;414:1;411;404:12;350:2;450:1;435:238;460:6;457:1;454:13;435:238;;;528:3;557:37;590:3;578:10;557:37;:::i;:::-;552:3;545:50;624:4;619:3;615:14;608:21;;658:4;653:3;649:14;642:21;;495:178;482:1;479;475:9;470:14;;435:238;;;439:14;126:553;;;;;;;:::o;685:343::-;762:5;787:65;803:48;844:6;803:48;:::i;:::-;787:65;:::i;:::-;778:74;;875:6;868:5;861:21;913:4;906:5;902:16;951:3;942:6;937:3;933:16;930:25;927:2;;;968:1;965;958:12;927:2;981:41;1015:6;1010:3;1005;981:41;:::i;:::-;768:260;;;;;;:::o;1034:345::-;1112:5;1137:66;1153:49;1195:6;1153:49;:::i;:::-;1137:66;:::i;:::-;1128:75;;1226:6;1219:5;1212:21;1264:4;1257:5;1253:16;1302:3;1293:6;1288:3;1284:16;1281:25;1278:2;;;1319:1;1316;1309:12;1278:2;1332:41;1366:6;1361:3;1356;1332:41;:::i;:::-;1118:261;;;;;;:::o;1385:139::-;1431:5;1469:6;1456:20;1447:29;;1485:33;1512:5;1485:33;:::i;:::-;1437:87;;;;:::o;1547:303::-;1618:5;1667:3;1660:4;1652:6;1648:17;1644:27;1634:2;;1685:1;1682;1675:12;1634:2;1725:6;1712:20;1750:94;1840:3;1832:6;1825:4;1817:6;1813:17;1750:94;:::i;:::-;1741:103;;1624:226;;;;;:::o;1856:133::-;1899:5;1937:6;1924:20;1915:29;;1953:30;1977:5;1953:30;:::i;:::-;1905:84;;;;:::o;1995:137::-;2049:5;2080:6;2074:13;2065:22;;2096:30;2120:5;2096:30;:::i;:::-;2055:77;;;;:::o;2138:137::-;2183:5;2221:6;2208:20;2199:29;;2237:32;2263:5;2237:32;:::i;:::-;2189:86;;;;:::o;2281:141::-;2337:5;2368:6;2362:13;2353:22;;2384:32;2410:5;2384:32;:::i;:::-;2343:79;;;;:::o;2441:271::-;2496:5;2545:3;2538:4;2530:6;2526:17;2522:27;2512:2;;2563:1;2560;2553:12;2512:2;2603:6;2590:20;2628:78;2702:3;2694:6;2687:4;2679:6;2675:17;2628:78;:::i;:::-;2619:87;;2502:210;;;;;:::o;2732:273::-;2788:5;2837:3;2830:4;2822:6;2818:17;2814:27;2804:2;;2855:1;2852;2845:12;2804:2;2895:6;2882:20;2920:79;2995:3;2987:6;2980:4;2972:6;2968:17;2920:79;:::i;:::-;2911:88;;2794:211;;;;;:::o;3011:139::-;3057:5;3095:6;3082:20;3073:29;;3111:33;3138:5;3111:33;:::i;:::-;3063:87;;;;:::o;3156:143::-;3213:5;3244:6;3238:13;3229:22;;3260:33;3287:5;3260:33;:::i;:::-;3219:80;;;;:::o;3305:262::-;3364:6;3413:2;3401:9;3392:7;3388:23;3384:32;3381:2;;;3429:1;3426;3419:12;3381:2;3472:1;3497:53;3542:7;3533:6;3522:9;3518:22;3497:53;:::i;:::-;3487:63;;3443:117;3371:196;;;;:::o;3573:407::-;3641:6;3649;3698:2;3686:9;3677:7;3673:23;3669:32;3666:2;;;3714:1;3711;3704:12;3666:2;3757:1;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3728:117;3884:2;3910:53;3955:7;3946:6;3935:9;3931:22;3910:53;:::i;:::-;3900:63;;3855:118;3656:324;;;;;:::o;3986:1241::-;4140:6;4148;4156;4164;4172;4221:3;4209:9;4200:7;4196:23;4192:33;4189:2;;;4238:1;4235;4228:12;4189:2;4281:1;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4252:117;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:2;;;4627:1;4624;4617:12;4581:2;4655:78;4725:7;4716:6;4705:9;4701:22;4655:78;:::i;:::-;4645:88;;4507:236;4810:2;4799:9;4795:18;4782:32;4841:18;4833:6;4830:30;4827:2;;;4873:1;4870;4863:12;4827:2;4901:78;4971:7;4962:6;4951:9;4947:22;4901:78;:::i;:::-;4891:88;;4753:236;5056:3;5045:9;5041:19;5028:33;5088:18;5080:6;5077:30;5074:2;;;5120:1;5117;5110:12;5074:2;5148:62;5202:7;5193:6;5182:9;5178:22;5148:62;:::i;:::-;5138:72;;4999:221;4179:1048;;;;;;;;:::o;5233:552::-;5310:6;5318;5326;5375:2;5363:9;5354:7;5350:23;5346:32;5343:2;;;5391:1;5388;5381:12;5343:2;5434:1;5459:53;5504:7;5495:6;5484:9;5480:22;5459:53;:::i;:::-;5449:63;;5405:117;5561:2;5587:53;5632:7;5623:6;5612:9;5608:22;5587:53;:::i;:::-;5577:63;;5532:118;5689:2;5715:53;5760:7;5751:6;5740:9;5736:22;5715:53;:::i;:::-;5705:63;;5660:118;5333:452;;;;;:::o;5791:809::-;5886:6;5894;5902;5910;5959:3;5947:9;5938:7;5934:23;5930:33;5927:2;;;5976:1;5973;5966:12;5927:2;6019:1;6044:53;6089:7;6080:6;6069:9;6065:22;6044:53;:::i;:::-;6034:63;;5990:117;6146:2;6172:53;6217:7;6208:6;6197:9;6193:22;6172:53;:::i;:::-;6162:63;;6117:118;6274:2;6300:53;6345:7;6336:6;6325:9;6321:22;6300:53;:::i;:::-;6290:63;;6245:118;6430:2;6419:9;6415:18;6402:32;6461:18;6453:6;6450:30;6447:2;;;6493:1;6490;6483:12;6447:2;6521:62;6575:7;6566:6;6555:9;6551:22;6521:62;:::i;:::-;6511:72;;6373:220;5917:683;;;;;;;:::o;6606:955::-;6710:6;6718;6726;6734;6742;6791:3;6779:9;6770:7;6766:23;6762:33;6759:2;;;6808:1;6805;6798:12;6759:2;6851:1;6876:53;6921:7;6912:6;6901:9;6897:22;6876:53;:::i;:::-;6866:63;;6822:117;6978:2;7004:53;7049:7;7040:6;7029:9;7025:22;7004:53;:::i;:::-;6994:63;;6949:118;7106:2;7132:53;7177:7;7168:6;7157:9;7153:22;7132:53;:::i;:::-;7122:63;;7077:118;7234:2;7260:53;7305:7;7296:6;7285:9;7281:22;7260:53;:::i;:::-;7250:63;;7205:118;7390:3;7379:9;7375:19;7362:33;7422:18;7414:6;7411:30;7408:2;;;7454:1;7451;7444:12;7408:2;7482:62;7536:7;7527:6;7516:9;7512:22;7482:62;:::i;:::-;7472:72;;7333:221;6749:812;;;;;;;;:::o;7567:401::-;7632:6;7640;7689:2;7677:9;7668:7;7664:23;7660:32;7657:2;;;7705:1;7702;7695:12;7657:2;7748:1;7773:53;7818:7;7809:6;7798:9;7794:22;7773:53;:::i;:::-;7763:63;;7719:117;7875:2;7901:50;7943:7;7934:6;7923:9;7919:22;7901:50;:::i;:::-;7891:60;;7846:115;7647:321;;;;;:::o;7974:407::-;8042:6;8050;8099:2;8087:9;8078:7;8074:23;8070:32;8067:2;;;8115:1;8112;8105:12;8067:2;8158:1;8183:53;8228:7;8219:6;8208:9;8204:22;8183:53;:::i;:::-;8173:63;;8129:117;8285:2;8311:53;8356:7;8347:6;8336:9;8332:22;8311:53;:::i;:::-;8301:63;;8256:118;8057:324;;;;;:::o;8387:278::-;8454:6;8503:2;8491:9;8482:7;8478:23;8474:32;8471:2;;;8519:1;8516;8509:12;8471:2;8562:1;8587:61;8640:7;8631:6;8620:9;8616:22;8587:61;:::i;:::-;8577:71;;8533:125;8461:204;;;;:::o;8671:260::-;8729:6;8778:2;8766:9;8757:7;8753:23;8749:32;8746:2;;;8794:1;8791;8784:12;8746:2;8837:1;8862:52;8906:7;8897:6;8886:9;8882:22;8862:52;:::i;:::-;8852:62;;8808:116;8736:195;;;;:::o;8937:282::-;9006:6;9055:2;9043:9;9034:7;9030:23;9026:32;9023:2;;;9071:1;9068;9061:12;9023:2;9114:1;9139:63;9194:7;9185:6;9174:9;9170:22;9139:63;:::i;:::-;9129:73;;9085:127;9013:206;;;;:::o;9225:375::-;9294:6;9343:2;9331:9;9322:7;9318:23;9314:32;9311:2;;;9359:1;9356;9349:12;9311:2;9430:1;9419:9;9415:17;9402:31;9460:18;9452:6;9449:30;9446:2;;;9492:1;9489;9482:12;9446:2;9520:63;9575:7;9566:6;9555:9;9551:22;9520:63;:::i;:::-;9510:73;;9373:220;9301:299;;;;:::o;9606:262::-;9665:6;9714:2;9702:9;9693:7;9689:23;9685:32;9682:2;;;9730:1;9727;9720:12;9682:2;9773:1;9798:53;9843:7;9834:6;9823:9;9819:22;9798:53;:::i;:::-;9788:63;;9744:117;9672:196;;;;:::o;9874:284::-;9944:6;9993:2;9981:9;9972:7;9968:23;9964:32;9961:2;;;10009:1;10006;9999:12;9961:2;10052:1;10077:64;10133:7;10124:6;10113:9;10109:22;10077:64;:::i;:::-;10067:74;;10023:128;9951:207;;;;:::o;10164:118::-;10251:24;10269:5;10251:24;:::i;:::-;10246:3;10239:37;10229:53;;:::o;10288:109::-;10369:21;10384:5;10369:21;:::i;:::-;10364:3;10357:34;10347:50;;:::o;10403:115::-;10488:23;10505:5;10488:23;:::i;:::-;10483:3;10476:36;10466:52;;:::o;10524:360::-;10610:3;10638:38;10670:5;10638:38;:::i;:::-;10692:70;10755:6;10750:3;10692:70;:::i;:::-;10685:77;;10771:52;10816:6;10811:3;10804:4;10797:5;10793:16;10771:52;:::i;:::-;10848:29;10870:6;10848:29;:::i;:::-;10843:3;10839:39;10832:46;;10614:270;;;;;:::o;10890:147::-;10985:45;11024:5;10985:45;:::i;:::-;10980:3;10973:58;10963:74;;:::o;11043:364::-;11131:3;11159:39;11192:5;11159:39;:::i;:::-;11214:71;11278:6;11273:3;11214:71;:::i;:::-;11207:78;;11294:52;11339:6;11334:3;11327:4;11320:5;11316:16;11294:52;:::i;:::-;11371:29;11393:6;11371:29;:::i;:::-;11366:3;11362:39;11355:46;;11135:272;;;;;:::o;11413:366::-;11555:3;11576:67;11640:2;11635:3;11576:67;:::i;:::-;11569:74;;11652:93;11741:3;11652:93;:::i;:::-;11770:2;11765:3;11761:12;11754:19;;11559:220;;;:::o;11785:366::-;11927:3;11948:67;12012:2;12007:3;11948:67;:::i;:::-;11941:74;;12024:93;12113:3;12024:93;:::i;:::-;12142:2;12137:3;12133:12;12126:19;;11931:220;;;:::o;12157:366::-;12299:3;12320:67;12384:2;12379:3;12320:67;:::i;:::-;12313:74;;12396:93;12485:3;12396:93;:::i;:::-;12514:2;12509:3;12505:12;12498:19;;12303:220;;;:::o;12529:366::-;12671:3;12692:67;12756:2;12751:3;12692:67;:::i;:::-;12685:74;;12768:93;12857:3;12768:93;:::i;:::-;12886:2;12881:3;12877:12;12870:19;;12675:220;;;:::o;12901:366::-;13043:3;13064:67;13128:2;13123:3;13064:67;:::i;:::-;13057:74;;13140:93;13229:3;13140:93;:::i;:::-;13258:2;13253:3;13249:12;13242:19;;13047:220;;;:::o;13273:366::-;13415:3;13436:67;13500:2;13495:3;13436:67;:::i;:::-;13429:74;;13512:93;13601:3;13512:93;:::i;:::-;13630:2;13625:3;13621:12;13614:19;;13419:220;;;:::o;13645:366::-;13787:3;13808:67;13872:2;13867:3;13808:67;:::i;:::-;13801:74;;13884:93;13973:3;13884:93;:::i;:::-;14002:2;13997:3;13993:12;13986:19;;13791:220;;;:::o;14017:366::-;14159:3;14180:67;14244:2;14239:3;14180:67;:::i;:::-;14173:74;;14256:93;14345:3;14256:93;:::i;:::-;14374:2;14369:3;14365:12;14358:19;;14163:220;;;:::o;14389:366::-;14531:3;14552:67;14616:2;14611:3;14552:67;:::i;:::-;14545:74;;14628:93;14717:3;14628:93;:::i;:::-;14746:2;14741:3;14737:12;14730:19;;14535:220;;;:::o;14761:366::-;14903:3;14924:67;14988:2;14983:3;14924:67;:::i;:::-;14917:74;;15000:93;15089:3;15000:93;:::i;:::-;15118:2;15113:3;15109:12;15102:19;;14907:220;;;:::o;15133:366::-;15275:3;15296:67;15360:2;15355:3;15296:67;:::i;:::-;15289:74;;15372:93;15461:3;15372:93;:::i;:::-;15490:2;15485:3;15481:12;15474:19;;15279:220;;;:::o;15505:366::-;15647:3;15668:67;15732:2;15727:3;15668:67;:::i;:::-;15661:74;;15744:93;15833:3;15744:93;:::i;:::-;15862:2;15857:3;15853:12;15846:19;;15651:220;;;:::o;15877:366::-;16019:3;16040:67;16104:2;16099:3;16040:67;:::i;:::-;16033:74;;16116:93;16205:3;16116:93;:::i;:::-;16234:2;16229:3;16225:12;16218:19;;16023:220;;;:::o;16249:366::-;16391:3;16412:67;16476:2;16471:3;16412:67;:::i;:::-;16405:74;;16488:93;16577:3;16488:93;:::i;:::-;16606:2;16601:3;16597:12;16590:19;;16395:220;;;:::o;16621:366::-;16763:3;16784:67;16848:2;16843:3;16784:67;:::i;:::-;16777:74;;16860:93;16949:3;16860:93;:::i;:::-;16978:2;16973:3;16969:12;16962:19;;16767:220;;;:::o;16993:366::-;17135:3;17156:67;17220:2;17215:3;17156:67;:::i;:::-;17149:74;;17232:93;17321:3;17232:93;:::i;:::-;17350:2;17345:3;17341:12;17334:19;;17139:220;;;:::o;17365:366::-;17507:3;17528:67;17592:2;17587:3;17528:67;:::i;:::-;17521:74;;17604:93;17693:3;17604:93;:::i;:::-;17722:2;17717:3;17713:12;17706:19;;17511:220;;;:::o;17737:366::-;17879:3;17900:67;17964:2;17959:3;17900:67;:::i;:::-;17893:74;;17976:93;18065:3;17976:93;:::i;:::-;18094:2;18089:3;18085:12;18078:19;;17883:220;;;:::o;18109:366::-;18251:3;18272:67;18336:2;18331:3;18272:67;:::i;:::-;18265:74;;18348:93;18437:3;18348:93;:::i;:::-;18466:2;18461:3;18457:12;18450:19;;18255:220;;;:::o;18481:366::-;18623:3;18644:67;18708:2;18703:3;18644:67;:::i;:::-;18637:74;;18720:93;18809:3;18720:93;:::i;:::-;18838:2;18833:3;18829:12;18822:19;;18627:220;;;:::o;18853:366::-;18995:3;19016:67;19080:2;19075:3;19016:67;:::i;:::-;19009:74;;19092:93;19181:3;19092:93;:::i;:::-;19210:2;19205:3;19201:12;19194:19;;18999:220;;;:::o;19225:366::-;19367:3;19388:67;19452:2;19447:3;19388:67;:::i;:::-;19381:74;;19464:93;19553:3;19464:93;:::i;:::-;19582:2;19577:3;19573:12;19566:19;;19371:220;;;:::o;19597:366::-;19739:3;19760:67;19824:2;19819:3;19760:67;:::i;:::-;19753:74;;19836:93;19925:3;19836:93;:::i;:::-;19954:2;19949:3;19945:12;19938:19;;19743:220;;;:::o;19969:366::-;20111:3;20132:67;20196:2;20191:3;20132:67;:::i;:::-;20125:74;;20208:93;20297:3;20208:93;:::i;:::-;20326:2;20321:3;20317:12;20310:19;;20115:220;;;:::o;20341:366::-;20483:3;20504:67;20568:2;20563:3;20504:67;:::i;:::-;20497:74;;20580:93;20669:3;20580:93;:::i;:::-;20698:2;20693:3;20689:12;20682:19;;20487:220;;;:::o;20713:398::-;20872:3;20893:83;20974:1;20969:3;20893:83;:::i;:::-;20886:90;;20985:93;21074:3;20985:93;:::i;:::-;21103:1;21098:3;21094:11;21087:18;;20876:235;;;:::o;21117:366::-;21259:3;21280:67;21344:2;21339:3;21280:67;:::i;:::-;21273:74;;21356:93;21445:3;21356:93;:::i;:::-;21474:2;21469:3;21465:12;21458:19;;21263:220;;;:::o;21489:366::-;21631:3;21652:67;21716:2;21711:3;21652:67;:::i;:::-;21645:74;;21728:93;21817:3;21728:93;:::i;:::-;21846:2;21841:3;21837:12;21830:19;;21635:220;;;:::o;21861:366::-;22003:3;22024:67;22088:2;22083:3;22024:67;:::i;:::-;22017:74;;22100:93;22189:3;22100:93;:::i;:::-;22218:2;22213:3;22209:12;22202:19;;22007:220;;;:::o;22279:1426::-;22420:4;22415:3;22411:14;22514:4;22507:5;22503:16;22497:23;22533:63;22590:4;22585:3;22581:14;22567:12;22533:63;:::i;:::-;22435:171;22694:4;22687:5;22683:16;22677:23;22713:63;22770:4;22765:3;22761:14;22747:12;22713:63;:::i;:::-;22616:170;22877:4;22870:5;22866:16;22860:23;22896:63;22953:4;22948:3;22944:14;22930:12;22896:63;:::i;:::-;22796:173;23056:4;23049:5;23045:16;23039:23;23075:63;23132:4;23127:3;23123:14;23109:12;23075:63;:::i;:::-;22979:169;23237:4;23230:5;23226:16;23220:23;23256:63;23313:4;23308:3;23304:14;23290:12;23256:63;:::i;:::-;23158:171;23424:4;23417:5;23413:16;23407:23;23443:63;23500:4;23495:3;23491:14;23477:12;23443:63;:::i;:::-;23339:177;23606:4;23599:5;23595:16;23589:23;23625:63;23682:4;23677:3;23673:14;23659:12;23625:63;:::i;:::-;23526:172;22389:1316;;;:::o;23711:108::-;23788:24;23806:5;23788:24;:::i;:::-;23783:3;23776:37;23766:53;;:::o;23825:118::-;23912:24;23930:5;23912:24;:::i;:::-;23907:3;23900:37;23890:53;;:::o;23949:379::-;24133:3;24155:147;24298:3;24155:147;:::i;:::-;24148:154;;24319:3;24312:10;;24137:191;;;:::o;24334:222::-;24427:4;24465:2;24454:9;24450:18;24442:26;;24478:71;24546:1;24535:9;24531:17;24522:6;24478:71;:::i;:::-;24432:124;;;;:::o;24562:640::-;24757:4;24795:3;24784:9;24780:19;24772:27;;24809:71;24877:1;24866:9;24862:17;24853:6;24809:71;:::i;:::-;24890:72;24958:2;24947:9;24943:18;24934:6;24890:72;:::i;:::-;24972;25040:2;25029:9;25025:18;25016:6;24972:72;:::i;:::-;25091:9;25085:4;25081:20;25076:2;25065:9;25061:18;25054:48;25119:76;25190:4;25181:6;25119:76;:::i;:::-;25111:84;;24762:440;;;;;;;:::o;25208:348::-;25337:4;25375:2;25364:9;25360:18;25352:26;;25388:71;25456:1;25445:9;25441:17;25432:6;25388:71;:::i;:::-;25469:80;25545:2;25534:9;25530:18;25521:6;25469:80;:::i;:::-;25342:214;;;;;:::o;25562:210::-;25649:4;25687:2;25676:9;25672:18;25664:26;;25700:65;25762:1;25751:9;25747:17;25738:6;25700:65;:::i;:::-;25654:118;;;;:::o;25778:218::-;25869:4;25907:2;25896:9;25892:18;25884:26;;25920:69;25986:1;25975:9;25971:17;25962:6;25920:69;:::i;:::-;25874:122;;;;:::o;26002:313::-;26115:4;26153:2;26142:9;26138:18;26130:26;;26202:9;26196:4;26192:20;26188:1;26177:9;26173:17;26166:47;26230:78;26303:4;26294:6;26230:78;:::i;:::-;26222:86;;26120:195;;;;:::o;26321:419::-;26487:4;26525:2;26514:9;26510:18;26502:26;;26574:9;26568:4;26564:20;26560:1;26549:9;26545:17;26538:47;26602:131;26728:4;26602:131;:::i;:::-;26594:139;;26492:248;;;:::o;26746:419::-;26912:4;26950:2;26939:9;26935:18;26927:26;;26999:9;26993:4;26989:20;26985:1;26974:9;26970:17;26963:47;27027:131;27153:4;27027:131;:::i;:::-;27019:139;;26917:248;;;:::o;27171:419::-;27337:4;27375:2;27364:9;27360:18;27352:26;;27424:9;27418:4;27414:20;27410:1;27399:9;27395:17;27388:47;27452:131;27578:4;27452:131;:::i;:::-;27444:139;;27342:248;;;:::o;27596:419::-;27762:4;27800:2;27789:9;27785:18;27777:26;;27849:9;27843:4;27839:20;27835:1;27824:9;27820:17;27813:47;27877:131;28003:4;27877:131;:::i;:::-;27869:139;;27767:248;;;:::o;28021:419::-;28187:4;28225:2;28214:9;28210:18;28202:26;;28274:9;28268:4;28264:20;28260:1;28249:9;28245:17;28238:47;28302:131;28428:4;28302:131;:::i;:::-;28294:139;;28192:248;;;:::o;28446:419::-;28612:4;28650:2;28639:9;28635:18;28627:26;;28699:9;28693:4;28689:20;28685:1;28674:9;28670:17;28663:47;28727:131;28853:4;28727:131;:::i;:::-;28719:139;;28617:248;;;:::o;28871:419::-;29037:4;29075:2;29064:9;29060:18;29052:26;;29124:9;29118:4;29114:20;29110:1;29099:9;29095:17;29088:47;29152:131;29278:4;29152:131;:::i;:::-;29144:139;;29042:248;;;:::o;29296:419::-;29462:4;29500:2;29489:9;29485:18;29477:26;;29549:9;29543:4;29539:20;29535:1;29524:9;29520:17;29513:47;29577:131;29703:4;29577:131;:::i;:::-;29569:139;;29467:248;;;:::o;29721:419::-;29887:4;29925:2;29914:9;29910:18;29902:26;;29974:9;29968:4;29964:20;29960:1;29949:9;29945:17;29938:47;30002:131;30128:4;30002:131;:::i;:::-;29994:139;;29892:248;;;:::o;30146:419::-;30312:4;30350:2;30339:9;30335:18;30327:26;;30399:9;30393:4;30389:20;30385:1;30374:9;30370:17;30363:47;30427:131;30553:4;30427:131;:::i;:::-;30419:139;;30317:248;;;:::o;30571:419::-;30737:4;30775:2;30764:9;30760:18;30752:26;;30824:9;30818:4;30814:20;30810:1;30799:9;30795:17;30788:47;30852:131;30978:4;30852:131;:::i;:::-;30844:139;;30742:248;;;:::o;30996:419::-;31162:4;31200:2;31189:9;31185:18;31177:26;;31249:9;31243:4;31239:20;31235:1;31224:9;31220:17;31213:47;31277:131;31403:4;31277:131;:::i;:::-;31269:139;;31167:248;;;:::o;31421:419::-;31587:4;31625:2;31614:9;31610:18;31602:26;;31674:9;31668:4;31664:20;31660:1;31649:9;31645:17;31638:47;31702:131;31828:4;31702:131;:::i;:::-;31694:139;;31592:248;;;:::o;31846:419::-;32012:4;32050:2;32039:9;32035:18;32027:26;;32099:9;32093:4;32089:20;32085:1;32074:9;32070:17;32063:47;32127:131;32253:4;32127:131;:::i;:::-;32119:139;;32017:248;;;:::o;32271:419::-;32437:4;32475:2;32464:9;32460:18;32452:26;;32524:9;32518:4;32514:20;32510:1;32499:9;32495:17;32488:47;32552:131;32678:4;32552:131;:::i;:::-;32544:139;;32442:248;;;:::o;32696:419::-;32862:4;32900:2;32889:9;32885:18;32877:26;;32949:9;32943:4;32939:20;32935:1;32924:9;32920:17;32913:47;32977:131;33103:4;32977:131;:::i;:::-;32969:139;;32867:248;;;:::o;33121:419::-;33287:4;33325:2;33314:9;33310:18;33302:26;;33374:9;33368:4;33364:20;33360:1;33349:9;33345:17;33338:47;33402:131;33528:4;33402:131;:::i;:::-;33394:139;;33292:248;;;:::o;33546:419::-;33712:4;33750:2;33739:9;33735:18;33727:26;;33799:9;33793:4;33789:20;33785:1;33774:9;33770:17;33763:47;33827:131;33953:4;33827:131;:::i;:::-;33819:139;;33717:248;;;:::o;33971:419::-;34137:4;34175:2;34164:9;34160:18;34152:26;;34224:9;34218:4;34214:20;34210:1;34199:9;34195:17;34188:47;34252:131;34378:4;34252:131;:::i;:::-;34244:139;;34142:248;;;:::o;34396:419::-;34562:4;34600:2;34589:9;34585:18;34577:26;;34649:9;34643:4;34639:20;34635:1;34624:9;34620:17;34613:47;34677:131;34803:4;34677:131;:::i;:::-;34669:139;;34567:248;;;:::o;34821:419::-;34987:4;35025:2;35014:9;35010:18;35002:26;;35074:9;35068:4;35064:20;35060:1;35049:9;35045:17;35038:47;35102:131;35228:4;35102:131;:::i;:::-;35094:139;;34992:248;;;:::o;35246:419::-;35412:4;35450:2;35439:9;35435:18;35427:26;;35499:9;35493:4;35489:20;35485:1;35474:9;35470:17;35463:47;35527:131;35653:4;35527:131;:::i;:::-;35519:139;;35417:248;;;:::o;35671:419::-;35837:4;35875:2;35864:9;35860:18;35852:26;;35924:9;35918:4;35914:20;35910:1;35899:9;35895:17;35888:47;35952:131;36078:4;35952:131;:::i;:::-;35944:139;;35842:248;;;:::o;36096:419::-;36262:4;36300:2;36289:9;36285:18;36277:26;;36349:9;36343:4;36339:20;36335:1;36324:9;36320:17;36313:47;36377:131;36503:4;36377:131;:::i;:::-;36369:139;;36267:248;;;:::o;36521:419::-;36687:4;36725:2;36714:9;36710:18;36702:26;;36774:9;36768:4;36764:20;36760:1;36749:9;36745:17;36738:47;36802:131;36928:4;36802:131;:::i;:::-;36794:139;;36692:248;;;:::o;36946:419::-;37112:4;37150:2;37139:9;37135:18;37127:26;;37199:9;37193:4;37189:20;37185:1;37174:9;37170:17;37163:47;37227:131;37353:4;37227:131;:::i;:::-;37219:139;;37117:248;;;:::o;37371:419::-;37537:4;37575:2;37564:9;37560:18;37552:26;;37624:9;37618:4;37614:20;37610:1;37599:9;37595:17;37588:47;37652:131;37778:4;37652:131;:::i;:::-;37644:139;;37542:248;;;:::o;37796:419::-;37962:4;38000:2;37989:9;37985:18;37977:26;;38049:9;38043:4;38039:20;38035:1;38024:9;38020:17;38013:47;38077:131;38203:4;38077:131;:::i;:::-;38069:139;;37967:248;;;:::o;38221:311::-;38358:4;38396:3;38385:9;38381:19;38373:27;;38410:115;38522:1;38511:9;38507:17;38498:6;38410:115;:::i;:::-;38363:169;;;;:::o;38538:222::-;38631:4;38669:2;38658:9;38654:18;38646:26;;38682:71;38750:1;38739:9;38735:17;38726:6;38682:71;:::i;:::-;38636:124;;;;:::o;38766:129::-;38800:6;38827:20;;:::i;:::-;38817:30;;38856:33;38884:4;38876:6;38856:33;:::i;:::-;38807:88;;;:::o;38901:75::-;38934:6;38967:2;38961:9;38951:19;;38941:35;:::o;38982:311::-;39059:4;39149:18;39141:6;39138:30;39135:2;;;39171:18;;:::i;:::-;39135:2;39221:4;39213:6;39209:17;39201:25;;39281:4;39275;39271:15;39263:23;;39064:229;;;:::o;39299:307::-;39360:4;39450:18;39442:6;39439:30;39436:2;;;39472:18;;:::i;:::-;39436:2;39510:29;39532:6;39510:29;:::i;:::-;39502:37;;39594:4;39588;39584:15;39576:23;;39365:241;;;:::o;39612:308::-;39674:4;39764:18;39756:6;39753:30;39750:2;;;39786:18;;:::i;:::-;39750:2;39824:29;39846:6;39824:29;:::i;:::-;39816:37;;39908:4;39902;39898:15;39890:23;;39679:241;;;:::o;39926:98::-;39977:6;40011:5;40005:12;39995:22;;39984:40;;;:::o;40030:99::-;40082:6;40116:5;40110:12;40100:22;;40089:40;;;:::o;40135:168::-;40218:11;40252:6;40247:3;40240:19;40292:4;40287:3;40283:14;40268:29;;40230:73;;;;:::o;40309:147::-;40410:11;40447:3;40432:18;;40422:34;;;;:::o;40462:169::-;40546:11;40580:6;40575:3;40568:19;40620:4;40615:3;40611:14;40596:29;;40558:73;;;;:::o;40637:305::-;40677:3;40696:20;40714:1;40696:20;:::i;:::-;40691:25;;40730:20;40748:1;40730:20;:::i;:::-;40725:25;;40884:1;40816:66;40812:74;40809:1;40806:81;40803:2;;;40890:18;;:::i;:::-;40803:2;40934:1;40931;40927:9;40920:16;;40681:261;;;;:::o;40948:348::-;40988:7;41011:20;41029:1;41011:20;:::i;:::-;41006:25;;41045:20;41063:1;41045:20;:::i;:::-;41040:25;;41233:1;41165:66;41161:74;41158:1;41155:81;41150:1;41143:9;41136:17;41132:105;41129:2;;;41240:18;;:::i;:::-;41129:2;41288:1;41285;41281:9;41270:20;;40996:300;;;;:::o;41302:191::-;41342:4;41362:20;41380:1;41362:20;:::i;:::-;41357:25;;41396:20;41414:1;41396:20;:::i;:::-;41391:25;;41435:1;41432;41429:8;41426:2;;;41440:18;;:::i;:::-;41426:2;41485:1;41482;41478:9;41470:17;;41347:146;;;;:::o;41499:96::-;41536:7;41565:24;41583:5;41565:24;:::i;:::-;41554:35;;41544:51;;;:::o;41601:90::-;41635:7;41678:5;41671:13;41664:21;41653:32;;41643:48;;;:::o;41697:149::-;41733:7;41773:66;41766:5;41762:78;41751:89;;41741:105;;;:::o;41852:126::-;41889:7;41929:42;41922:5;41918:54;41907:65;;41897:81;;;:::o;41984:77::-;42021:7;42050:5;42039:16;;42029:32;;;:::o;42067:121::-;42125:9;42158:24;42176:5;42158:24;:::i;:::-;42145:37;;42135:53;;;:::o;42194:154::-;42278:6;42273:3;42268;42255:30;42340:1;42331:6;42326:3;42322:16;42315:27;42245:103;;;:::o;42354:307::-;42422:1;42432:113;42446:6;42443:1;42440:13;42432:113;;;42531:1;42526:3;42522:11;42516:18;42512:1;42507:3;42503:11;42496:39;42468:2;42465:1;42461:10;42456:15;;42432:113;;;42563:6;42560:1;42557:13;42554:2;;;42643:1;42634:6;42629:3;42625:16;42618:27;42554:2;42403:258;;;;:::o;42667:320::-;42711:6;42748:1;42742:4;42738:12;42728:22;;42795:1;42789:4;42785:12;42816:18;42806:2;;42872:4;42864:6;42860:17;42850:27;;42806:2;42934;42926:6;42923:14;42903:18;42900:38;42897:2;;;42953:18;;:::i;:::-;42897:2;42718:269;;;;:::o;42993:281::-;43076:27;43098:4;43076:27;:::i;:::-;43068:6;43064:40;43206:6;43194:10;43191:22;43170:18;43158:10;43155:34;43152:62;43149:2;;;43217:18;;:::i;:::-;43149:2;43257:10;43253:2;43246:22;43036:238;;;:::o;43280:233::-;43319:3;43342:24;43360:5;43342:24;:::i;:::-;43333:33;;43388:66;43381:5;43378:77;43375:2;;;43458:18;;:::i;:::-;43375:2;43505:1;43498:5;43494:13;43487:20;;43323:190;;;:::o;43519:180::-;43567:77;43564:1;43557:88;43664:4;43661:1;43654:15;43688:4;43685:1;43678:15;43705:180;43753:77;43750:1;43743:88;43850:4;43847:1;43840:15;43874:4;43871:1;43864:15;43891:180;43939:77;43936:1;43929:88;44036:4;44033:1;44026:15;44060:4;44057:1;44050:15;44077:102;44118:6;44169:2;44165:7;44160:2;44153:5;44149:14;44145:28;44135:38;;44125:54;;;:::o;44185:170::-;44325:22;44321:1;44313:6;44309:14;44302:46;44291:64;:::o;44361:172::-;44501:24;44497:1;44489:6;44485:14;44478:48;44467:66;:::o;44539:230::-;44679:34;44675:1;44667:6;44663:14;44656:58;44748:13;44743:2;44735:6;44731:15;44724:38;44645:124;:::o;44775:237::-;44915:34;44911:1;44903:6;44899:14;44892:58;44984:20;44979:2;44971:6;44967:15;44960:45;44881:131;:::o;45018:225::-;45158:34;45154:1;45146:6;45142:14;45135:58;45227:8;45222:2;45214:6;45210:15;45203:33;45124:119;:::o;45249:175::-;45389:27;45385:1;45377:6;45373:14;45366:51;45355:69;:::o;45430:224::-;45570:34;45566:1;45558:6;45554:14;45547:58;45639:7;45634:2;45626:6;45622:15;45615:32;45536:118;:::o;45660:178::-;45800:30;45796:1;45788:6;45784:14;45777:54;45766:72;:::o;45844:177::-;45984:29;45980:1;45972:6;45968:14;45961:53;45950:71;:::o;46027:223::-;46167:34;46163:1;46155:6;46151:14;46144:58;46236:6;46231:2;46223:6;46219:15;46212:31;46133:117;:::o;46256:175::-;46396:27;46392:1;46384:6;46380:14;46373:51;46362:69;:::o;46437:245::-;46577:34;46573:1;46565:6;46561:14;46554:58;46646:28;46641:2;46633:6;46629:15;46622:53;46543:139;:::o;46688:179::-;46828:31;46824:1;46816:6;46812:14;46805:55;46794:73;:::o;46873:222::-;47013:34;47009:1;47001:6;46997:14;46990:58;47082:5;47077:2;47069:6;47065:15;47058:30;46979:116;:::o;47101:231::-;47241:34;47237:1;47229:6;47225:14;47218:58;47310:14;47305:2;47297:6;47293:15;47286:39;47207:125;:::o;47338:166::-;47478:18;47474:1;47466:6;47462:14;47455:42;47444:60;:::o;47510:243::-;47650:34;47646:1;47638:6;47634:14;47627:58;47719:26;47714:2;47706:6;47702:15;47695:51;47616:137;:::o;47759:229::-;47899:34;47895:1;47887:6;47883:14;47876:58;47968:12;47963:2;47955:6;47951:15;47944:37;47865:123;:::o;47994:228::-;48134:34;48130:1;48122:6;48118:14;48111:58;48203:11;48198:2;48190:6;48186:15;48179:36;48100:122;:::o;48228:225::-;48368:34;48364:1;48356:6;48352:14;48345:58;48437:8;48432:2;48424:6;48420:15;48413:33;48334:119;:::o;48459:182::-;48599:34;48595:1;48587:6;48583:14;48576:58;48565:76;:::o;48647:231::-;48787:34;48783:1;48775:6;48771:14;48764:58;48856:14;48851:2;48843:6;48839:15;48832:39;48753:125;:::o;48884:182::-;49024:34;49020:1;49012:6;49008:14;49001:58;48990:76;:::o;49072:220::-;49212:34;49208:1;49200:6;49196:14;49189:58;49281:3;49276:2;49268:6;49264:15;49257:28;49178:114;:::o;49298:173::-;49438:25;49434:1;49426:6;49422:14;49415:49;49404:67;:::o;49477:114::-;49583:8;:::o;49597:236::-;49737:34;49733:1;49725:6;49721:14;49714:58;49806:19;49801:2;49793:6;49789:15;49782:44;49703:130;:::o;49839:231::-;49979:34;49975:1;49967:6;49963:14;49956:58;50048:14;50043:2;50035:6;50031:15;50024:39;49945:125;:::o;50076:172::-;50216:24;50212:1;50204:6;50200:14;50193:48;50182:66;:::o;50254:122::-;50327:24;50345:5;50327:24;:::i;:::-;50320:5;50317:35;50307:2;;50366:1;50363;50356:12;50307:2;50297:79;:::o;50382:116::-;50452:21;50467:5;50452:21;:::i;:::-;50445:5;50442:32;50432:2;;50488:1;50485;50478:12;50432:2;50422:76;:::o;50504:120::-;50576:23;50593:5;50576:23;:::i;:::-;50569:5;50566:34;50556:2;;50614:1;50611;50604:12;50556:2;50546:78;:::o;50630:122::-;50703:24;50721:5;50703:24;:::i;:::-;50696:5;50693:35;50683:2;;50742:1;50739;50732:12;50683:2;50673:79;:::o

Swarm Source

ipfs://9eacf378c451aa745601150cbca7c825cee09e9ed02196a08eaf43afe1df3f33
Loading