ETH Price: $3,351.87 (-0.83%)

Token

Genetic Chain Member Lounge (GCML)
 

Overview

Max Total Supply

0 GCML

Holders

954

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x5e72cf497b6eb681a45abc37f05abec894f02df3
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Genetic Chain Member Lounge NFTs are reward/utilities released to staked GC pass holders. 1336 Passes Staked | March 23rd, 2022 Genetic Chain Passes: [Geneticists Pass](https://opensea.io/collection/genetic-chain-geneticists-pass) [Chain Gang Pass](https://opensea.io/colle...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MemberLounge

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1000 runs

Other Settings:
default evmVersion
File 1 of 12 : MemberLounge.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

//-----------------------------------------------------------------------------
// geneticchain.io - NextGen Generative NFT Platform
//-----------------------------------------------------------------------------
 /*\_____________________________________________________________   .¿yy¿.   __
 MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM```````/MMM\\\\\  \\$$$$$$S/  .
 MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM``   `/  yyyy    ` _____J$$$^^^^/%#//
 MMMMMMMMMMMMMMMMMMMYYYMMM````      `\/  .¿yü  /  $ùpüüü%%% | ``|//|` __
 MMMMMYYYYMMMMMMM/`     `| ___.¿yüy¿.  .d$$$$  /  $$$$SSSSM |   | ||  MMNNNNNNM
 M/``      ``\/`  .¿ù%%/.  |.d$$$$$$$b.$$$*°^  /  o$$$  __  |   | ||  MMMMMMMMM
 M   .¿yy¿.     .dX$$$$$$7.|$$$$"^"$$$$$$o`  /MM  o$$$  MM  |   | ||  MMYYYYYYM
   \\$$$$$$S/  .S$$o"^"4$$$$$$$` _ `SSSSS\        ____  MM  |___|_||  MM  ____
  J$$$^^^^/%#//oSSS`    YSSSSSS  /  pyyyüüü%%%XXXÙ$$$$  MM  pyyyyyyy, `` ,$$$o
 .$$$` ___     pyyyyyyyyyyyy//+  /  $$$$$$SSSSSSSÙM$$$. `` .S&&T$T$$$byyd$$$$\
 \$$7  ``     //o$$SSXMMSSSS  |  /  $$/&&X  _  ___ %$$$byyd$$$X\$`/S$$$$$$$S\
 o$$l   .\\YS$$X>$X  _  ___|  |  /  $$/%$$b.,.d$$$\`7$$$$$$$$7`.$   `"***"`  __
 o$$l  __  7$$$X>$$b.,.d$$$\  |  /  $$.`7$$$$$$$$%`  `*+SX+*|_\\$  /.     ..\MM
 o$$L  MM  !$$$$\$$$$$$$$$%|__|  /  $$// `*+XX*\'`  `____           ` `/MMMMMMM
 /$$X, `` ,S$$$$\ `*+XX*\'`____  /  %SXX .      .,   NERV   ___.¿yüy¿.   /MMMMM
  7$$$byyd$$$>$X\  .,,_    $$$$  `    ___ .y%%ü¿.  _______  $.d$$$$$$$S.  `MMMM
  `/S$$$$$$$\\$J`.\\$$$ :  $\`.¿yüy¿. `\\  $$$$$$S.//XXSSo  $$$$$"^"$$$$.  /MMM
 y   `"**"`"Xo$7J$$$$$\    $.d$$$$$$$b.    ^``/$$$$.`$$$$o  $$$$\ _ 'SSSo  /MMM
 M/.__   .,\Y$$$\\$$O` _/  $d$$$*°\ pyyyüüü%%%W $$$o.$$$$/  S$$$. `  S$To   MMM
 MMMM`  \$P*$$X+ b$$l  MM  $$$$` _  $$$$$$SSSSM $$$X.$T&&X  o$$$. `  S$To   MMM
 MMMX`  $<.\X\` -X$$l  MM  $$$$  /  $$/&&X      X$$$/$/X$$dyS$$>. `  S$X%/  `MM
 MMMM/   `"`  . -$$$l  MM  yyyy  /  $$/%$$b.__.d$$$$/$.'7$$$$$$$. `  %SXXX.  MM
 MMMMM//   ./M  .<$$S, `` ,S$$>  /  $$.`7$$$$$$$$$$$/S//_'*+%%XX\ `._       /MM
 MMMMMMMMMMMMM\  /$$$$byyd$$$$\  /  $$// `*+XX+*XXXX      ,.      .\MMMMMMMMMMM
 GENETIC/MMMMM\.  /$$$$$$$$$$\|  /  %SXX  ,_  .      .\MMMMMMMMMMMMMMMMMMMMMMMM
 CHAIN/MMMMMMMM/__  `*+YY+*`_\|  /_______//MMMMMMMMMMMMMMMMMMMMMMMMMMM/-/-/-\*/
//-----------------------------------------------------------------------------
// Genetic Chain: Member Lounge
//-----------------------------------------------------------------------------
// Author: papaver (@tronicdreams)
//-----------------------------------------------------------------------------

import "openzeppelin-solidity/contracts/access/Ownable.sol";
import "openzeppelin-solidity/contracts/token/ERC721/IERC721.sol";
import "openzeppelin-solidity/contracts/token/ERC721/IERC721Receiver.sol";
import "openzeppelin-solidity/contracts/token/ERC1155/ERC1155.sol";

//------------------------------------------------------------------------------
// GeneticChainMetadata
//------------------------------------------------------------------------------

/**
 * @title GeneticChain - MemberLounge
 */
contract MemberLounge is ERC1155, IERC721Receiver,
    Ownable
{

    //-------------------------------------------------------------------------
    // structs
    //-------------------------------------------------------------------------

    struct Token {
        uint16 passList;
        uint56 maxSupply;
        uint56 totalSupply;
        int64 minStakeTime;
        int64 createdTS;
    }

    struct Pass {
        uint8 passId;
        uint16 tokenId;
        int64 stakedTS;
    }

    //-------------------------------------------------------------------------
    // events
    //-------------------------------------------------------------------------

    /**
     * Emited when a new token is created.
     */
    event TokenCreated(uint256 tokenId, uint16 passList, uint56 maxSupply,
        int64 minStakeTime, int64 createdTS);

    /**
     * Emited when a new pass is staked.
     */
    event Staked(address indexed owner, address pass, uint256 tokenId, int64 stakedTS);

    /**
     * Emited when a new pass is staked.
     */
    event Unstaked(address indexed owner, address pass, uint256 tokenId);

    /**
     * Emited when a reward is claimed.
     */
    event RewardsClaimed(address indexed owner, uint256 tokenId, uint256 amount);

    //-------------------------------------------------------------------------
    // constants
    //-------------------------------------------------------------------------

    address constant kDeadAddy = 0x000000000000000000000000000000000000dEaD;

    // token name/symbol
    string constant private _name   = "Genetic Chain Member Lounge";
    string constant private _symbol = "GCML";

    // contract info
    string public _contractUri;

    //-------------------------------------------------------------------------
    // fields
    //-------------------------------------------------------------------------

    // track tokens
    Token[] private _tokens;

    // handle token uri overrides
    mapping (uint256 => string) private _ipfsHash;

    // roles
    mapping (address => bool) private _minterAddress;
    mapping (address => bool) private _burnerAddress;

    // staking
    IERC721[] private _passes;
    mapping (address => uint8) private _passIdx;
    mapping (address => Pass[]) private _stakedPasses;

    // claim
    mapping (uint256 => bool) private _claims;

    //-------------------------------------------------------------------------
    // ctor
    //-------------------------------------------------------------------------

    constructor(
        string memory baseUri,
        string memory contractUri,
        address[] memory passes)
        ERC1155(baseUri)
    {
        // start token index at 1
        _tokens.push();

        // start pass index at 1 else we can't use 0 index to indicate
        //  an invalid pass inside _passIdx
        _passes.push();

        // save contract uri
        _contractUri = contractUri;

        // register passes
        for (uint256 i = 0; i < passes.length; ++i) {
            _registerPassContract(passes[i]);
        }
    }

    //-------------------------------------------------------------------------
    // modifiers
    //-------------------------------------------------------------------------

    modifier validTokenId(uint256 tokenId) {
        require(_created(tokenId), "invalid token");
        _;
    }

    //-------------------------------------------------------------------------

	/**
     * Verify caller is authorized minter.
     */
    modifier isMinter() {
        require(_minterAddress[_msgSender()] || owner() == _msgSender(), "caller not minter");
        _;
    }

    //-------------------------------------------------------------------------

	/**
     * Verify caller is authorized burner.
     */
    modifier isBurner() {
        require(_burnerAddress[_msgSender()], "caller not burner");
        _;
    }

    //-------------------------------------------------------------------------
    // internal
    //-------------------------------------------------------------------------

    /**
     * @dev Returns whether the specified token was created.
     */
    function _created(uint256 id)
        internal view
        returns (bool)
    {
        return id < _tokens.length && _tokens[id].createdTS > 0;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Returns whether the specified token has supply.
     */
    function _exists(uint256 id)
        internal view
        returns (bool)
    {
        return id < _tokens.length && _tokens[id].totalSupply > 0;
    }

    //-------------------------------------------------------------------------

    function _registerPassContract(address pass)
        internal
    {
        require(IERC165(pass).supportsInterface(type(IERC721).interfaceId), "not IERC721 compliant");
        _passIdx[pass] = uint8(_passes.length);
        _passes.push(IERC721(pass));
    }

    //-------------------------------------------------------------------------

    function _mkClaimId(address claimee, uint256 tokenId)
        internal pure
        returns(uint256)
    {
        return uint256(uint160(claimee)) << 96 | tokenId;
    }

    //-------------------------------------------------------------------------

    function _inPassList(uint8 passId, uint16 passList)
        internal pure
        returns(bool)
    {
        return passList & uint16(1 << (passId - 1)) != 0;
    }

    //-------------------------------------------------------------------------

    function _calculateRewards(address claimee, uint256 tokenId)
        internal view
        returns(uint256 rewards)
    {
        // token to calculate rewards for
        Token storage token = _tokens[tokenId];

        // claim rewards for passes staked long enough
        uint256 stakedCount = _stakedPasses[claimee].length;
        for (uint256 i = 0; i < stakedCount; ++i) {
            Pass storage stakedPass = _stakedPasses[claimee][i];
            int64 timeElapsed = token.createdTS - stakedPass.stakedTS;
            if (timeElapsed >= token.minStakeTime
                && _inPassList(stakedPass.passId, token.passList))
            {
                rewards += 1;
            }
        }
    }

    //-------------------------------------------------------------------------
    // ERC165
    //-------------------------------------------------------------------------

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

    //-------------------------------------------------------------------------
    // ERC1155
    //-------------------------------------------------------------------------

    /**
     * @dev See {ERC1155-_mint}.
     */
    function _mint(
            address account, uint256 id, uint256 amount, bytes memory data)
        internal virtual override validTokenId(id)
    {
        super._mint(account, id, amount, data);
        _tokens[id].totalSupply += uint56(amount);
        require(_tokens[id].totalSupply <= _tokens[id].maxSupply,
            'amount exceed maxsupply');
    }

    //-------------------------------------------------------------------------

    /**
     * @dev See {ERC1155-_mintBatch}.
     */
    function _mintBatch(
            address to, uint256[] memory ids, uint256[] memory amounts,
            bytes memory data)
        internal virtual override
    {
        super._mintBatch(to, ids, amounts, data);

        unchecked {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                require(_created(id), 'invalid token');
                _tokens[id].totalSupply += uint56(amounts[i]);
                require(_tokens[id].totalSupply <= _tokens[id].maxSupply,
                    'amount exceed maxsupply');
            }
        }
    }

    //-------------------------------------------------------------------------

    /**
     * @dev See {ERC1155-_burn}.
     */
    function _burn(address account, uint256 id, uint256 amount)
        internal virtual override validTokenId(id)
    {
        super._burn(account, id, amount);

        unchecked {
            _tokens[id].totalSupply -= uint56(amount);
        }
    }

    //-------------------------------------------------------------------------

    /**
     * @dev See {ERC1155-_burnBatch}.
     */
    function _burnBatch(
            address account, uint256[] memory ids, uint256[] memory amounts)
        internal virtual override
    {
        super._burnBatch(account, ids, amounts);

        unchecked {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                _tokens[id].totalSupply -= uint56(amounts[i]);
            }
        }
    }

    //-------------------------------------------------------------------------

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     *  Each token should have it's own override.
     */
    function uri(uint256 id)
        public view override validTokenId(id)
        returns (string memory)
    {
        // append hash or use base
        return bytes(_ipfsHash[id]).length == 0
            ? super.uri(id)
            : string(abi.encodePacked(super.uri(id), "/", _ipfsHash[id]));
    }

    //-------------------------------------------------------------------------
    // admin
    //-------------------------------------------------------------------------

    /**
     * Authorize minter address.
     */
    function registerMinterAddress(address minter)
        public onlyOwner
    {
        require(!_minterAddress[minter], "address already registered");
        _minterAddress[minter] = true;
    }

    //-------------------------------------------------------------------------

    /**
     * Remove minter address.
     */
    function revokeMinterAddress(address minter)
        public onlyOwner
    {
        require(_minterAddress[minter], "address not registered");
        delete _minterAddress[minter];
    }

    //-------------------------------------------------------------------------

    /**
     * Authorize burner address.
     */
    function registerBurnerAddress(address burner)
        public onlyOwner
    {
        require(!_burnerAddress[burner], "address already registered");
        _burnerAddress[burner] = true;
    }

    //-------------------------------------------------------------------------

    /**
     * Remove burner address.
     */
    function revokeBurnerAddress(address burner)
        public onlyOwner
    {
        require(_burnerAddress[burner], "address not registered");
        delete _burnerAddress[burner];
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Update default tokenUri used for all tokens.
     *
     * Should use the `\{id\}` replace mechanism to load the token id.
     */
    function setURI(string memory tokenUri)
        public onlyOwner
    {
        _setURI(tokenUri);
        emit URI(tokenUri, 0);
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Override token's ipfs hash.
     */
    function setTokenIpfsHash(uint256 id, string memory ipfsHash)
        public onlyOwner validTokenId(id)
    {
        _ipfsHash[id] = ipfsHash;
        emit URI(uri(id), id);
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Override token's pass list.
     */
    function setTokenPassList(uint256 id, uint16 passList)
        public onlyOwner validTokenId(id)
    {
        _tokens[id].passList = passList;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Override token's max supply.
     */
    function setTokenMaxSupply(uint256 id, uint56 maxSupply)
        public onlyOwner validTokenId(id)
    {
        require(maxSupply >= _tokens[id].totalSupply, 'max must exceed total');
        _tokens[id].maxSupply = maxSupply;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Override token's minimum stake time.
     */
    function setTokenMinStakeTime(uint256 id, int64 minStakeTime)
        public onlyOwner validTokenId(id)
    {
        _tokens[id].minStakeTime = minStakeTime;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Override token's minimum stake time.
     */
    function editToken(uint256 id, uint16 passList, uint56 maxSupply,
            int64 minStakeTime, string memory ipfsHash)
        public onlyOwner validTokenId(id)
    {
        require(maxSupply >= _tokens[id].totalSupply, 'max must exceed total');
        _tokens[id].passList     = passList;
        _tokens[id].maxSupply    = maxSupply;
        _tokens[id].minStakeTime = minStakeTime;

        _ipfsHash[id] = ipfsHash;
        emit URI(uri(id), id);
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Create a new token.
     * @param passList uint16 Passes eligible for reward.
     * @param amount uint256 Mint amount tokens to caller.
     * @param minStakeTime int64 Minimum time pass stake required to qualify
     * @param maxSupply uint56 Max mintable supply for this token.
     * @param ipfsHash string Override ipfsHash for newly created token.
     */
    function create(uint16 passList, uint256 amount, uint56 maxSupply,
            int64 minStakeTime, string memory ipfsHash)
        public onlyOwner
    {
        require(amount > 0, 'invalid amount');
        require(bytes(ipfsHash).length > 0, 'invalid ipfshash');

        // grab token id
        uint256 tokenId = _tokens.length;

        // add token
        int64 createdAt    = int64(int256(block.timestamp));
        Token memory token = Token(passList, maxSupply, 0, minStakeTime, createdAt);
        _tokens.push(token);

        // override token's ipfsHash
        _ipfsHash[tokenId] = ipfsHash;
        emit URI(uri(tokenId), tokenId);

        // mint a single token
        _mint(msg.sender, tokenId, amount, "");

        // created event
        emit TokenCreated(tokenId, passList, maxSupply, minStakeTime, createdAt);
    }

    //-------------------------------------------------------------------------

    function mint(address to, uint256 id, uint256 amount)
        public isMinter
    {
        require(amount > 0, 'invalid amount');
        _mint(to, id, amount, "");
    }

    //-------------------------------------------------------------------------

    function mintBatch(address to,
            uint256[] calldata ids, uint256[] calldata amounts)
        external isMinter
    {
        _mintBatch(to, ids, amounts, "");
    }

    //-------------------------------------------------------------------------

    function burn(address to, uint256 id, uint256 amount)
        public isBurner
    {
        require(amount > 0, 'invalid amount');
        _burn(to, id, amount);
    }

    //-------------------------------------------------------------------------

    function burnBatch(address to,
            uint256[] calldata ids, uint256[] calldata amounts)
        external isBurner
    {
        _burnBatch(to, ids, amounts);
    }

    //-------------------------------------------------------------------------
    // accessors
    //-------------------------------------------------------------------------

    /**
     * @dev Conform to {IERC721Metadata-name}.
     */
    function name()
        public pure
        returns (string memory)
    {
        return _name;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Conform to {IERC721Metadata-symbol}.
     */
    function symbol()
        public pure
        returns (string memory)
    {
        return _symbol;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id)
        public view
        returns (uint256)
    {
        return id < _tokens.length
            ? _tokens[id].totalSupply
            : 0;
    }

    //-------------------------------------------------------------------------
    // IERC721Receiver
    //-------------------------------------------------------------------------

    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     */
    function onERC721Received(
            address, address, uint256, bytes calldata)
        public pure override
        returns (bytes4)
    {
        return this.onERC721Received.selector ^ 0x23b872dd;
    }

    //-------------------------------------------------------------------------
    // interface
    //-------------------------------------------------------------------------

    /**
     * @dev Return token info.
     */
    function getToken(uint256 id)
        public view validTokenId(id)
        returns (Token memory, string memory)
    {
        return (_tokens[id], _ipfsHash[id]);
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Return list of all tokens.
     */
    function allTokens()
        public view
        returns (Token[] memory)
    {
        // return empty so all token indecies line up
        return _tokens;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Return list of pass contracts.
     */
    function allPassContracts()
        public view
        returns (address[] memory)
    {
        // keep the first empty entry so index lines up with id
        uint256 count = _passes.length;
        address[] memory passes = new address[](count);
        for (uint256 i = 0; i < count; ++i) {
            passes[i] = address(_passes[i]);
        }
        return passes;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Return list of passes staked by staker.
     */
    function getStakedPasses(address staker)
        public view
        returns (Pass[] memory stakedPasses)
    {
        stakedPasses = _stakedPasses[staker];
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Query pass for owners balance.
     */
    function balanceOfPass(address pass, address owner)
        public
        view
        returns (uint256)
    {
        require(_passIdx[pass] != 0, 'invalid pass address');

        // grab pass
        uint8 passId    = _passIdx[pass];
        IERC721 pass721 = _passes[passId];

        // return pass balance
        return pass721.balanceOf(owner);
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Stake single pass.
     */
    function stakePass(address pass, uint256 tokenId)
        public
    {
        require(_passIdx[pass] != 0, 'invalid pass address');

        address sender = _msgSender();

        // grab pass
        uint8 passId    = _passIdx[pass];
        IERC721 pass721 = _passes[passId];

        // verify ownership
        require(pass721.ownerOf(tokenId) == sender, 'not pass owner');

        // transfer here
        pass721.transferFrom(sender, address(this), tokenId);

        // save staked info
        int64 stakedTS = int64(int256(block.timestamp));
        Pass memory stakedPass = Pass(
            passId,
            uint16(tokenId),
            stakedTS);
        _stakedPasses[sender].push(stakedPass);

        // track skate event
        emit Staked(sender, pass, tokenId, stakedTS);
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Unstake single pass.
     */
    function unstakePass(address pass, uint256 tokenId)
        public
    {
        require(_passIdx[pass] != 0, 'invalid pass address');

        address sender = _msgSender();

        // grab pass
        uint8 passId    = _passIdx[pass];
        IERC721 pass721 = _passes[passId];

        // find pass
        uint256 stakedCount = _stakedPasses[sender].length;
        for (uint256 i = 0; i < stakedCount; ++i) {
            Pass storage stakedPass = _stakedPasses[sender][i];
            if (stakedPass.passId == passId && stakedPass.tokenId == tokenId) {

                // transfer pass back to owner
                pass721.transferFrom(address(this), sender, tokenId);

                // keep array compact
                uint256 lastIndex = stakedCount - 1;
                if (i != lastIndex) {
                    _stakedPasses[sender][i] = _stakedPasses[sender][lastIndex];
                }

                // cleanup
                _stakedPasses[sender].pop();

                // track unskate event
                emit Unstaked(sender, pass, tokenId);

                // no need to continue
                return;
            }
        }

        // invalid pass
        require(false, 'pass not found');
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Unstake all passes staked in contract.
     */
    function unstakeAllPasses()
        public
    {
        address sender = _msgSender();
        require(_stakedPasses[sender].length > 0, 'no passes staked');

        // unstake all passes
        uint256 stakedCount = _stakedPasses[sender].length;
        for (uint256 i = 0; i < stakedCount; ++i) {
            Pass storage stakedPass = _stakedPasses[sender][i];
            IERC721 pass721         = _passes[stakedPass.passId];

            // transfer pass back to owner
            pass721.transferFrom(address(this), sender, stakedPass.tokenId);

            // track unskate event
            emit Unstaked(sender, address(pass721), stakedPass.tokenId);

            // cleanup
            delete _stakedPasses[sender][i];
        }

        // cleanup
        delete _stakedPasses[sender];
    }

    //-------------------------------------------------------------------------

    /**
     * Calculate rewards available for user for given tokenId.
     */
    function calculateRewards(uint256 tokenId, address user)
        public view validTokenId(tokenId)
        returns(uint256)
    {
        uint256 claimId = _mkClaimId(user, tokenId);
        return _claims[claimId]
            ? 0
            : _calculateRewards(user, tokenId);
    }

    //-------------------------------------------------------------------------

    function calculateRewardsBatch(uint256[] memory tokenIds, address user)
        public view
        returns(uint256[] memory)
    {
        uint256 count = tokenIds.length;
        uint256[] memory rewards = new uint256[](count);
        for (uint256 i = 0; i < count; ++i) {
            rewards[i] = calculateRewards(tokenIds[i], user);
        }
        return rewards;
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Claim single token for all passes.
     */
    function claim(uint256 tokenId)
        public validTokenId(tokenId)
    {
        address sender = _msgSender();
        require(_stakedPasses[sender].length > 0, 'no passes staked');

        // check claim
        uint256 claimId = _mkClaimId(sender, tokenId);
        require(!_claims[claimId], 'rewards claimed');

        // process all passes
        uint256 rewards = _calculateRewards(sender, tokenId);
        require(rewards > 0, 'no rewards');

        // mark as claimed
        _claims[claimId] = true;

        // mint token for claimee
        _mint(sender, tokenId, rewards, "");

        // record event
        emit RewardsClaimed(sender, tokenId, rewards);
    }

    //-------------------------------------------------------------------------

    /**
     * @dev Claim multiple tokens at once.
     */
    function claimBatch(uint256[] calldata tokenIds)
        public
    {
        require(tokenIds.length > 0, 'no token ids');
        uint256 tokenCount = tokenIds.length;
        for (uint256 i = 0; i < tokenCount; ++i) {
            claim(tokenIds[i]);
        }
    }

    //-------------------------------------------------------------------------

    function setContractURI(string memory contractUri)
        external onlyOwner
    {
        _contractUri = contractUri;
    }

    //-------------------------------------------------------------------------

    function contractURI()
        public view
        returns (string memory)
    {
        return _contractUri;
    }

}

File 2 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT

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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 3 of 12 : ERC1155.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./extensions/IERC1155MetadataURI.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/introspection/ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping (uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor (string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(
        address[] memory accounts,
        uint256[] memory ids
    )
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(_msgSender() != operator, "ERC1155: setting approval status for self");

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

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        _balances[id][from] = fromBalance - amount;
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        public
        virtual
        override
    {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            _balances[id][from] = fromBalance - amount;
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `account`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - If `account` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(address account, uint256 id, uint256 amount, bytes memory data) internal virtual {
        require(account != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), account, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][account] += amount;
        emit TransferSingle(operator, address(0), account, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), account, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * 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 _mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `account`
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     * - `account` must have at least `amount` tokens of token type `id`.
     */
    function _burn(address account, uint256 id, uint256 amount) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 accountBalance = _balances[id][account];
        require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
        _balances[id][account] = accountBalance - amount;

        emit TransferSingle(operator, account, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(address account, uint256[] memory ids, uint256[] memory amounts) internal virtual {
        require(account != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, account, address(0), ids, amounts, "");

        for (uint i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 accountBalance = _balances[id][account];
            require(accountBalance >= amount, "ERC1155: burn amount exceeds balance");
            _balances[id][account] = accountBalance - amount;
        }

        emit TransferBatch(operator, account, address(0), ids, amounts);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        internal
        virtual
    { }

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    )
        private
    {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (bytes4 response) {
                if (response != IERC1155Receiver(to).onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 4 of 12 : IERC1155.sol
// SPDX-License-Identifier: MIT

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 5 of 12 : IERC1155Receiver.sol
// SPDX-License-Identifier: MIT

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.
        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. 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 6 of 12 : IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 7 of 12 : IERC721.sol
// SPDX-License-Identifier: MIT

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 8 of 12 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

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 9 of 12 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

File 10 of 12 : Context.sol
// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

File 11 of 12 : ERC165.sol
// SPDX-License-Identifier: MIT

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 12 of 12 : IERC165.sol
// SPDX-License-Identifier: MIT

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);
}

Settings
{
  "remappings": [],
  "optimizer": {
    "enabled": true,
    "runs": 1000
  },
  "evmVersion": "london",
  "libraries": {},
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseUri","type":"string"},{"internalType":"string","name":"contractUri","type":"string"},{"internalType":"address[]","name":"passes","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"pass","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"int64","name":"stakedTS","type":"int64"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"passList","type":"uint16"},{"indexed":false,"internalType":"uint56","name":"maxSupply","type":"uint56"},{"indexed":false,"internalType":"int64","name":"minStakeTime","type":"int64"},{"indexed":false,"internalType":"int64","name":"createdTS","type":"int64"}],"name":"TokenCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"pass","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"_contractUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allPassContracts","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allTokens","outputs":[{"components":[{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"uint56","name":"totalSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"int64","name":"createdTS","type":"int64"}],"internalType":"struct MemberLounge.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pass","type":"address"},{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOfPass","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"user","type":"address"}],"name":"calculateRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"address","name":"user","type":"address"}],"name":"calculateRewardsBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"claimBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"string","name":"ipfsHash","type":"string"}],"name":"create","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"string","name":"ipfsHash","type":"string"}],"name":"editToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedPasses","outputs":[{"components":[{"internalType":"uint8","name":"passId","type":"uint8"},{"internalType":"uint16","name":"tokenId","type":"uint16"},{"internalType":"int64","name":"stakedTS","type":"int64"}],"internalType":"struct MemberLounge.Pass[]","name":"stakedPasses","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getToken","outputs":[{"components":[{"internalType":"uint16","name":"passList","type":"uint16"},{"internalType":"uint56","name":"maxSupply","type":"uint56"},{"internalType":"uint56","name":"totalSupply","type":"uint56"},{"internalType":"int64","name":"minStakeTime","type":"int64"},{"internalType":"int64","name":"createdTS","type":"int64"}],"internalType":"struct MemberLounge.Token","name":"","type":"tuple"},{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"registerBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"registerMinterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"burner","type":"address"}],"name":"revokeBurnerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"revokeMinterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"contractUri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"ipfsHash","type":"string"}],"name":"setTokenIpfsHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint56","name":"maxSupply","type":"uint56"}],"name":"setTokenMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"int64","name":"minStakeTime","type":"int64"}],"name":"setTokenMinStakeTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint16","name":"passList","type":"uint16"}],"name":"setTokenPassList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenUri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pass","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stakePass","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":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAllPasses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"pass","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstakePass","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b5060405162005bd238038062005bd28339810160408190526200003491620003ea565b82620000408162000109565b50600380546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506005805460019081019091556009805490910181556000528151620000b190600490602085019062000266565b5060005b8151811015620000ff57620000ec828281518110620000d857620000d862000501565b60200260200101516200012260201b60201c565b620000f78162000517565b9050620000b5565b50505050620005a9565b80516200011e90600290602084019062000266565b5050565b6040516301ffc9a760e01b81526380ac58cd60e01b60048201526001600160a01b038216906301ffc9a79060240160206040518083038186803b1580156200016957600080fd5b505afa1580156200017e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620001a4919062000541565b620001f55760405162461bcd60e51b815260206004820152601560248201527f6e6f74204945524337323120636f6d706c69616e740000000000000000000000604482015260640160405180910390fd5b600980546001600160a01b03929092166000818152600a60205260408120805460ff191660ff909516949094179093558154600181018355919092527f6e1540171b6c0c960b71a7020d9f60077f6af931a8bbf590da0223dacf75c7af0180546001600160a01b0319169091179055565b82805462000274906200056c565b90600052602060002090601f016020900481019282620002985760008555620002e3565b82601f10620002b357805160ff1916838001178555620002e3565b82800160010185558215620002e3579182015b82811115620002e3578251825591602001919060010190620002c6565b50620002f1929150620002f5565b5090565b5b80821115620002f15760008155600101620002f6565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b03811182821017156200034d576200034d6200030c565b604052919050565b600082601f8301126200036757600080fd5b81516001600160401b038111156200038357620003836200030c565b602062000399601f8301601f1916820162000322565b8281528582848701011115620003ae57600080fd5b60005b83811015620003ce578581018301518282018401528201620003b1565b83811115620003e05760008385840101525b5095945050505050565b6000806000606084860312156200040057600080fd5b83516001600160401b03808211156200041857600080fd5b620004268783880162000355565b94506020915081860151818111156200043e57600080fd5b6200044c8882890162000355565b9450506040860151818111156200046257600080fd5b8601601f810188136200047457600080fd5b8051828111156200048957620004896200030c565b8060051b92506200049c84840162000322565b818152928201840192848101908a851115620004b757600080fd5b928501925b84841015620004f157835192506001600160a01b0383168314620004e05760008081fd5b8282529285019290850190620004bc565b8096505050505050509250925092565b634e487b7160e01b600052603260045260246000fd5b60006000198214156200053a57634e487b7160e01b600052601160045260246000fd5b5060010190565b6000602082840312156200055457600080fd5b815180151581146200056557600080fd5b9392505050565b600181811c908216806200058157607f821691505b60208210811415620005a357634e487b7160e01b600052602260045260246000fd5b50919050565b61561980620005b96000396000f3fe608060405234801561001057600080fd5b50600436106102fe5760003560e01c806378677e0e1161019c578063bd85b039116100ee578063e985e9c511610097578063f374511e11610071578063f374511e146106fd578063f5149fe31461071d578063f5298aca1461073057600080fd5b8063e985e9c51461069b578063f242432a146106d7578063f2fde38b146106ea57600080fd5b8063df7317c3116100c8578063df7317c31461065f578063e4b50cb814610672578063e8a3d4851461069357600080fd5b8063bd85b03914610631578063d81d0a1514610644578063d9ce2f6d1461065757600080fd5b806395d89b4111610150578063a2f434651161012a578063a2f43465146105f6578063af1bb0e114610609578063ba8bce551461061e57600080fd5b806395d89b41146105975780639f4a31a8146105d0578063a22cb465146105e357600080fd5b80638d1eb723116101815780638d1eb723146105565780638da5cb5b14610569578063938e3d7b1461058457600080fd5b806378677e0e14610530578063836527be1461054357600080fd5b806336608af8116102555780635fa82826116102095780636ff97f1d116101e35780636ff97f1d14610500578063715018a61461051557806371f1a3a11461051d57600080fd5b80635fa82826146104c757806362abebce146104da5780636b20c454146104ed57600080fd5b806343277ba41161023a57806343277ba41461048c5780634b457935146104945780634e1273f4146104a757600080fd5b806336608af814610466578063379607f51461047957600080fd5b80630e89341c116102b75780631768642211610291578063176864221461042d57806327e6680c146104405780632eb2c2d61461045357600080fd5b80630e89341c146103b6578063150b7a02146103c9578063156e29f61461041a57600080fd5b806302fe5305116102e857806302fe53051461034c57806306fdde03146103615780630c05bf6c146103a357600080fd5b8062fdd58e1461030357806301ffc9a714610329575b600080fd5b610316610311366004614729565b610743565b6040519081526020015b60405180910390f35b61033c61033736600461476b565b6107ec565b6040519015158152602001610320565b61035f61035a366004614846565b610830565b005b60408051808201909152601b81527f47656e6574696320436861696e204d656d626572204c6f756e6765000000000060208201525b60405161032091906148db565b61035f6103b13660046148ee565b6108bd565b6103966103c4366004614935565b6109b0565b6104016103d736600461494e565b7f36b308df0000000000000000000000000000000000000000000000000000000095945050505050565b6040516001600160e01b03199091168152602001610320565b61035f6104283660046149ed565b610a67565b61031661043b366004614a22565b610b3c565b61035f61044e366004614729565b610bcb565b61035f610461366004614ae7565b610f62565b61035f610474366004614bac565b611291565b61035f610487366004614935565b61136e565b61035f611563565b61035f6104a2366004614bd8565b611786565b6104ba6104b5366004614bf5565b61185b565b6040516103209190614cf3565b61035f6104d5366004614bd8565b611999565b61035f6104e8366004614d52565b611a6a565b61035f6104fb366004614d94565b611afa565b610508611bce565b6040516103209190614e17565b61035f611c74565b61031661052b366004614ea9565b611d13565b61035f61053e366004614eee565b611e51565b61035f610551366004614bd8565b611fab565b6104ba610564366004614f11565b612080565b6003546040516001600160a01b039091168152602001610320565b61035f610592366004614846565b612130565b60408051808201909152600481527f47434d4c000000000000000000000000000000000000000000000000000000006020820152610396565b61035f6105de366004614f6a565b61218b565b61035f6105f1366004614fd6565b6123ca565b61035f610604366004615009565b6124b5565b610611612798565b604051610320919061503f565b61035f61062c366004614bd8565b612862565b61031661063f366004614935565b612933565b61035f610652366004614d94565b612985565b610396612a75565b61035f61066d366004615080565b612b03565b610685610680366004614935565b612bc9565b6040516103209291906150a3565b610396612d59565b61033c6106a9366004614ea9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61035f6106e5366004615107565b612deb565b61035f6106f8366004614bd8565b613029565b61071061070b366004614bd8565b613156565b6040516103209190615164565b61035f61072b366004614729565b6131e9565b61035f61073e3660046149ed565b6134d6565b60006001600160a01b0383166107c65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b031982167f150b7a0200000000000000000000000000000000000000000000000000000000148061082a575061082a82613581565b92915050565b6003546001600160a01b031633146108785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6108818161361c565b60007f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516108b291906148db565b60405180910390a250565b6003546001600160a01b031633146109055760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8161090f8161362f565b61094b5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6000838152600660209081526040909120835161096a92850190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b610996856109b0565b6040516109a391906148db565b60405180910390a2505050565b6060816109bc8161362f565b6109f85760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60008381526006602052604090208054610a11906151c7565b159050610a5557610a2183613670565b6000848152600660209081526040918290209151610a41939291016151fc565b604051602081830303815290604052610a5e565b610a5e83613670565b91505b50919050565b3360009081526007602052604090205460ff1680610a8f57506003546001600160a01b031633145b610adb5760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b60008111610b1c5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b3783838360405180602001604052806000815250613704565b505050565b600082610b488161362f565b610b845760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b606083901b6bffffffffffffffffffffffff191684176000818152600c602052604090205460ff16610bbf57610bba8486613873565b610bc2565b60005b95945050505050565b6001600160a01b0382166000908152600a602052604090205460ff16610c335760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110610c6a57610c6a6152d8565b60009182526020808320909101546001600160a01b038681168452600b909252604083205491169250905b81811015610f11576001600160a01b0385166000908152600b60205260408120805483908110610cc757610cc76152d8565b6000918252602090912001805490915060ff8681169116148015610cf457508054610100900461ffff1687145b15610f00576040516323b872dd60e01b81523060048201526001600160a01b038781166024830152604482018990528516906323b872dd90606401600060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b505050506000600184610d709190615304565b9050808314610e4f576001600160a01b0387166000908152600b60205260409020805482908110610da357610da36152d8565b90600052602060002001600b6000896001600160a01b03166001600160a01b031681526020019081526020016000208481548110610de357610de36152d8565b6000918252602090912082549101805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff1990911690921791909117808255915467ffffffffffffffff63010000009182900416026affffffffffffffff000000199092169190911790555b6001600160a01b0387166000908152600b60205260409020805480610e7657610e7661531b565b600082815260209020810160001990810180546affffffffffffffffffffff191690550190556040516001600160a01b038816907fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e390610eed908c908c906001600160a01b03929092168252602082015260400190565b60405180910390a2505050505050505050565b50610f0a81615331565b9050610c95565b5060405162461bcd60e51b815260206004820152600e60248201527f70617373206e6f7420666f756e6400000000000000000000000000000000000060448201526064016107bd565b505050505050565b8151835114610fc45760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b6001600160a01b0384166110285760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480611044575061104485336106a9565b6110b65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016107bd565b3360005b845181101561122b5760008582815181106110d7576110d76152d8565b6020026020010151905060008583815181106110f5576110f56152d8565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111885760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b6111928282615304565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254611210919061534c565b925050819055505050508061122490615331565b90506110ba565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161127b929190615364565b60405180910390a4610f5a818787878787613974565b6003546001600160a01b031633146112d95760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b816112e38161362f565b61131f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110611333576113336152d8565b6000918252602090912001805467ffffffffffffffff92909216600160801b0267ffffffffffffffff60801b19909216919091179055505050565b806113788161362f565b6113b45760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b336000818152600b60205260409020546114105760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b606081901b6bffffffffffffffffffffffff191683176000818152600c602052604090205460ff16156114855760405162461bcd60e51b815260206004820152600f60248201527f7265776172647320636c61696d6564000000000000000000000000000000000060448201526064016107bd565b60006114918386613873565b9050600081116114e35760405162461bcd60e51b815260206004820152600a60248201527f6e6f20726577617264730000000000000000000000000000000000000000000060448201526064016107bd565b6000828152600c60209081526040808320805460ff191660011790558051918201905290815261151890849087908490613704565b60408051868152602081018390526001600160a01b038516917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a25050505050565b336000818152600b60205260409020546115bf5760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b6001600160a01b0381166000908152600b6020526040812054905b81811015611760576001600160a01b0383166000908152600b6020526040812080548390811061160c5761160c6152d8565b600091825260208220018054600980549294509160ff909116908110611634576116346152d8565b60009182526020909120015482546040516323b872dd60e01b81523060048201526001600160a01b03888116602483015261010090920461ffff1660448201529116915081906323b872dd90606401600060405180830381600087803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b50508354604080516001600160a01b03868116825261010090930461ffff16602082015291891693507fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e392500160405180910390a26001600160a01b0385166000908152600b60205260409020805484908110611730576117306152d8565b600091825260209091200180546affffffffffffffffffffff1916905550611759905081615331565b90506115da565b506001600160a01b0382166000908152600b60205260408120611782916146bb565b5050565b6003546001600160a01b031633146117ce5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff16156118375760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b606081518351146118d45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016107bd565b6000835167ffffffffffffffff8111156118f0576118f061478f565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b50905060005b84518110156119915761196485828151811061193d5761193d6152d8565b6020026020010151858381518110611957576119576152d8565b6020026020010151610743565b828281518110611976576119766152d8565b602090810291909101015261198a81615331565b905061191f565b509392505050565b6003546001600160a01b031633146119e15760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff16611a495760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19169055565b80611ab75760405162461bcd60e51b815260206004820152600c60248201527f6e6f20746f6b656e20696473000000000000000000000000000000000000000060448201526064016107bd565b8060005b81811015611af457611ae4848483818110611ad857611ad86152d8565b9050602002013561136e565b611aed81615331565b9050611abb565b50505050565b3360009081526008602052604090205460ff16611b595760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250613b2992505050565b5050505050565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015611c6b5760008481526020908190206040805160a0810182529185015461ffff8116835266ffffffffffffff620100008204811684860152600160481b82041691830191909152600160801b8104600790810b6060840152600160c01b909104900b6080820152825260019092019101611bf2565b50505050905090565b6003546001600160a01b03163314611cbc5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36003805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001600160a01b0382166000908152600a602052604081205460ff16611d7b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0383166000908152600a60205260408120546009805460ff909216929183908110611daf57611daf6152d8565b6000918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152909116915081906370a082319060240160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc29190615389565b6003546001600160a01b03163314611e995760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81611ea38161362f565b611edf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058381548110611ef257611ef26152d8565b60009182526020909120015466ffffffffffffff600160481b90910481169083161015611f615760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b8160058481548110611f7557611f756152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550505050565b6003546001600160a01b03163314611ff35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff161561205c5760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b815160609060008167ffffffffffffffff8111156120a0576120a061478f565b6040519080825280602002602001820160405280156120c9578160200160208202803683370190505b50905060005b82811015612127576120fa8682815181106120ec576120ec6152d8565b602002602001015186610b3c565b82828151811061210c5761210c6152d8565b602090810291909101015261212081615331565b90506120cf565b50949350505050565b6003546001600160a01b031633146121785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8051611782906004906020840190614637565b6003546001600160a01b031633146121d35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b846121dd8161362f565b6122195760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6005868154811061222c5761222c6152d8565b60009182526020909120015466ffffffffffffff600160481b9091048116908516101561229b5760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b84600587815481106122af576122af6152d8565b9060005260206000200160000160006101000a81548161ffff021916908361ffff16021790555083600587815481106122ea576122ea6152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550826005878154811061232f5761232f6152d8565b60009182526020808320909101805467ffffffffffffffff94909416600160801b0267ffffffffffffffff60801b19909416939093179092558781526006825260409020835161238192850190614637565b50857f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6123ad886109b0565b6040516123ba91906148db565b60405180910390a2505050505050565b336001600160a01b03831614156124495760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016107bd565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146124fd5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6000841161253e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b600081511161258f5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642069706673686173680000000000000000000000000000000060448201526064016107bd565b600580546040805160a08101825261ffff808a16825266ffffffffffffff8089166020808501918252600085870181815260078c810b60608901908152429182900b60808a0190815260018c018d559b845288517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db08c0180549751945192519d5167ffffffffffffffff908116600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff91909f16600160801b0267ffffffffffffffff60801b19948b16600160481b02949094167fffffffffffffffff000000000000000000000000000000ffffffffffffffffff96909a16620100000268ffffffffffffffffff1990991692909a169190911796909617929092169590951717949094169790971790558482526006865292902085519394929391926126d59290870190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b612701856109b0565b60405161270e91906148db565b60405180910390a261273133848960405180602001604052806000815250613704565b6040805184815261ffff8a16602082015266ffffffffffffff881681830152600787810b606083015284900b608082015290517f56b8c632f24b2e1ff86b679e5440f331423d390a41a3e0eccd74274e139a77fa9181900360a00190a15050505050505050565b60095460609060008167ffffffffffffffff8111156127b9576127b961478f565b6040519080825280602002602001820160405280156127e2578160200160208202803683370190505b50905060005b8281101561285b5760098181548110612803576128036152d8565b9060005260206000200160009054906101000a90046001600160a01b0316828281518110612833576128336152d8565b6001600160a01b039092166020928302919091019091015261285481615331565b90506127e8565b5092915050565b6003546001600160a01b031633146128aa5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff166129125760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546000908210612946576000612976565b60058281548110612959576129596152d8565b600091825260209091200154600160481b900466ffffffffffffff165b66ffffffffffffff1692915050565b3360009081526007602052604090205460ff16806129ad57506003546001600160a01b031633145b6129f95760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092018290525060408051602081019091529081529250613bd6915050565b60048054612a82906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612aae906151c7565b8015612afb5780601f10612ad057610100808354040283529160200191612afb565b820191906000526020600020905b815481529060010190602001808311612ade57829003601f168201915b505050505081565b6003546001600160a01b03163314612b4b5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81612b558161362f565b612b915760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110612ba557612ba56152d8565b6000918252602090912001805461ffff191661ffff92909216919091179055505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152606082612c008161362f565b612c3c5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058481548110612c4f57612c4f6152d8565b6000918252602080832087845260068252604093849020845160a081018652919093015461ffff8116825266ffffffffffffff620100008204811693830193909352600160481b810490921693810193909352600160801b8104600790810b6060850152600160c01b909104900b608083015280548190612ccf906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612cfb906151c7565b8015612d485780601f10612d1d57610100808354040283529160200191612d48565b820191906000526020600020905b815481529060010190602001808311612d2b57829003601f168201915b505050505090509250925050915091565b606060048054612d68906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612d94906151c7565b8015612de15780601f10612db657610100808354040283529160200191612de1565b820191906000526020600020905b815481529060010190602001808311612dc457829003601f168201915b5050505050905090565b6001600160a01b038416612e4f5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480612e6b5750612e6b85336106a9565b612edd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016107bd565b33612ef6818787612eed88613d83565b611bc788613d83565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612f7a5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b612f848482615304565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290612fc090849061534c565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613020828888888888613dce565b50505050505050565b6003546001600160a01b031633146130715760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b0381166130ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bd565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156131de576000848152602090819020604080516060810182529185015460ff8116835261ffff610100820416838501526301000000900460070b9082015282526001909201910161318e565b505050509050919050565b6001600160a01b0382166000908152600a602052604090205460ff166132515760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110613288576132886152d8565b6000918252602090912001546040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039182169250908416908290636352211e9060240160206040518083038186803b1580156132f557600080fd5b505afa158015613309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332d91906153a2565b6001600160a01b0316146133835760405162461bcd60e51b815260206004820152600e60248201527f6e6f742070617373206f776e657200000000000000000000000000000000000060448201526064016107bd565b6040516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018690528216906323b872dd90606401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050604080516060808201835260ff878116835261ffff8a8116602080860191825242600781900b8789018181526001600160a01b038f81166000818152600b87528c81208054600181018255908252908790208c51910180549851945167ffffffffffffffff166301000000026affffffffffffffff0000001995909a166101000262ffffff1990991691909a16179690961791909116959095179095558751938f1684529083018d90529582019290925293955091935090917ff7ebc54823f2cdb7ca0acdfbfd855d00ac987f8b7cb4deb30652b4787cbc7466910160405180910390a250505050505050565b3360009081526008602052604090205460ff166135355760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b600081116135765760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b37838383613ed9565b60006001600160e01b031982167fd9b67a260000000000000000000000000000000000000000000000000000000014806135e457506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461082a565b8051611782906002906020840190614637565b6005546000908210801561082a5750600060058381548110613653576136536152d8565b600091825260209091200154600160c01b900460070b1392915050565b60606002805461367f906151c7565b80601f01602080910402602001604051908101604052809291908181526020018280546136ab906151c7565b80156136f85780601f106136cd576101008083540402835291602001916136f8565b820191906000526020600020905b8154815290600101906020018083116136db57829003601f168201915b50505050509050919050565b8261370e8161362f565b61374a5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b61375685858585613f86565b826005858154811061376a5761376a6152d8565b60009182526020909120018054600990613795908490600160481b900466ffffffffffffff166153bf565b92506101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550600584815481106137cc576137cc6152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058581548110613809576138096152d8565b600091825260209091200154600160481b900466ffffffffffffff161115611bc75760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b60008060058381548110613889576138896152d8565b600091825260208083206001600160a01b0388168452600b909152604083205491019250905b8181101561396b576001600160a01b0386166000908152600b602052604081208054839081106138e1576138e16152d8565b6000918252602082200180548654919350613912916301000000909104600790810b91600160c01b9004900b6153ea565b8554909150600160801b9004600790810b9082900b128015906139455750815485546139459160ff169061ffff16614087565b156139585761395560018761534c565b95505b50508061396490615331565b90506138af565b50505092915050565b6001600160a01b0384163b15610f5a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906139b8908990899088908890889060040161543c565b602060405180830381600087803b1580156139d257600080fd5b505af1925050508015613a02575060408051601f3d908101601f191682019092526139ff9181019061549a565b60015b613ab857613a0e6154b7565b806308c379a01415613a485750613a236154d3565b80613a2e5750613a4a565b8060405162461bcd60e51b81526004016107bd91906148db565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016107bd565b6001600160e01b0319811663bc197c8160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b613b348383836140ad565b60005b8251811015611af4576000838281518110613b5457613b546152d8565b60200260200101519050828281518110613b7057613b706152d8565b602002602001015160058281548110613b8b57613b8b6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550600101613b37565b613be2848484846142ef565b60005b8351811015611bc7576000848281518110613c0257613c026152d8565b60200260200101519050613c158161362f565b613c515760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b838281518110613c6357613c636152d8565b602002602001015160058281548110613c7e57613c7e6152d8565b6000918252602090912001805466ffffffffffffff600160481b8083048216909401169092026fffffffffffffff000000000000000000199092169190911790556005805482908110613cd357613cd36152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058281548110613d1057613d106152d8565b600091825260209091200154600160481b900466ffffffffffffff161115613d7a5760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b50600101613be5565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613dbd57613dbd6152d8565b602090810291909101015292915050565b6001600160a01b0384163b15610f5a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613e12908990899088908890889060040161555d565b602060405180830381600087803b158015613e2c57600080fd5b505af1925050508015613e5c575060408051601f3d908101601f19168201909252613e599181019061549a565b60015b613e6857613a0e6154b7565b6001600160e01b0319811663f23a6e6160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b81613ee38161362f565b613f1f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b613f2a8484846144b5565b8160058481548110613f3e57613f3e6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550505050565b6001600160a01b038416613fe65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b33613ff781600087612eed88613d83565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061402790849061534c565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611bc781600087878787613dce565b60006140946001846155a0565b60ff166001901b821661ffff1660001415905092915050565b6001600160a01b03831661410f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b80518251146141715760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b604080516020810190915260009081905233905b83518110156142905760008482815181106141a2576141a26152d8565b6020026020010151905060008483815181106141c0576141c06152d8565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561424c5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6142568282615304565b6000938452602084815260408086206001600160a01b038c168752909152909320929092555081905061428881615331565b915050614185565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516142e1929190615364565b60405180910390a450505050565b6001600160a01b03841661434f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b81518351146143b15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b3360005b845181101561444d578381815181106143d0576143d06152d8565b60200260200101516000808784815181106143ed576143ed6152d8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254614435919061534c565b9091555081905061444581615331565b9150506143b5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161449e929190615364565b60405180910390a4611bc781600087878787613974565b6001600160a01b0383166145175760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b336145478185600061452887613d83565b61453187613d83565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156145c45760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6145ce8382615304565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b828054614643906151c7565b90600052602060002090601f01602090048101928261466557600085556146ab565b82601f1061467e57805160ff19168380011785556146ab565b828001600101855582156146ab579182015b828111156146ab578251825591602001919060010190614690565b506146b79291506146dc565b5090565b50805460008255906000526020600020908101906146d991906146f1565b50565b5b808211156146b757600081556001016146dd565b5b808211156146b75780546affffffffffffffffffffff191681556001016146f2565b6001600160a01b03811681146146d957600080fd5b6000806040838503121561473c57600080fd5b823561474781614714565b946020939093013593505050565b6001600160e01b0319811681146146d957600080fd5b60006020828403121561477d57600080fd5b813561478881614755565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156147cb576147cb61478f565b6040525050565b600082601f8301126147e357600080fd5b813567ffffffffffffffff8111156147fd576147fd61478f565b604051614814601f8301601f1916602001826147a5565b81815284602083860101111561482957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561485857600080fd5b813567ffffffffffffffff81111561486f57600080fd5b61487b848285016147d2565b949350505050565b60005b8381101561489e578181015183820152602001614886565b83811115611af45750506000910152565b600081518084526148c7816020860160208601614883565b601f01601f19169290920160200192915050565b60208152600061478860208301846148af565b6000806040838503121561490157600080fd5b82359150602083013567ffffffffffffffff81111561491f57600080fd5b61492b858286016147d2565b9150509250929050565b60006020828403121561494757600080fd5b5035919050565b60008060008060006080868803121561496657600080fd5b853561497181614714565b9450602086013561498181614714565b935060408601359250606086013567ffffffffffffffff808211156149a557600080fd5b818801915088601f8301126149b957600080fd5b8135818111156149c857600080fd5b8960208285010111156149da57600080fd5b9699959850939650602001949392505050565b600080600060608486031215614a0257600080fd5b8335614a0d81614714565b95602085013595506040909401359392505050565b60008060408385031215614a3557600080fd5b823591506020830135614a4781614714565b809150509250929050565b600067ffffffffffffffff821115614a6c57614a6c61478f565b5060051b60200190565b600082601f830112614a8757600080fd5b81356020614a9482614a52565b604051614aa182826147a5565b83815260059390931b8501820192828101915086841115614ac157600080fd5b8286015b84811015614adc5780358352918301918301614ac5565b509695505050505050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614714565b94506020860135614b1a81614714565b9350604086013567ffffffffffffffff80821115614b3757600080fd5b614b4389838a01614a76565b94506060880135915080821115614b5957600080fd5b614b6589838a01614a76565b93506080880135915080821115614b7b57600080fd5b50614b88888289016147d2565b9150509295509295909350565b8035600781900b8114614ba757600080fd5b919050565b60008060408385031215614bbf57600080fd5b82359150614bcf60208401614b95565b90509250929050565b600060208284031215614bea57600080fd5b813561478881614714565b60008060408385031215614c0857600080fd5b823567ffffffffffffffff80821115614c2057600080fd5b818501915085601f830112614c3457600080fd5b81356020614c4182614a52565b604051614c4e82826147a5565b83815260059390931b8501820192828101915089841115614c6e57600080fd5b948201945b83861015614c95578535614c8681614714565b82529482019490820190614c73565b96505086013592505080821115614cab57600080fd5b5061492b85828601614a76565b600081518084526020808501945080840160005b83811015614ce857815187529582019590820190600101614ccc565b509495945050505050565b6020815260006147886020830184614cb8565b60008083601f840112614d1857600080fd5b50813567ffffffffffffffff811115614d3057600080fd5b6020830191508360208260051b8501011115614d4b57600080fd5b9250929050565b60008060208385031215614d6557600080fd5b823567ffffffffffffffff811115614d7c57600080fd5b614d8885828601614d06565b90969095509350505050565b600080600080600060608688031215614dac57600080fd5b8535614db781614714565b9450602086013567ffffffffffffffff80821115614dd457600080fd5b614de089838a01614d06565b90965094506040880135915080821115614df957600080fd5b50614e0688828901614d06565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015614e9d57614e8a83855161ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b9284019260a09290920191600101614e33565b50909695505050505050565b60008060408385031215614ebc57600080fd5b8235614ec781614714565b91506020830135614a4781614714565b803566ffffffffffffff81168114614ba757600080fd5b60008060408385031215614f0157600080fd5b82359150614bcf60208401614ed7565b60008060408385031215614f2457600080fd5b823567ffffffffffffffff811115614f3b57600080fd5b614f4785828601614a76565b9250506020830135614a4781614714565b803561ffff81168114614ba757600080fd5b600080600080600060a08688031215614f8257600080fd5b85359450614f9260208701614f58565b9350614fa060408701614ed7565b9250614fae60608701614b95565b9150608086013567ffffffffffffffff811115614fca57600080fd5b614b88888289016147d2565b60008060408385031215614fe957600080fd5b8235614ff481614714565b915060208301358015158114614a4757600080fd5b600080600080600060a0868803121561502157600080fd5b61502a86614f58565b945060208601359350614fa060408701614ed7565b6020808252825182820181905260009190848201906040850190845b81811015614e9d5783516001600160a01b03168352928401929184019160010161505b565b6000806040838503121561509357600080fd5b82359150614bcf60208401614f58565b6150f1818461ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b60c060a0820152600061487b60c08301846148af565b600080600080600060a0868803121561511f57600080fd5b853561512a81614714565b9450602086013561513a81614714565b93506040860135925060608601359150608086013567ffffffffffffffff811115614fca57600080fd5b602080825282518282018190526000919060409081850190868401855b828110156151ba578151805160ff1685528681015161ffff168786015285015160070b8585015260609093019290850190600101615181565b5091979650505050505050565b600181811c908216806151db57607f821691505b60208210811415610a6157634e487b7160e01b600052602260045260246000fd5b60008351602061520f8285838901614883565b7f2f00000000000000000000000000000000000000000000000000000000000000918401918252845460019060009080831c8184168061525057607f821691505b85821081141561526e57634e487b7160e01b84526022600452602484fd5b8080156152825760018114615297576152c8565b60ff19841688870152828801860194506152c8565b60008b81526020902060005b848110156152be5781548a82018901529087019088016152a3565b5050858389010194505b50929a9950505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015615316576153166152ee565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615345576153456152ee565b5060010190565b6000821982111561535f5761535f6152ee565b500190565b6040815260006153776040830185614cb8565b8281036020840152610bc28185614cb8565b60006020828403121561539b57600080fd5b5051919050565b6000602082840312156153b457600080fd5b815161478881614714565b600066ffffffffffffff8083168185168083038211156153e1576153e16152ee565b01949350505050565b60008160070b8360070b6000811281677fffffffffffffff1901831281151615615416576154166152ee565b81677fffffffffffffff018313811615615432576154326152ee565b5090039392505050565b60006001600160a01b03808816835280871660208401525060a0604083015261546860a0830186614cb8565b828103606084015261547a8186614cb8565b9050828103608084015261548e81856148af565b98975050505050505050565b6000602082840312156154ac57600080fd5b815161478881614755565b600060033d11156154d05760046000803e5060005160e01c5b90565b600060443d10156154e15790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561551157505050505090565b82850191508151818111156155295750505050505090565b843d87010160208285010111156155435750505050505090565b615552602082860101876147a5565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261559560a08301846148af565b979650505050505050565b600060ff821660ff8416808210156155ba576155ba6152ee565b9003939250505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220de153d1b9d58481444bcb4b510590340bf20dbad71cf038a4dec996c49639ced64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f697066732e67656e65746963636861696e2e696f2f6970667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066732f516d526544645155797a54784b6350564b4c6f3961315a715742705048475878473535736169706b5258426f4553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000e6c5bc36214d9a09b208f397fe47bd421a5e02d9000000000000000000000000321b125cf85b0e9fbcf6554a71adb10d8138388a000000000000000000000000f91180a67a2c607523b5e32f98732d8cddd6538a000000000000000000000000a9833d5d3ff75a32709a8da2e66a7df9d2c83aa00000000000000000000000001bc2f28fb7e3be8b5905541a90e4312a9976ace1

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102fe5760003560e01c806378677e0e1161019c578063bd85b039116100ee578063e985e9c511610097578063f374511e11610071578063f374511e146106fd578063f5149fe31461071d578063f5298aca1461073057600080fd5b8063e985e9c51461069b578063f242432a146106d7578063f2fde38b146106ea57600080fd5b8063df7317c3116100c8578063df7317c31461065f578063e4b50cb814610672578063e8a3d4851461069357600080fd5b8063bd85b03914610631578063d81d0a1514610644578063d9ce2f6d1461065757600080fd5b806395d89b4111610150578063a2f434651161012a578063a2f43465146105f6578063af1bb0e114610609578063ba8bce551461061e57600080fd5b806395d89b41146105975780639f4a31a8146105d0578063a22cb465146105e357600080fd5b80638d1eb723116101815780638d1eb723146105565780638da5cb5b14610569578063938e3d7b1461058457600080fd5b806378677e0e14610530578063836527be1461054357600080fd5b806336608af8116102555780635fa82826116102095780636ff97f1d116101e35780636ff97f1d14610500578063715018a61461051557806371f1a3a11461051d57600080fd5b80635fa82826146104c757806362abebce146104da5780636b20c454146104ed57600080fd5b806343277ba41161023a57806343277ba41461048c5780634b457935146104945780634e1273f4146104a757600080fd5b806336608af814610466578063379607f51461047957600080fd5b80630e89341c116102b75780631768642211610291578063176864221461042d57806327e6680c146104405780632eb2c2d61461045357600080fd5b80630e89341c146103b6578063150b7a02146103c9578063156e29f61461041a57600080fd5b806302fe5305116102e857806302fe53051461034c57806306fdde03146103615780630c05bf6c146103a357600080fd5b8062fdd58e1461030357806301ffc9a714610329575b600080fd5b610316610311366004614729565b610743565b6040519081526020015b60405180910390f35b61033c61033736600461476b565b6107ec565b6040519015158152602001610320565b61035f61035a366004614846565b610830565b005b60408051808201909152601b81527f47656e6574696320436861696e204d656d626572204c6f756e6765000000000060208201525b60405161032091906148db565b61035f6103b13660046148ee565b6108bd565b6103966103c4366004614935565b6109b0565b6104016103d736600461494e565b7f36b308df0000000000000000000000000000000000000000000000000000000095945050505050565b6040516001600160e01b03199091168152602001610320565b61035f6104283660046149ed565b610a67565b61031661043b366004614a22565b610b3c565b61035f61044e366004614729565b610bcb565b61035f610461366004614ae7565b610f62565b61035f610474366004614bac565b611291565b61035f610487366004614935565b61136e565b61035f611563565b61035f6104a2366004614bd8565b611786565b6104ba6104b5366004614bf5565b61185b565b6040516103209190614cf3565b61035f6104d5366004614bd8565b611999565b61035f6104e8366004614d52565b611a6a565b61035f6104fb366004614d94565b611afa565b610508611bce565b6040516103209190614e17565b61035f611c74565b61031661052b366004614ea9565b611d13565b61035f61053e366004614eee565b611e51565b61035f610551366004614bd8565b611fab565b6104ba610564366004614f11565b612080565b6003546040516001600160a01b039091168152602001610320565b61035f610592366004614846565b612130565b60408051808201909152600481527f47434d4c000000000000000000000000000000000000000000000000000000006020820152610396565b61035f6105de366004614f6a565b61218b565b61035f6105f1366004614fd6565b6123ca565b61035f610604366004615009565b6124b5565b610611612798565b604051610320919061503f565b61035f61062c366004614bd8565b612862565b61031661063f366004614935565b612933565b61035f610652366004614d94565b612985565b610396612a75565b61035f61066d366004615080565b612b03565b610685610680366004614935565b612bc9565b6040516103209291906150a3565b610396612d59565b61033c6106a9366004614ea9565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b61035f6106e5366004615107565b612deb565b61035f6106f8366004614bd8565b613029565b61071061070b366004614bd8565b613156565b6040516103209190615164565b61035f61072b366004614729565b6131e9565b61035f61073e3660046149ed565b6134d6565b60006001600160a01b0383166107c65760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201527f65726f206164647265737300000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b031982167f150b7a0200000000000000000000000000000000000000000000000000000000148061082a575061082a82613581565b92915050565b6003546001600160a01b031633146108785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6108818161361c565b60007f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b826040516108b291906148db565b60405180910390a250565b6003546001600160a01b031633146109055760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8161090f8161362f565b61094b5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6000838152600660209081526040909120835161096a92850190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b610996856109b0565b6040516109a391906148db565b60405180910390a2505050565b6060816109bc8161362f565b6109f85760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60008381526006602052604090208054610a11906151c7565b159050610a5557610a2183613670565b6000848152600660209081526040918290209151610a41939291016151fc565b604051602081830303815290604052610a5e565b610a5e83613670565b91505b50919050565b3360009081526007602052604090205460ff1680610a8f57506003546001600160a01b031633145b610adb5760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b60008111610b1c5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b3783838360405180602001604052806000815250613704565b505050565b600082610b488161362f565b610b845760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b606083901b6bffffffffffffffffffffffff191684176000818152600c602052604090205460ff16610bbf57610bba8486613873565b610bc2565b60005b95945050505050565b6001600160a01b0382166000908152600a602052604090205460ff16610c335760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110610c6a57610c6a6152d8565b60009182526020808320909101546001600160a01b038681168452600b909252604083205491169250905b81811015610f11576001600160a01b0385166000908152600b60205260408120805483908110610cc757610cc76152d8565b6000918252602090912001805490915060ff8681169116148015610cf457508054610100900461ffff1687145b15610f00576040516323b872dd60e01b81523060048201526001600160a01b038781166024830152604482018990528516906323b872dd90606401600060405180830381600087803b158015610d4957600080fd5b505af1158015610d5d573d6000803e3d6000fd5b505050506000600184610d709190615304565b9050808314610e4f576001600160a01b0387166000908152600b60205260409020805482908110610da357610da36152d8565b90600052602060002001600b6000896001600160a01b03166001600160a01b031681526020019081526020016000208481548110610de357610de36152d8565b6000918252602090912082549101805460ff19811660ff9093169283178255835461ffff61010091829004160262ffffff1990911690921791909117808255915467ffffffffffffffff63010000009182900416026affffffffffffffff000000199092169190911790555b6001600160a01b0387166000908152600b60205260409020805480610e7657610e7661531b565b600082815260209020810160001990810180546affffffffffffffffffffff191690550190556040516001600160a01b038816907fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e390610eed908c908c906001600160a01b03929092168252602082015260400190565b60405180910390a2505050505050505050565b50610f0a81615331565b9050610c95565b5060405162461bcd60e51b815260206004820152600e60248201527f70617373206e6f7420666f756e6400000000000000000000000000000000000060448201526064016107bd565b505050505050565b8151835114610fc45760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b6001600160a01b0384166110285760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480611044575061104485336106a9565b6110b65760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f742060448201527f6f776e6572206e6f7220617070726f766564000000000000000000000000000060648201526084016107bd565b3360005b845181101561122b5760008582815181106110d7576110d76152d8565b6020026020010151905060008583815181106110f5576110f56152d8565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156111885760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b6111928282615304565b60008085815260200190815260200160002060008c6001600160a01b03166001600160a01b03168152602001908152602001600020819055508160008085815260200190815260200160002060008b6001600160a01b03166001600160a01b031681526020019081526020016000206000828254611210919061534c565b925050819055505050508061122490615331565b90506110ba565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161127b929190615364565b60405180910390a4610f5a818787878787613974565b6003546001600160a01b031633146112d95760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b816112e38161362f565b61131f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110611333576113336152d8565b6000918252602090912001805467ffffffffffffffff92909216600160801b0267ffffffffffffffff60801b19909216919091179055505050565b806113788161362f565b6113b45760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b336000818152600b60205260409020546114105760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b606081901b6bffffffffffffffffffffffff191683176000818152600c602052604090205460ff16156114855760405162461bcd60e51b815260206004820152600f60248201527f7265776172647320636c61696d6564000000000000000000000000000000000060448201526064016107bd565b60006114918386613873565b9050600081116114e35760405162461bcd60e51b815260206004820152600a60248201527f6e6f20726577617264730000000000000000000000000000000000000000000060448201526064016107bd565b6000828152600c60209081526040808320805460ff191660011790558051918201905290815261151890849087908490613704565b60408051868152602081018390526001600160a01b038516917fdacbdde355ba930696a362ea6738feb9f8bd52dfb3d81947558fd3217e23e325910160405180910390a25050505050565b336000818152600b60205260409020546115bf5760405162461bcd60e51b815260206004820152601060248201527f6e6f20706173736573207374616b65640000000000000000000000000000000060448201526064016107bd565b6001600160a01b0381166000908152600b6020526040812054905b81811015611760576001600160a01b0383166000908152600b6020526040812080548390811061160c5761160c6152d8565b600091825260208220018054600980549294509160ff909116908110611634576116346152d8565b60009182526020909120015482546040516323b872dd60e01b81523060048201526001600160a01b03888116602483015261010090920461ffff1660448201529116915081906323b872dd90606401600060405180830381600087803b15801561169d57600080fd5b505af11580156116b1573d6000803e3d6000fd5b50508354604080516001600160a01b03868116825261010090930461ffff16602082015291891693507fd8654fcc8cf5b36d30b3f5e4688fc78118e6d68de60b9994e09902268b57c3e392500160405180910390a26001600160a01b0385166000908152600b60205260409020805484908110611730576117306152d8565b600091825260209091200180546affffffffffffffffffffff1916905550611759905081615331565b90506115da565b506001600160a01b0382166000908152600b60205260408120611782916146bb565b5050565b6003546001600160a01b031633146117ce5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff16156118375760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19166001179055565b606081518351146118d45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e67746860448201527f206d69736d61746368000000000000000000000000000000000000000000000060648201526084016107bd565b6000835167ffffffffffffffff8111156118f0576118f061478f565b604051908082528060200260200182016040528015611919578160200160208202803683370190505b50905060005b84518110156119915761196485828151811061193d5761193d6152d8565b6020026020010151858381518110611957576119576152d8565b6020026020010151610743565b828281518110611976576119766152d8565b602090810291909101015261198a81615331565b905061191f565b509392505050565b6003546001600160a01b031633146119e15760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff16611a495760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19169055565b80611ab75760405162461bcd60e51b815260206004820152600c60248201527f6e6f20746f6b656e20696473000000000000000000000000000000000000000060448201526064016107bd565b8060005b81811015611af457611ae4848483818110611ad857611ad86152d8565b9050602002013561136e565b611aed81615331565b9050611abb565b50505050565b3360009081526008602052604090205460ff16611b595760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092019190915250613b2992505050565b5050505050565b60606005805480602002602001604051908101604052809291908181526020016000905b82821015611c6b5760008481526020908190206040805160a0810182529185015461ffff8116835266ffffffffffffff620100008204811684860152600160481b82041691830191909152600160801b8104600790810b6060840152600160c01b909104900b6080820152825260019092019101611bf2565b50505050905090565b6003546001600160a01b03163314611cbc5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6003546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36003805473ffffffffffffffffffffffffffffffffffffffff19169055565b6001600160a01b0382166000908152600a602052604081205460ff16611d7b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0383166000908152600a60205260408120546009805460ff909216929183908110611daf57611daf6152d8565b6000918252602090912001546040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b038681166004830152909116915081906370a082319060240160206040518083038186803b158015611e1957600080fd5b505afa158015611e2d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc29190615389565b6003546001600160a01b03163314611e995760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81611ea38161362f565b611edf5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058381548110611ef257611ef26152d8565b60009182526020909120015466ffffffffffffff600160481b90910481169083161015611f615760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b8160058481548110611f7557611f756152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550505050565b6003546001600160a01b03163314611ff35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526007602052604090205460ff161561205c5760405162461bcd60e51b815260206004820152601a60248201527f6164647265737320616c7265616479207265676973746572656400000000000060448201526064016107bd565b6001600160a01b03166000908152600760205260409020805460ff19166001179055565b815160609060008167ffffffffffffffff8111156120a0576120a061478f565b6040519080825280602002602001820160405280156120c9578160200160208202803683370190505b50905060005b82811015612127576120fa8682815181106120ec576120ec6152d8565b602002602001015186610b3c565b82828151811061210c5761210c6152d8565b602090810291909101015261212081615331565b90506120cf565b50949350505050565b6003546001600160a01b031633146121785760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b8051611782906004906020840190614637565b6003546001600160a01b031633146121d35760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b846121dd8161362f565b6122195760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b6005868154811061222c5761222c6152d8565b60009182526020909120015466ffffffffffffff600160481b9091048116908516101561229b5760405162461bcd60e51b815260206004820152601560248201527f6d6178206d7573742065786365656420746f74616c000000000000000000000060448201526064016107bd565b84600587815481106122af576122af6152d8565b9060005260206000200160000160006101000a81548161ffff021916908361ffff16021790555083600587815481106122ea576122ea6152d8565b9060005260206000200160000160026101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550826005878154811061232f5761232f6152d8565b60009182526020808320909101805467ffffffffffffffff94909416600160801b0267ffffffffffffffff60801b19909416939093179092558781526006825260409020835161238192850190614637565b50857f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b6123ad886109b0565b6040516123ba91906148db565b60405180910390a2505050505050565b336001600160a01b03831614156124495760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c2073746174757360448201527f20666f722073656c66000000000000000000000000000000000000000000000060648201526084016107bd565b3360008181526001602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6003546001600160a01b031633146124fd5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6000841161253e5760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b600081511161258f5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642069706673686173680000000000000000000000000000000060448201526064016107bd565b600580546040805160a08101825261ffff808a16825266ffffffffffffff8089166020808501918252600085870181815260078c810b60608901908152429182900b60808a0190815260018c018d559b845288517f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db08c0180549751945192519d5167ffffffffffffffff908116600160c01b0277ffffffffffffffffffffffffffffffffffffffffffffffff91909f16600160801b0267ffffffffffffffff60801b19948b16600160481b02949094167fffffffffffffffff000000000000000000000000000000ffffffffffffffffff96909a16620100000268ffffffffffffffffff1990991692909a169190911796909617929092169590951717949094169790971790558482526006865292902085519394929391926126d59290870190614637565b50827f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b612701856109b0565b60405161270e91906148db565b60405180910390a261273133848960405180602001604052806000815250613704565b6040805184815261ffff8a16602082015266ffffffffffffff881681830152600787810b606083015284900b608082015290517f56b8c632f24b2e1ff86b679e5440f331423d390a41a3e0eccd74274e139a77fa9181900360a00190a15050505050505050565b60095460609060008167ffffffffffffffff8111156127b9576127b961478f565b6040519080825280602002602001820160405280156127e2578160200160208202803683370190505b50905060005b8281101561285b5760098181548110612803576128036152d8565b9060005260206000200160009054906101000a90046001600160a01b0316828281518110612833576128336152d8565b6001600160a01b039092166020928302919091019091015261285481615331565b90506127e8565b5092915050565b6003546001600160a01b031633146128aa5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b03811660009081526008602052604090205460ff166129125760405162461bcd60e51b815260206004820152601660248201527f61646472657373206e6f7420726567697374657265640000000000000000000060448201526064016107bd565b6001600160a01b03166000908152600860205260409020805460ff19169055565b6005546000908210612946576000612976565b60058281548110612959576129596152d8565b600091825260209091200154600160481b900466ffffffffffffff165b66ffffffffffffff1692915050565b3360009081526007602052604090205460ff16806129ad57506003546001600160a01b031633145b6129f95760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206d696e74657200000000000000000000000000000060448201526064016107bd565b611bc78585858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050604080516020808902828101820190935288825290935088925087918291850190849080828437600092018290525060408051602081019091529081529250613bd6915050565b60048054612a82906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612aae906151c7565b8015612afb5780601f10612ad057610100808354040283529160200191612afb565b820191906000526020600020905b815481529060010190602001808311612ade57829003601f168201915b505050505081565b6003546001600160a01b03163314612b4b5760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b81612b558161362f565b612b915760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b8160058481548110612ba557612ba56152d8565b6000918252602090912001805461ffff191661ffff92909216919091179055505050565b6040805160a081018252600080825260208201819052918101829052606081018290526080810191909152606082612c008161362f565b612c3c5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b60058481548110612c4f57612c4f6152d8565b6000918252602080832087845260068252604093849020845160a081018652919093015461ffff8116825266ffffffffffffff620100008204811693830193909352600160481b810490921693810193909352600160801b8104600790810b6060850152600160c01b909104900b608083015280548190612ccf906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612cfb906151c7565b8015612d485780601f10612d1d57610100808354040283529160200191612d48565b820191906000526020600020905b815481529060010190602001808311612d2b57829003601f168201915b505050505090509250925050915091565b606060048054612d68906151c7565b80601f0160208091040260200160405190810160405280929190818152602001828054612d94906151c7565b8015612de15780601f10612db657610100808354040283529160200191612de1565b820191906000526020600020905b815481529060010190602001808311612dc457829003601f168201915b5050505050905090565b6001600160a01b038416612e4f5760405162461bcd60e51b815260206004820152602560248201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b60648201526084016107bd565b6001600160a01b038516331480612e6b5750612e6b85336106a9565b612edd5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201527f20617070726f766564000000000000000000000000000000000000000000000060648201526084016107bd565b33612ef6818787612eed88613d83565b611bc788613d83565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015612f7a5760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60448201526939103a3930b739b332b960b11b60648201526084016107bd565b612f848482615304565b6000868152602081815260408083206001600160a01b038c81168552925280832093909355881681529081208054869290612fc090849061534c565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4613020828888888888613dce565b50505050505050565b6003546001600160a01b031633146130715760405162461bcd60e51b815260206004820181905260248201526000805160206155c483398151915260448201526064016107bd565b6001600160a01b0381166130ed5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107bd565b6003546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835260609492939192909184015b828210156131de576000848152602090819020604080516060810182529185015460ff8116835261ffff610100820416838501526301000000900460070b9082015282526001909201910161318e565b505050509050919050565b6001600160a01b0382166000908152600a602052604090205460ff166132515760405162461bcd60e51b815260206004820152601460248201527f696e76616c69642070617373206164647265737300000000000000000000000060448201526064016107bd565b6001600160a01b0382166000908152600a602052604081205460098054339360ff90931692919083908110613288576132886152d8565b6000918252602090912001546040517f6352211e000000000000000000000000000000000000000000000000000000008152600481018690526001600160a01b039182169250908416908290636352211e9060240160206040518083038186803b1580156132f557600080fd5b505afa158015613309573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061332d91906153a2565b6001600160a01b0316146133835760405162461bcd60e51b815260206004820152600e60248201527f6e6f742070617373206f776e657200000000000000000000000000000000000060448201526064016107bd565b6040516323b872dd60e01b81526001600160a01b038481166004830152306024830152604482018690528216906323b872dd90606401600060405180830381600087803b1580156133d357600080fd5b505af11580156133e7573d6000803e3d6000fd5b5050604080516060808201835260ff878116835261ffff8a8116602080860191825242600781900b8789018181526001600160a01b038f81166000818152600b87528c81208054600181018255908252908790208c51910180549851945167ffffffffffffffff166301000000026affffffffffffffff0000001995909a166101000262ffffff1990991691909a16179690961791909116959095179095558751938f1684529083018d90529582019290925293955091935090917ff7ebc54823f2cdb7ca0acdfbfd855d00ac987f8b7cb4deb30652b4787cbc7466910160405180910390a250505050505050565b3360009081526008602052604090205460ff166135355760405162461bcd60e51b815260206004820152601160248201527f63616c6c6572206e6f74206275726e657200000000000000000000000000000060448201526064016107bd565b600081116135765760405162461bcd60e51b815260206004820152600e60248201526d1a5b9d985b1a5908185b5bdd5b9d60921b60448201526064016107bd565b610b37838383613ed9565b60006001600160e01b031982167fd9b67a260000000000000000000000000000000000000000000000000000000014806135e457506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b8061082a57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b031983161461082a565b8051611782906002906020840190614637565b6005546000908210801561082a5750600060058381548110613653576136536152d8565b600091825260209091200154600160c01b900460070b1392915050565b60606002805461367f906151c7565b80601f01602080910402602001604051908101604052809291908181526020018280546136ab906151c7565b80156136f85780601f106136cd576101008083540402835291602001916136f8565b820191906000526020600020905b8154815290600101906020018083116136db57829003601f168201915b50505050509050919050565b8261370e8161362f565b61374a5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b61375685858585613f86565b826005858154811061376a5761376a6152d8565b60009182526020909120018054600990613795908490600160481b900466ffffffffffffff166153bf565b92506101000a81548166ffffffffffffff021916908366ffffffffffffff160217905550600584815481106137cc576137cc6152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058581548110613809576138096152d8565b600091825260209091200154600160481b900466ffffffffffffff161115611bc75760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b60008060058381548110613889576138896152d8565b600091825260208083206001600160a01b0388168452600b909152604083205491019250905b8181101561396b576001600160a01b0386166000908152600b602052604081208054839081106138e1576138e16152d8565b6000918252602082200180548654919350613912916301000000909104600790810b91600160c01b9004900b6153ea565b8554909150600160801b9004600790810b9082900b128015906139455750815485546139459160ff169061ffff16614087565b156139585761395560018761534c565b95505b50508061396490615331565b90506138af565b50505092915050565b6001600160a01b0384163b15610f5a5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906139b8908990899088908890889060040161543c565b602060405180830381600087803b1580156139d257600080fd5b505af1925050508015613a02575060408051601f3d908101601f191682019092526139ff9181019061549a565b60015b613ab857613a0e6154b7565b806308c379a01415613a485750613a236154d3565b80613a2e5750613a4a565b8060405162461bcd60e51b81526004016107bd91906148db565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e74657200000000000000000000000060648201526084016107bd565b6001600160e01b0319811663bc197c8160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b613b348383836140ad565b60005b8251811015611af4576000838281518110613b5457613b546152d8565b60200260200101519050828281518110613b7057613b706152d8565b602002602001015160058281548110613b8b57613b8b6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550600101613b37565b613be2848484846142ef565b60005b8351811015611bc7576000848281518110613c0257613c026152d8565b60200260200101519050613c158161362f565b613c515760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b838281518110613c6357613c636152d8565b602002602001015160058281548110613c7e57613c7e6152d8565b6000918252602090912001805466ffffffffffffff600160481b8083048216909401169092026fffffffffffffff000000000000000000199092169190911790556005805482908110613cd357613cd36152d8565b9060005260206000200160000160029054906101000a900466ffffffffffffff1666ffffffffffffff1660058281548110613d1057613d106152d8565b600091825260209091200154600160481b900466ffffffffffffff161115613d7a5760405162461bcd60e51b815260206004820152601760248201527f616d6f756e7420657863656564206d6178737570706c7900000000000000000060448201526064016107bd565b50600101613be5565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110613dbd57613dbd6152d8565b602090810291909101015292915050565b6001600160a01b0384163b15610f5a5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190613e12908990899088908890889060040161555d565b602060405180830381600087803b158015613e2c57600080fd5b505af1925050508015613e5c575060408051601f3d908101601f19168201909252613e599181019061549a565b60015b613e6857613a0e6154b7565b6001600160e01b0319811663f23a6e6160e01b146130205760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b60648201526084016107bd565b81613ee38161362f565b613f1f5760405162461bcd60e51b815260206004820152600d60248201526c34b73b30b634b2103a37b5b2b760991b60448201526064016107bd565b613f2a8484846144b5565b8160058481548110613f3e57613f3e6152d8565b6000918252602090912001805466ffffffffffffff600160481b808304821694909403169092026fffffffffffffff0000000000000000001990921691909117905550505050565b6001600160a01b038416613fe65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b33613ff781600087612eed88613d83565b6000848152602081815260408083206001600160a01b03891684529091528120805485929061402790849061534c565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611bc781600087878787613dce565b60006140946001846155a0565b60ff166001901b821661ffff1660001415905092915050565b6001600160a01b03831661410f5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b80518251146141715760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b604080516020810190915260009081905233905b83518110156142905760008482815181106141a2576141a26152d8565b6020026020010151905060008483815181106141c0576141c06152d8565b602090810291909101810151600084815280835260408082206001600160a01b038c16835290935291909120549091508181101561424c5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6142568282615304565b6000938452602084815260408086206001600160a01b038c168752909152909320929092555081905061428881615331565b915050614185565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516142e1929190615364565b60405180910390a450505050565b6001600160a01b03841661434f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bd565b81518351146143b15760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b60648201526084016107bd565b3360005b845181101561444d578381815181106143d0576143d06152d8565b60200260200101516000808784815181106143ed576143ed6152d8565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b031681526020019081526020016000206000828254614435919061534c565b9091555081905061444581615331565b9150506143b5565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161449e929190615364565b60405180910390a4611bc781600087878787613974565b6001600160a01b0383166145175760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016107bd565b336145478185600061452887613d83565b61453187613d83565b5050604080516020810190915260009052505050565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156145c45760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016107bd565b6145ce8382615304565b6000858152602081815260408083206001600160a01b038a811680865291845282852095909555815189815292830188905292938616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b828054614643906151c7565b90600052602060002090601f01602090048101928261466557600085556146ab565b82601f1061467e57805160ff19168380011785556146ab565b828001600101855582156146ab579182015b828111156146ab578251825591602001919060010190614690565b506146b79291506146dc565b5090565b50805460008255906000526020600020908101906146d991906146f1565b50565b5b808211156146b757600081556001016146dd565b5b808211156146b75780546affffffffffffffffffffff191681556001016146f2565b6001600160a01b03811681146146d957600080fd5b6000806040838503121561473c57600080fd5b823561474781614714565b946020939093013593505050565b6001600160e01b0319811681146146d957600080fd5b60006020828403121561477d57600080fd5b813561478881614755565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156147cb576147cb61478f565b6040525050565b600082601f8301126147e357600080fd5b813567ffffffffffffffff8111156147fd576147fd61478f565b604051614814601f8301601f1916602001826147a5565b81815284602083860101111561482957600080fd5b816020850160208301376000918101602001919091529392505050565b60006020828403121561485857600080fd5b813567ffffffffffffffff81111561486f57600080fd5b61487b848285016147d2565b949350505050565b60005b8381101561489e578181015183820152602001614886565b83811115611af45750506000910152565b600081518084526148c7816020860160208601614883565b601f01601f19169290920160200192915050565b60208152600061478860208301846148af565b6000806040838503121561490157600080fd5b82359150602083013567ffffffffffffffff81111561491f57600080fd5b61492b858286016147d2565b9150509250929050565b60006020828403121561494757600080fd5b5035919050565b60008060008060006080868803121561496657600080fd5b853561497181614714565b9450602086013561498181614714565b935060408601359250606086013567ffffffffffffffff808211156149a557600080fd5b818801915088601f8301126149b957600080fd5b8135818111156149c857600080fd5b8960208285010111156149da57600080fd5b9699959850939650602001949392505050565b600080600060608486031215614a0257600080fd5b8335614a0d81614714565b95602085013595506040909401359392505050565b60008060408385031215614a3557600080fd5b823591506020830135614a4781614714565b809150509250929050565b600067ffffffffffffffff821115614a6c57614a6c61478f565b5060051b60200190565b600082601f830112614a8757600080fd5b81356020614a9482614a52565b604051614aa182826147a5565b83815260059390931b8501820192828101915086841115614ac157600080fd5b8286015b84811015614adc5780358352918301918301614ac5565b509695505050505050565b600080600080600060a08688031215614aff57600080fd5b8535614b0a81614714565b94506020860135614b1a81614714565b9350604086013567ffffffffffffffff80821115614b3757600080fd5b614b4389838a01614a76565b94506060880135915080821115614b5957600080fd5b614b6589838a01614a76565b93506080880135915080821115614b7b57600080fd5b50614b88888289016147d2565b9150509295509295909350565b8035600781900b8114614ba757600080fd5b919050565b60008060408385031215614bbf57600080fd5b82359150614bcf60208401614b95565b90509250929050565b600060208284031215614bea57600080fd5b813561478881614714565b60008060408385031215614c0857600080fd5b823567ffffffffffffffff80821115614c2057600080fd5b818501915085601f830112614c3457600080fd5b81356020614c4182614a52565b604051614c4e82826147a5565b83815260059390931b8501820192828101915089841115614c6e57600080fd5b948201945b83861015614c95578535614c8681614714565b82529482019490820190614c73565b96505086013592505080821115614cab57600080fd5b5061492b85828601614a76565b600081518084526020808501945080840160005b83811015614ce857815187529582019590820190600101614ccc565b509495945050505050565b6020815260006147886020830184614cb8565b60008083601f840112614d1857600080fd5b50813567ffffffffffffffff811115614d3057600080fd5b6020830191508360208260051b8501011115614d4b57600080fd5b9250929050565b60008060208385031215614d6557600080fd5b823567ffffffffffffffff811115614d7c57600080fd5b614d8885828601614d06565b90969095509350505050565b600080600080600060608688031215614dac57600080fd5b8535614db781614714565b9450602086013567ffffffffffffffff80821115614dd457600080fd5b614de089838a01614d06565b90965094506040880135915080821115614df957600080fd5b50614e0688828901614d06565b969995985093965092949392505050565b6020808252825182820181905260009190848201906040850190845b81811015614e9d57614e8a83855161ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b9284019260a09290920191600101614e33565b50909695505050505050565b60008060408385031215614ebc57600080fd5b8235614ec781614714565b91506020830135614a4781614714565b803566ffffffffffffff81168114614ba757600080fd5b60008060408385031215614f0157600080fd5b82359150614bcf60208401614ed7565b60008060408385031215614f2457600080fd5b823567ffffffffffffffff811115614f3b57600080fd5b614f4785828601614a76565b9250506020830135614a4781614714565b803561ffff81168114614ba757600080fd5b600080600080600060a08688031215614f8257600080fd5b85359450614f9260208701614f58565b9350614fa060408701614ed7565b9250614fae60608701614b95565b9150608086013567ffffffffffffffff811115614fca57600080fd5b614b88888289016147d2565b60008060408385031215614fe957600080fd5b8235614ff481614714565b915060208301358015158114614a4757600080fd5b600080600080600060a0868803121561502157600080fd5b61502a86614f58565b945060208601359350614fa060408701614ed7565b6020808252825182820181905260009190848201906040850190845b81811015614e9d5783516001600160a01b03168352928401929184019160010161505b565b6000806040838503121561509357600080fd5b82359150614bcf60208401614f58565b6150f1818461ffff8151168252602081015166ffffffffffffff80821660208501528060408401511660408501525050606081015160070b6060830152608081015160070b60808301525050565b60c060a0820152600061487b60c08301846148af565b600080600080600060a0868803121561511f57600080fd5b853561512a81614714565b9450602086013561513a81614714565b93506040860135925060608601359150608086013567ffffffffffffffff811115614fca57600080fd5b602080825282518282018190526000919060409081850190868401855b828110156151ba578151805160ff1685528681015161ffff168786015285015160070b8585015260609093019290850190600101615181565b5091979650505050505050565b600181811c908216806151db57607f821691505b60208210811415610a6157634e487b7160e01b600052602260045260246000fd5b60008351602061520f8285838901614883565b7f2f00000000000000000000000000000000000000000000000000000000000000918401918252845460019060009080831c8184168061525057607f821691505b85821081141561526e57634e487b7160e01b84526022600452602484fd5b8080156152825760018114615297576152c8565b60ff19841688870152828801860194506152c8565b60008b81526020902060005b848110156152be5781548a82018901529087019088016152a3565b5050858389010194505b50929a9950505050505050505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600082821015615316576153166152ee565b500390565b634e487b7160e01b600052603160045260246000fd5b6000600019821415615345576153456152ee565b5060010190565b6000821982111561535f5761535f6152ee565b500190565b6040815260006153776040830185614cb8565b8281036020840152610bc28185614cb8565b60006020828403121561539b57600080fd5b5051919050565b6000602082840312156153b457600080fd5b815161478881614714565b600066ffffffffffffff8083168185168083038211156153e1576153e16152ee565b01949350505050565b60008160070b8360070b6000811281677fffffffffffffff1901831281151615615416576154166152ee565b81677fffffffffffffff018313811615615432576154326152ee565b5090039392505050565b60006001600160a01b03808816835280871660208401525060a0604083015261546860a0830186614cb8565b828103606084015261547a8186614cb8565b9050828103608084015261548e81856148af565b98975050505050505050565b6000602082840312156154ac57600080fd5b815161478881614755565b600060033d11156154d05760046000803e5060005160e01c5b90565b600060443d10156154e15790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561551157505050505090565b82850191508151818111156155295750505050505090565b843d87010160208285010111156155435750505050505090565b615552602082860101876147a5565b509095945050505050565b60006001600160a01b03808816835280871660208401525084604083015283606083015260a0608083015261559560a08301846148af565b979650505050505050565b600060ff821660ff8416808210156155ba576155ba6152ee565b9003939250505056fe4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572a2646970667358221220de153d1b9d58481444bcb4b510590340bf20dbad71cf038a4dec996c49639ced64736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000002168747470733a2f2f697066732e67656e65746963636861696e2e696f2f6970667300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005068747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066732f516d526544645155797a54784b6350564b4c6f3961315a715742705048475878473535736169706b5258426f4553000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000005000000000000000000000000e6c5bc36214d9a09b208f397fe47bd421a5e02d9000000000000000000000000321b125cf85b0e9fbcf6554a71adb10d8138388a000000000000000000000000f91180a67a2c607523b5e32f98732d8cddd6538a000000000000000000000000a9833d5d3ff75a32709a8da2e66a7df9d2c83aa00000000000000000000000001bc2f28fb7e3be8b5905541a90e4312a9976ace1

-----Decoded View---------------
Arg [0] : baseUri (string): https://ipfs.geneticchain.io/ipfs
Arg [1] : contractUri (string): https://ipfs.geneticchain.io/ipfs/QmReDdQUyzTxKcPVKLo9a1ZqWBpPHGXxG55saipkRXBoES
Arg [2] : passes (address[]): 0xe6c5bc36214d9a09b208F397fe47Bd421a5e02D9,0x321B125CF85B0E9fBcF6554a71ADb10d8138388a,0xF91180A67A2c607523b5e32f98732D8cDDD6538A,0xa9833D5D3ff75A32709A8dA2E66A7dF9D2c83Aa0,0x1bC2f28Fb7E3be8b5905541a90e4312A9976ACE1

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000021
Arg [4] : 68747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066
Arg [5] : 7300000000000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000050
Arg [7] : 68747470733a2f2f697066732e67656e65746963636861696e2e696f2f697066
Arg [8] : 732f516d526544645155797a54784b6350564b4c6f3961315a71574270504847
Arg [9] : 5878473535736169706b5258426f455300000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [11] : 000000000000000000000000e6c5bc36214d9a09b208f397fe47bd421a5e02d9
Arg [12] : 000000000000000000000000321b125cf85b0e9fbcf6554a71adb10d8138388a
Arg [13] : 000000000000000000000000f91180a67a2c607523b5e32f98732d8cddd6538a
Arg [14] : 000000000000000000000000a9833d5d3ff75a32709a8da2e66a7df9d2c83aa0
Arg [15] : 0000000000000000000000001bc2f28fb7e3be8b5905541a90e4312a9976ace1


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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