ETH Price: $2,424.14 (-1.73%)
 

Overview

Max Total Supply

22 ULMBOXXX

Holders

22

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x000...000
Balance
0 ULMBOXXX
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
ApeUloanClaimer

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-27
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

struct TWalletApeInfo
{
    address     wallet;
    uint256     apeCoinBalance;
    uint256     theoricBoxCount;
    uint256     allowedBoxCount;
    uint256     claimedBoxCount;
}
//================================================================================
interface IERC20
{
    function balanceOf(address owner) external view returns(uint256 amount);
}
//================================================================================
interface IERC165
{
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
//================================================================================
interface IERC721 is IERC165
{
    event   Transfer(      address indexed from,  address indexed to,       uint256  indexed tokenId);
    event   Approval(      address indexed owner, address indexed approved, uint256  indexed tokenId);
    event   ApprovalForAll(address indexed owner, address indexed operator, bool             approved);

    function balanceOf(        address owner)                                   external view returns (uint256 balance);
    function ownerOf(          uint256 tokenId)                                 external view returns (address owner);
    function safeTransferFrom( address from,     address to, uint256 tokenId)   external;
    function transferFrom(     address from,     address to, uint256 tokenId)   external;
    function approve(          address to,       uint256 tokenId)               external;
    function getApproved(      uint256 tokenId)                                 external view returns (address operator);
    function setApprovalForAll(address operator, bool _approved)                external;
    function isApprovedForAll( address owner,    address operator)              external view returns (bool);
    function safeTransferFrom( address from,     address to, uint256 tokenId, bytes calldata data) external;
}
//================================================================================
interface IERC721Metadata is IERC721
{
    function name()                     external view returns (string memory);
    function symbol()                   external view returns (string memory);
    function tokenURI(uint256 tokenId)  external view returns (string memory);
}
//================================================================================
interface IERC721Enumerable is IERC721
{
    function totalSupply()                                      external view returns (uint256);
    function tokenOfOwnerByIndex(address owner, uint256 index)  external view returns (uint256 tokenId);
    function tokenByIndex(uint256 index)                        external view returns (uint256);
}
//================================================================================
interface IERC721Receiver
{
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}
//================================================================================
abstract contract ERC165 is IERC165
{
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool)
    {
        return (interfaceId == type(IERC165).interfaceId);
    }
}
//================================================================================
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;
    }
}
//================================================================================
abstract contract Ownable is Context
{
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

   
    constructor ()
    {
        address msgSender = _msgSender();
                   _owner = msgSender;
                   
        emit OwnershipTransferred(address(0), msgSender);
    }
   
   
    function owner() public view virtual returns (address)
    {
        return _owner;
    }
   
   
    modifier onlyOwner()
    {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }
   
   
    function renounceOwnership() public virtual onlyOwner
    {
        emit OwnershipTransferred(_owner, address(0));
       
        _owner = address(0);
    }
   
   
    function transferOwnership(address newOwner) public virtual onlyOwner
    {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
       
        emit OwnershipTransferred(_owner, newOwner);
       
        _owner = newOwner;
    }
}
//================================================================================
abstract contract ReentrancyGuard 
{
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED     = 2;

    uint256 private _status;

    constructor() 
    {       
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant()         // Prevents a contract from calling itself, directly or indirectly.
    {
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");    // On the first call to nonReentrant, _notEntered will be true
        _status = _ENTERED;                                                 // Any calls to nonReentrant after this point will fail
        _;
        _status = _NOT_ENTERED;                                             // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200)
    }
}
//================================================================================
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, Ownable, ReentrancyGuard
{
    using Address for address;
    using Strings for uint256;

    string private _name;   // Token name
    string private _symbol; // Token symbol

    mapping(uint256 => address)                  internal _owners;              // Mapping from token ID to owner address
    mapping(address => uint256)                  internal _balances;            // Mapping owner address to token count
    mapping(uint256 => address)                  private  _tokenApprovals;      // Mapping from token ID to approved address
    mapping(address => mapping(address => bool)) private  _operatorApprovals;   // Mapping from owner to operator approvals

   
    constructor(string memory name_, string memory symbol_)
    {
        _name   = name_;
        _symbol = symbol_;
    }
   
   
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool)
    {
        return  interfaceId == type(IERC721).interfaceId         ||
                interfaceId == type(IERC721Metadata).interfaceId ||
                super.supportsInterface(interfaceId);
    }
   
   
    function balanceOf(address owner) public view virtual override returns (uint256)
    {
        require(owner != address(0), "ERC721: balance query for the zero address");
       
        return _balances[owner];
    }
   
   
    function ownerOf(uint256 tokenId) public view virtual override returns (address)
    {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }
   
   
    function name() public view virtual override returns (string memory)
    {
        return _name;
    }
   
   
    function symbol() public view virtual override returns (string memory)
    {
        return _symbol;
    }
   
   
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory)
    {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
       
        return (bytes(baseURI).length>0) ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }
   
   
    function _baseURI() internal view virtual returns (string memory)
    {
        return "";
    }
   
   
    function approve(address to, uint256 tokenId) public virtual override
    {
        address owner = ERC721.ownerOf(tokenId);
   
        require(to!=owner, "ERC721: approval to current owner");
        require(_msgSender()==owner || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all");

        _approve(to, tokenId);
    }
   
   
    function getApproved(uint256 tokenId) public view virtual override returns (address)
    {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }
   
   
    function setApprovalForAll(address operator, bool approved) public virtual override
    {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
   
        emit ApprovalForAll(_msgSender(), operator, approved);
    }
   
   
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool)
    {
        return _operatorApprovals[owner][operator];
    }
   
   
    function transferFrom(address from, address to, uint256 tokenId) public virtual override
    {
        //----- solhint-disable-next-line max-line-length
       
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }
   
   
    function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override
    {
        safeTransferFrom(from, to, tokenId, "");
    }
   
   
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override
    {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
       
        _safeTransfer(from, to, tokenId, _data);
    }
   
   
    function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual
    {
        _transfer(from, to, tokenId);
   
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
   
   
    function _exists(uint256 tokenId) internal view virtual returns (bool)
    {
        return _owners[tokenId] != address(0);
    }
   
   
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool)
    {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
       
        address owner = ERC721.ownerOf(tokenId);
       
        return (spender == owner || getApproved(tokenId) == spender || ERC721.isApprovedForAll(owner, spender));
    }
   
   
    function _safeMint(address to, uint256 tokenId) internal virtual
    {
        _safeMint(to, tokenId, "");
    }
   
   
    function _safeMint(address to, uint256 tokenId, bytes memory _data) internal virtual
    {
        _mint(to, tokenId);
   
        require(_checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }
   
   
    function _mint(address to, uint256 tokenId) internal virtual
    {
        require(to != address(0),  "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

        emit Transfer(address(0), to, tokenId);
    }
   
   
    function _batchMint(address to, uint256[] memory tokenIds) internal virtual
    {
        require(to != address(0), "ERC721: mint to the zero address");
       
        _balances[to] += tokenIds.length;

        for (uint256 i=0; i < tokenIds.length; i++)
        {
            require(!_exists(tokenIds[i]), "ERC721: token already minted");

            _beforeTokenTransfer(address(0), to, tokenIds[i]);

            _owners[tokenIds[i]] = to;

            emit Transfer(address(0), to, tokenIds[i]);
        }
    }
   
   
    function _burn(uint256 tokenId) internal virtual
    {
        address owner = ERC721.ownerOf(tokenId);

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

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

        _balances[owner] -= 1;

        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }
   
   
    function _transfer(address from, address to, uint256 tokenId) internal virtual
    {
        require(ERC721.ownerOf(tokenId)==from,  "ERC721: transfer of token that is not own");
        require(to != address(0),               "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }
   
   
    function _approve(address to, uint256 tokenId) internal virtual
    {
        _tokenApprovals[tokenId] = to;
   
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }
   
   
    function _checkOnERC721Received(address from,address to,uint256 tokenId,bytes memory _data) private returns (bool)
    {
        if (to.isContract())
        {
            try
           
                IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
           
            returns (bytes4 retval)
            {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            }
            catch (bytes memory reason)
            {
                if (reason.length==0)
                {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                }
                else
                {
                    assembly { revert(add(32, reason), mload(reason)) }     //// solhint-disable-next-line no-inline-assembly
                }
            }
        }
        else
        {
            return true;
        }
    }
   
   
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual
    {
        //
    }
}
//================================================================================
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable
{
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;           // Mapping from owner to list of owned token IDs
    mapping(uint256 => uint256)                     private _ownedTokensIndex;      // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256)                     private _allTokensIndex;        // Mapping from token id to position in the allTokens array

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

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

    function totalSupply() public view virtual override returns (uint256)
    {
        return _allTokens.length;
    }

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

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

    function _beforeTokenTransfer(address from,address to,uint256 tokenId) internal virtual override
    {
        super._beforeTokenTransfer(from, to, tokenId);

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

    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private
    {
        uint256 length = ERC721.balanceOf(to);
   
        _ownedTokens[to][length]   = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    function _addTokenToAllTokensEnumeration(uint256 tokenId) private
    {
        _allTokensIndex[tokenId] = _allTokens.length;
   
        _allTokens.push(tokenId);
    }

    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private
    {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

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

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

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

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

    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private
    {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

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

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

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

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}
//================================================================================
library Strings
{
    bytes16 private constant alphabet = "0123456789abcdef";

   
    function toString(uint256 value) internal pure returns (string memory)
    {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value==0)       return "0";
   
        uint256 temp = value;
        uint256 digits;
   
        while (temp!=0)
        {
            digits++;
            temp /= 10;
        }
       
        bytes memory buffer = new bytes(digits);
       
        while (value != 0)
        {
            digits        -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value         /= 10;
        }
       
        return string(buffer);
    }
   
   
    function toHexString(uint256 value) internal pure returns (string memory)
    {
        if (value==0)       return "0x00";
       
        uint256 temp   = value;
        uint256 length = 0;
       
        while (temp != 0)
        {
            length++;
            temp >>= 8;
        }
       
        return toHexString(value, length);
    }
   
   
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory)
    {
        bytes memory buffer = new bytes(2 * length + 2);
       
        buffer[0] = "0";
        buffer[1] = "x";
       
        for (uint256 i=2*length+1; i>1; --i)
        {
            buffer[i] = alphabet[value & 0xf];
            value >>= 4;
        }
       
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}
//================================================================================
library Address
{
    function isContract(address account) internal view returns (bool)
    {
        uint256 size;
       
        assembly { size := extcodesize(account) }   // solhint-disable-next-line no-inline-assembly
        return size > 0;
    }
   
   
    function sendValue(address payable recipient, uint256 amount) internal
    {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{ value: amount }(""); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value

        require(success, "Address: unable to send value, recipient may have reverted");
    }
   
   
    function functionCall(address target, bytes memory data) internal returns (bytes memory)
    {
        return functionCall(target, data, "Address: low-level call failed");
    }
   
   
    function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory)
    {
        return functionCallWithValue(target, data, 0, errorMessage);
    }
   
   
    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");
    }
   
   
    function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory)
    {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target),             "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{ value: value }(data);    // solhint-disable-next-line avoid-low-level-calls

        return _verifyCallResult(success, returndata, errorMessage);
    }
   
   
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory)
    {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }
   
   
    function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory)
    {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);  // solhint-disable-next-line avoid-low-level-calls

        return _verifyCallResult(success, returndata, errorMessage);
    }
   
   
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory)
    {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }
   
   
    function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory)
    {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);    // solhint-disable-next-line avoid-low-level-calls
       
        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
        {
            if (returndata.length > 0)      // Look for revert reason and bubble it up if present
            {
                // 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);
            }
        }
    }
}
//==============================================================================
contract ApeUloanClaimer     is  ERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    modifier callerIsUser()    {  require(tx.origin == msg.sender, "The caller is another contract");  _;  }

    event   ClaimedNftsWithApeCoin(address wallet, uint256 boxCount);
    event   Reserved(address wallet, uint256 amount);

    uint256 private     totalTokens      = 1100;       // 1000+100 NFT to be created => 1000 Mysteryboxes + draws( email + twitter + discord ) 
    uint256 private     leftTokenCount   = totalTokens;
    uint256 private     mintedTokenCount = 0;

    mapping(address => uint256) private     totalClaimedBoxes;
    mapping(bytes32 => bool)    private     proposedHashes;

    string                      private     signHeader = "\x19Ethereum Signed Message:\n32";

    address                     private     admin = 0x738C30758b22bCe4EE64d4dd2dc9f0dcCd097229;

    string                      private     baseURI = '/';

    address                     private     ownerWallet;

    mapping(address => uint256) private     walletMintCounts;
    mapping(address => uint256) private     walletMintedTokenIds;
    
    mapping(uint256 => uint256) private     mintedTokenTimestamps;

    constructor() ERC721("ULoanMysteryBoxxx", "ULMBOXXX")   // temporary Symbol and title
    {
        ownerWallet = msg.sender;
    }
    //------------------------------------------------------------------------
    function    isERC721ReceivedCheck(address from,address to,uint256 tokenId,bytes memory _data) private returns (bool)
    {
        if (to.isContract())
        {
            try
               
                IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
               
            returns (bytes4 retval)
            {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            }
            catch (bytes memory reason)
            {
                if (reason.length==0)
                {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                }
                else
                {
                    assembly { revert(add(32, reason), mload(reason)) }     //// solhint-disable-next-line no-inline-assembly
                }
            }
        }
        else
        {
            return true;
        }
    }
    //------------------------------------------------------------------------
    function    setBaseTokenURI(string memory newUri) external onlyOwner
    {
        baseURI = newUri;
    }
    //------------------------------------------------------------------------
    function    addAvailableTokens(uint256 extraAmount) external onlyOwner
    {
        totalTokens    += extraAmount;
        leftTokenCount += extraAmount;
    }
    //------------------------------------------------------------------------
    function    subAvailableTokens(uint256 subAmount) external onlyOwner
    {
        require(subAmount < totalTokens,    "Invalid subAmount for totalTokens");
        require(subAmount < leftTokenCount, "Invalid subAmount for leftTokenCount");

        totalTokens    -= subAmount;
        leftTokenCount -= subAmount;
    }
    //------------------------------------------------------------------------
    function    baseTokenURI() external view returns (string memory)
    {
        return baseURI;
    }
    //------------------------------------------------------------------------
    function    getAvailableTokens() external view returns (uint256)
    {
        return leftTokenCount;
    }
    //------------------------------------------------------------------------
    function    _baseURI() internal view virtual override returns (string memory)
    {
        return baseURI;
    }
    //------------------------------------------------------------------------
    function    getTokenIdsByWallet(address walletAddress) external view returns(uint256[] memory)
    {
        require(walletAddress!=address(0), "BlackHole wallet is not a real owner");
       
        uint256          count  = balanceOf(walletAddress);
        uint256[] memory result = new uint256[](count);
       
        for (uint256 i=0; i<count; i++)
        {
            result[i] = tokenOfOwnerByIndex(walletAddress, i);
        }
       
        return result;
    }
    //---------------------------------------------------------------------------
    function    claim(uint boxCount,   bytes32 proposedHash, uint8 v, bytes32 r, bytes32 s)
            external
            callerIsUser
            nonReentrant
    {
                //----- signed function checker

        bool isProposedHashedUsed = proposedHashes[proposedHash];

        require(isProposedHashedUsed==false, "This hash was already used");

        proposedHashes[proposedHash] = true;

        bytes32 messageDigest = keccak256(abi.encodePacked(signHeader, proposedHash));
        address caller        = ecrecover(messageDigest, v, r, s);
        bool    isFromAdmin   = (caller==admin);

        require(isFromAdmin==true, "Unallowed call");

        require(boxCount<=5, "Too many boxes asked");

                //-----

        require(leftTokenCount > 0, "No more MysteryBox available");

        uint256 claimedBoxCount = totalClaimedBoxes[ msg.sender ] ;

        require(claimedBoxCount==0, "Wallet already claimed!");

                //-----

        uint256 nMinted=0;

        for (uint i; i<boxCount; i++)
        {
            walletMintCounts[msg.sender]++;
            mintedTokenCount++;
            leftTokenCount--;
        
            _safeMint(msg.sender, mintedTokenCount);

            nMinted++;

            if (leftTokenCount==0)          break;              // No more Mysteryboxes to share  
        }

        totalClaimedBoxes[msg.sender] = boxCount;               // Already recived boxes, don't allow again

        emit ClaimedNftsWithApeCoin(msg.sender, boxCount);
    }
    //---------------------------------------------------------------------------
    function    getClaimedBoxCount(address wallet) external view returns(uint256 claimedBoxCount)
    {
        return totalClaimedBoxes[ wallet ];
    }
    //---------------------------------------------------------------------------
    function    reserve(uint256 amount)  external onlyOwner
    {
        require(amount         <= 200,    "Reserve is limited to 200 per call at max");
        require(leftTokenCount >= amount, "Not enough tokens left to reserve anymore");

        walletMintCounts[msg.sender] += amount;

        for (uint256 i=0; i < amount; i++)
        {
            mintedTokenCount++;
           
            mintedTokenTimestamps[mintedTokenCount] = block.timestamp;
            
            _safeMint(msg.sender, mintedTokenCount);
        }

        leftTokenCount = totalTokens - mintedTokenCount;

        emit Reserved(msg.sender, amount);
    }
    //---------------------------------------------------------------------------
    function    massSend(address[] memory recipients, uint256[] memory tokenIds) external 
    {
        uint256 l1 = recipients.length;
        uint256 l2 = tokenIds.length;

        require(l1==l2, "recipients count doesn't match tokens");

        for (uint i; i<l1; i++)
        {
            address to = recipients[i];

            if (to==address(0x0))       continue;
            if (to==msg.sender)         continue;

            uint256 tokenId = tokenIds[i];

            transferFrom(msg.sender, to, tokenId);
        }
    }
    //---------------------------------------------------------------------------
    //---------------------------------------------------------------------------
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"boxCount","type":"uint256"}],"name":"ClaimedNftsWithApeCoin","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"wallet","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Reserved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"extraAmount","type":"uint256"}],"name":"addAvailableTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boxCount","type":"uint256"},{"internalType":"bytes32","name":"proposedHash","type":"bytes32"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getClaimedBoxCount","outputs":[{"internalType":"uint256","name":"claimedBoxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"walletAddress","type":"address"}],"name":"getTokenIdsByWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"massSend","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newUri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"subAmount","type":"uint256"}],"name":"subAvailableTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

61044c600c819055600d556000600e5560c0604052601c60808190527f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a0908152620000509160119190620001a5565b50601280546001600160a01b03191673738c30758b22bce4ee64d4dd2dc9f0dccd097229179055604080518082019091526001808252602f60f81b6020909201918252620000a191601391620001a5565b50348015620000af57600080fd5b50604051806040016040528060118152602001700aa98dec2dc9af2e6e8cae4f284def0f0f607b1b815250604051806040016040528060088152602001670aa989a849eb0b0b60c31b81525060006200010d620001a160201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055815162000170906002906020850190620001a5565b50805162000186906003906020840190620001a5565b5050601480546001600160a01b031916331790555062000287565b3390565b828054620001b3906200024b565b90600052602060002090601f016020900481019282620001d7576000855562000222565b82601f10620001f257805160ff191683800117855562000222565b8280016001018555821562000222579182015b828111156200022257825182559160200191906001019062000205565b506200023092915062000234565b5090565b5b8082111562000230576000815560010162000235565b600181811c908216806200026057607f821691505b6020821081036200028157634e487b7160e01b600052602260045260246000fd5b50919050565b61283280620002976000396000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063b88d4fde116100a2578063e35568cb11610071578063e35568cb146103df578063e6b36012146103e7578063e985e9c5146103fa578063f2fde38b1461043657600080fd5b8063b88d4fde14610388578063c87b56dd1461039b578063d547cfb7146103ae578063e2ad13a9146103b657600080fd5b80638da5cb5b116100de5780638da5cb5b1461034957806395d89b411461035a578063a22cb46514610362578063b12af2cb1461037557600080fd5b8063715018a61461031b578063819b25ba146103235780638640cffa1461033657600080fd5b80632f745c591161017157806342842e0e1161014b57806342842e0e146102cf5780634f6ccce7146102e25780636352211e146102f557806370a082311461030857600080fd5b80632f745c591461029657806330176e13146102a95780633c1aa170146102bc57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780631660b7321461025157806318160ddd1461027157806323b872dd1461028357600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611ff1565b610449565b60405190151581526020015b60405180910390f35b610204610474565b6040516101f39190612066565b61022461021f366004612079565b610506565b6040516001600160a01b0390911681526020016101f3565b61024f61024a3660046120ae565b6105a0565b005b61026461025f3660046120d8565b6106b5565b6040516101f391906120f3565b600b545b6040519081526020016101f3565b61024f610291366004612137565b6107b9565b6102756102a43660046120ae565b6107ea565b61024f6102b7366004612212565b610880565b61024f6102ca366004612079565b6108c1565b61024f6102dd366004612137565b6109d6565b6102756102f0366004612079565b6109f1565b610224610303366004612079565b610a84565b6102756103163660046120d8565b610afb565b61024f610b82565b61024f610331366004612079565b610bf6565b61024f61034436600461225b565b610daf565b6000546001600160a01b0316610224565b61020461118e565b61024f6103703660046122aa565b61119d565b61024f610383366004612375565b611261565b61024f610396366004612435565b611366565b6102046103a9366004612079565b61139e565b610204611479565b6102756103c43660046120d8565b6001600160a01b03166000908152600f602052604090205490565b600d54610275565b61024f6103f5366004612079565b611488565b6101e76104083660046124b1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024f6104443660046120d8565b6114dd565b60006001600160e01b0319821663780e9d6360e01b148061046e575061046e826115c7565b92915050565b606060028054610483906124e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104af906124e4565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b03166105845760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105ab82610a84565b9050806001600160a01b0316836001600160a01b0316036106185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161057b565b336001600160a01b038216148061063457506106348133610408565b6106a65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161057b565b6106b08383611617565b505050565b60606001600160a01b0382166107195760405162461bcd60e51b8152602060048201526024808201527f426c61636b486f6c652077616c6c6574206973206e6f742061207265616c206f6044820152633bb732b960e11b606482015260840161057b565b600061072483610afb565b905060008167ffffffffffffffff81111561074157610741612173565b60405190808252806020026020018201604052801561076a578160200160208202803683370190505b50905060005b828110156107b15761078285826107ea565b8282815181106107945761079461251e565b6020908102919091010152806107a98161254a565b915050610770565b509392505050565b6107c33382611685565b6107df5760405162461bcd60e51b815260040161057b90612563565b6106b083838361177c565b60006107f583610afb565b82106108575760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161057b565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6000546001600160a01b031633146108aa5760405162461bcd60e51b815260040161057b906125b4565b80516108bd906013906020840190611f3f565b5050565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161057b906125b4565b600c5481106109465760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420737562416d6f756e7420666f7220746f74616c546f6b656e6044820152607360f81b606482015260840161057b565b600d5481106109a35760405162461bcd60e51b8152602060048201526024808201527f496e76616c696420737562416d6f756e7420666f72206c656674546f6b656e436044820152631bdd5b9d60e21b606482015260840161057b565b80600c60008282546109b591906125e9565b9250508190555080600d60008282546109ce91906125e9565b909155505050565b6106b083838360405180602001604052806000815250611366565b60006109fc600b5490565b8210610a5f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161057b565b600b8281548110610a7257610a7261251e565b90600052602060002001549050919050565b6000818152600460205260408120546001600160a01b03168061046e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161057b565b60006001600160a01b038216610b665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161057b565b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610bac5760405162461bcd60e51b815260040161057b906125b4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610c205760405162461bcd60e51b815260040161057b906125b4565b60c8811115610c835760405162461bcd60e51b815260206004820152602960248201527f52657365727665206973206c696d6974656420746f20323030207065722063616044820152680d8d840c2e840dac2f60bb1b606482015260840161057b565b80600d541015610ce75760405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766044820152686520616e796d6f726560b81b606482015260840161057b565b3360009081526015602052604081208054839290610d06908490612600565b90915550600090505b81811015610d5f57600e8054906000610d278361254a565b9091555050600e8054600090815260176020526040902042905554610d4d903390611927565b80610d578161254a565b915050610d0f565b50600e54600c54610d7091906125e9565b600d5560408051338152602081018390527f904dcdc411e931497b95b06ddf8f8184815dd3bedc3c7c7cd4aed3ccd30783d8910160405180910390a150565b323314610dfe5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161057b565b600260015403610e505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161057b565b600260015560008481526010602052604090205460ff168015610eb55760405162461bcd60e51b815260206004820152601a60248201527f5468697320686173682077617320616c72656164792075736564000000000000604482015260640161057b565b6000858152601060209081526040808320805460ff1916600117905551610ee191601191899101612618565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610f4c573d6000803e3d6000fd5b5050604051601f1901516012549092506001600160a01b03808416911614905060018114610fad5760405162461bcd60e51b815260206004820152600e60248201526d155b985b1b1bddd9590818d85b1b60921b604482015260640161057b565b6005891115610ff55760405162461bcd60e51b8152602060048201526014602482015273151bdbc81b585b9e48189bde195cc8185cdad95960621b604482015260640161057b565b6000600d54116110475760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265204d797374657279426f7820617661696c61626c6500000000604482015260640161057b565b336000908152600f602052604090205480156110a55760405162461bcd60e51b815260206004820152601760248201527f57616c6c657420616c726561647920636c61696d656421000000000000000000604482015260640161057b565b6000805b8b811015611131573360009081526015602052604081208054916110cc8361254a565b9091555050600e80549060006110e18361254a565b9091555050600d80549060006110f6836126b6565b919050555061110733600e54611927565b816111118161254a565b925050600d546000031561113157806111298161254a565b9150506110a9565b50336000818152600f60209081526040918290208e9055815192835282018d90527f5950f8f847391657e6cce7c70212227aaa283c49f5ad0f3e6a3b841d3d7c75ac910160405180910390a1505060018055505050505050505050565b606060038054610483906124e4565b336001600160a01b038316036111f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161057b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b815181518082146112c25760405162461bcd60e51b815260206004820152602560248201527f726563697069656e747320636f756e7420646f65736e2774206d6174636820746044820152646f6b656e7360d81b606482015260840161057b565b60005b8281101561135f5760008582815181106112e1576112e161251e565b6020026020010151905060006001600160a01b0316816001600160a01b03160361130b575061134d565b336001600160a01b03821603611321575061134d565b60008583815181106113355761133561251e565b6020026020010151905061134a3383836107b9565b50505b806113578161254a565b9150506112c5565b5050505050565b6113703383611685565b61138c5760405162461bcd60e51b815260040161057b90612563565b61139884848484611941565b50505050565b6000818152600460205260409020546060906001600160a01b031661141d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161057b565b6000611427611479565b905060008151116114475760405180602001604052806000815250611472565b8061145184611974565b6040516020016114629291906126cd565b6040516020818303038152906040525b9392505050565b606060138054610483906124e4565b6000546001600160a01b031633146114b25760405162461bcd60e51b815260040161057b906125b4565b80600c60008282546114c49190612600565b9250508190555080600d60008282546109ce9190612600565b6000546001600160a01b031633146115075760405162461bcd60e51b815260040161057b906125b4565b6001600160a01b03811661156c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806115f857506001600160e01b03198216635b5e139f60e01b145b8061046e57506301ffc9a760e01b6001600160e01b031983161461046e565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061164c82610a84565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166116fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161057b565b600061170983610a84565b9050806001600160a01b0316846001600160a01b031614806117445750836001600160a01b031661173984610506565b6001600160a01b0316145b8061177457506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661178f82610a84565b6001600160a01b0316146117f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161057b565b6001600160a01b0382166118595760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161057b565b611864838383611a75565b61186f600082611617565b6001600160a01b03831660009081526005602052604081208054600192906118989084906125e9565b90915550506001600160a01b03821660009081526005602052604081208054600192906118c6908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6108bd828260405180602001604052806000815250611b2d565b61194c84848461177c565b61195884848484611b60565b6113985760405162461bcd60e51b815260040161057b906126fc565b60608160000361199b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119c557806119af8161254a565b91506119be9050600a83612764565b915061199f565b60008167ffffffffffffffff8111156119e0576119e0612173565b6040519080825280601f01601f191660200182016040528015611a0a576020820181803683370190505b5090505b841561177457611a1f6001836125e9565b9150611a2c600a86612778565b611a37906030612600565b60f81b818381518110611a4c57611a4c61251e565b60200101906001600160f81b031916908160001a905350611a6e600a86612764565b9450611a0e565b6001600160a01b038316611ad057611acb81600b80546000838152600a60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b611af3565b816001600160a01b0316836001600160a01b031614611af357611af38382611c61565b6001600160a01b038216611b0a576106b081611cfe565b826001600160a01b0316826001600160a01b0316146106b0576106b08282611dad565b611b378383611df1565b611b446000848484611b60565b6106b05760405162461bcd60e51b815260040161057b906126fc565b60006001600160a01b0384163b15611c5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ba490339089908890889060040161278c565b6020604051808303816000875af1925050508015611bdf575060408051601f3d908101601f19168201909252611bdc918101906127c9565b60015b611c3c573d808015611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b508051600003611c345760405162461bcd60e51b815260040161057b906126fc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611774565b506001949350505050565b60006001611c6e84610afb565b611c7891906125e9565b600083815260096020526040902054909150808214611ccb576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600b54600090611d10906001906125e9565b6000838152600a6020526040812054600b8054939450909284908110611d3857611d3861251e565b9060005260206000200154905080600b8381548110611d5957611d5961251e565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600b805480611d9157611d916127e6565b6001900381819060005260206000200160009055905550505050565b6000611db883610afb565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160a01b038216611e475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161057b565b6000818152600460205260409020546001600160a01b031615611eac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057b565b611eb860008383611a75565b6001600160a01b0382166000908152600560205260408120805460019290611ee1908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f4b906124e4565b90600052602060002090601f016020900481019282611f6d5760008555611fb3565b82601f10611f8657805160ff1916838001178555611fb3565b82800160010185558215611fb3579182015b82811115611fb3578251825591602001919060010190611f98565b50611fbf929150611fc3565b5090565b5b80821115611fbf5760008155600101611fc4565b6001600160e01b031981168114611fee57600080fd5b50565b60006020828403121561200357600080fd5b813561147281611fd8565b60005b83811015612029578181015183820152602001612011565b838111156113985750506000910152565b6000815180845261205281602086016020860161200e565b601f01601f19169290920160200192915050565b602081526000611472602083018461203a565b60006020828403121561208b57600080fd5b5035919050565b80356001600160a01b03811681146120a957600080fd5b919050565b600080604083850312156120c157600080fd5b6120ca83612092565b946020939093013593505050565b6000602082840312156120ea57600080fd5b61147282612092565b6020808252825182820181905260009190848201906040850190845b8181101561212b5783518352928401929184019160010161210f565b50909695505050505050565b60008060006060848603121561214c57600080fd5b61215584612092565b925061216360208501612092565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121b2576121b2612173565b604052919050565b600067ffffffffffffffff8311156121d4576121d4612173565b6121e7601f8401601f1916602001612189565b90508281528383830111156121fb57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561222457600080fd5b813567ffffffffffffffff81111561223b57600080fd5b8201601f8101841361224c57600080fd5b611774848235602084016121ba565b600080600080600060a0868803121561227357600080fd5b8535945060208601359350604086013560ff8116811461229257600080fd5b94979396509394606081013594506080013592915050565b600080604083850312156122bd57600080fd5b6122c683612092565b9150602083013580151581146122db57600080fd5b809150509250929050565b600067ffffffffffffffff82111561230057612300612173565b5060051b60200190565b600082601f83011261231b57600080fd5b8135602061233061232b836122e6565b612189565b82815260059290921b8401810191818101908684111561234f57600080fd5b8286015b8481101561236a5780358352918301918301612353565b509695505050505050565b6000806040838503121561238857600080fd5b823567ffffffffffffffff808211156123a057600080fd5b818501915085601f8301126123b457600080fd5b813560206123c461232b836122e6565b82815260059290921b840181019181810190898411156123e357600080fd5b948201945b83861015612408576123f986612092565b825294820194908201906123e8565b9650508601359250508082111561241e57600080fd5b5061242b8582860161230a565b9150509250929050565b6000806000806080858703121561244b57600080fd5b61245485612092565b935061246260208601612092565b925060408501359150606085013567ffffffffffffffff81111561248557600080fd5b8501601f8101871361249657600080fd5b6124a5878235602084016121ba565b91505092959194509250565b600080604083850312156124c457600080fd5b6124cd83612092565b91506124db60208401612092565b90509250929050565b600181811c908216806124f857607f821691505b60208210810361251857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161255c5761255c612534565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000828210156125fb576125fb612534565b500390565b6000821982111561261357612613612534565b500190565b600080845481600182811c91508083168061263457607f831692505b6020808410820361265357634e487b7160e01b86526022600452602486fd5b8180156126675760018114612678576126a5565b60ff198616895284890196506126a5565b60008b81526020902060005b8681101561269d5781548b820152908501908301612684565b505084890196505b509785525050509301949350505050565b6000816126c5576126c5612534565b506000190190565b600083516126df81846020880161200e565b8351908301906126f381836020880161200e565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826127735761277361274e565b500490565b6000826127875761278761274e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127bf9083018461203a565b9695505050505050565b6000602082840312156127db57600080fd5b815161147281611fd8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220264d48447c84110bdb343ef4166320e8431bdf864cd6c817014f6697038631ea64736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063715018a611610104578063b88d4fde116100a2578063e35568cb11610071578063e35568cb146103df578063e6b36012146103e7578063e985e9c5146103fa578063f2fde38b1461043657600080fd5b8063b88d4fde14610388578063c87b56dd1461039b578063d547cfb7146103ae578063e2ad13a9146103b657600080fd5b80638da5cb5b116100de5780638da5cb5b1461034957806395d89b411461035a578063a22cb46514610362578063b12af2cb1461037557600080fd5b8063715018a61461031b578063819b25ba146103235780638640cffa1461033657600080fd5b80632f745c591161017157806342842e0e1161014b57806342842e0e146102cf5780634f6ccce7146102e25780636352211e146102f557806370a082311461030857600080fd5b80632f745c591461029657806330176e13146102a95780633c1aa170146102bc57600080fd5b8063095ea7b3116101ad578063095ea7b31461023c5780631660b7321461025157806318160ddd1461027157806323b872dd1461028357600080fd5b806301ffc9a7146101d457806306fdde03146101fc578063081812fc14610211575b600080fd5b6101e76101e2366004611ff1565b610449565b60405190151581526020015b60405180910390f35b610204610474565b6040516101f39190612066565b61022461021f366004612079565b610506565b6040516001600160a01b0390911681526020016101f3565b61024f61024a3660046120ae565b6105a0565b005b61026461025f3660046120d8565b6106b5565b6040516101f391906120f3565b600b545b6040519081526020016101f3565b61024f610291366004612137565b6107b9565b6102756102a43660046120ae565b6107ea565b61024f6102b7366004612212565b610880565b61024f6102ca366004612079565b6108c1565b61024f6102dd366004612137565b6109d6565b6102756102f0366004612079565b6109f1565b610224610303366004612079565b610a84565b6102756103163660046120d8565b610afb565b61024f610b82565b61024f610331366004612079565b610bf6565b61024f61034436600461225b565b610daf565b6000546001600160a01b0316610224565b61020461118e565b61024f6103703660046122aa565b61119d565b61024f610383366004612375565b611261565b61024f610396366004612435565b611366565b6102046103a9366004612079565b61139e565b610204611479565b6102756103c43660046120d8565b6001600160a01b03166000908152600f602052604090205490565b600d54610275565b61024f6103f5366004612079565b611488565b6101e76104083660046124b1565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b61024f6104443660046120d8565b6114dd565b60006001600160e01b0319821663780e9d6360e01b148061046e575061046e826115c7565b92915050565b606060028054610483906124e4565b80601f01602080910402602001604051908101604052809291908181526020018280546104af906124e4565b80156104fc5780601f106104d1576101008083540402835291602001916104fc565b820191906000526020600020905b8154815290600101906020018083116104df57829003601f168201915b5050505050905090565b6000818152600460205260408120546001600160a01b03166105845760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600660205260409020546001600160a01b031690565b60006105ab82610a84565b9050806001600160a01b0316836001600160a01b0316036106185760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161057b565b336001600160a01b038216148061063457506106348133610408565b6106a65760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161057b565b6106b08383611617565b505050565b60606001600160a01b0382166107195760405162461bcd60e51b8152602060048201526024808201527f426c61636b486f6c652077616c6c6574206973206e6f742061207265616c206f6044820152633bb732b960e11b606482015260840161057b565b600061072483610afb565b905060008167ffffffffffffffff81111561074157610741612173565b60405190808252806020026020018201604052801561076a578160200160208202803683370190505b50905060005b828110156107b15761078285826107ea565b8282815181106107945761079461251e565b6020908102919091010152806107a98161254a565b915050610770565b509392505050565b6107c33382611685565b6107df5760405162461bcd60e51b815260040161057b90612563565b6106b083838361177c565b60006107f583610afb565b82106108575760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161057b565b506001600160a01b03919091166000908152600860209081526040808320938352929052205490565b6000546001600160a01b031633146108aa5760405162461bcd60e51b815260040161057b906125b4565b80516108bd906013906020840190611f3f565b5050565b6000546001600160a01b031633146108eb5760405162461bcd60e51b815260040161057b906125b4565b600c5481106109465760405162461bcd60e51b815260206004820152602160248201527f496e76616c696420737562416d6f756e7420666f7220746f74616c546f6b656e6044820152607360f81b606482015260840161057b565b600d5481106109a35760405162461bcd60e51b8152602060048201526024808201527f496e76616c696420737562416d6f756e7420666f72206c656674546f6b656e436044820152631bdd5b9d60e21b606482015260840161057b565b80600c60008282546109b591906125e9565b9250508190555080600d60008282546109ce91906125e9565b909155505050565b6106b083838360405180602001604052806000815250611366565b60006109fc600b5490565b8210610a5f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161057b565b600b8281548110610a7257610a7261251e565b90600052602060002001549050919050565b6000818152600460205260408120546001600160a01b03168061046e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161057b565b60006001600160a01b038216610b665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161057b565b506001600160a01b031660009081526005602052604090205490565b6000546001600160a01b03163314610bac5760405162461bcd60e51b815260040161057b906125b4565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b03163314610c205760405162461bcd60e51b815260040161057b906125b4565b60c8811115610c835760405162461bcd60e51b815260206004820152602960248201527f52657365727665206973206c696d6974656420746f20323030207065722063616044820152680d8d840c2e840dac2f60bb1b606482015260840161057b565b80600d541015610ce75760405162461bcd60e51b815260206004820152602960248201527f4e6f7420656e6f75676820746f6b656e73206c65667420746f207265736572766044820152686520616e796d6f726560b81b606482015260840161057b565b3360009081526015602052604081208054839290610d06908490612600565b90915550600090505b81811015610d5f57600e8054906000610d278361254a565b9091555050600e8054600090815260176020526040902042905554610d4d903390611927565b80610d578161254a565b915050610d0f565b50600e54600c54610d7091906125e9565b600d5560408051338152602081018390527f904dcdc411e931497b95b06ddf8f8184815dd3bedc3c7c7cd4aed3ccd30783d8910160405180910390a150565b323314610dfe5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000604482015260640161057b565b600260015403610e505760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161057b565b600260015560008481526010602052604090205460ff168015610eb55760405162461bcd60e51b815260206004820152601a60248201527f5468697320686173682077617320616c72656164792075736564000000000000604482015260640161057b565b6000858152601060209081526040808320805460ff1916600117905551610ee191601191899101612618565b60408051601f198184030181528282528051602091820120600080855291840180845281905260ff89169284019290925260608301879052608083018690529092509060019060a0016020604051602081039080840390855afa158015610f4c573d6000803e3d6000fd5b5050604051601f1901516012549092506001600160a01b03808416911614905060018114610fad5760405162461bcd60e51b815260206004820152600e60248201526d155b985b1b1bddd9590818d85b1b60921b604482015260640161057b565b6005891115610ff55760405162461bcd60e51b8152602060048201526014602482015273151bdbc81b585b9e48189bde195cc8185cdad95960621b604482015260640161057b565b6000600d54116110475760405162461bcd60e51b815260206004820152601c60248201527f4e6f206d6f7265204d797374657279426f7820617661696c61626c6500000000604482015260640161057b565b336000908152600f602052604090205480156110a55760405162461bcd60e51b815260206004820152601760248201527f57616c6c657420616c726561647920636c61696d656421000000000000000000604482015260640161057b565b6000805b8b811015611131573360009081526015602052604081208054916110cc8361254a565b9091555050600e80549060006110e18361254a565b9091555050600d80549060006110f6836126b6565b919050555061110733600e54611927565b816111118161254a565b925050600d546000031561113157806111298161254a565b9150506110a9565b50336000818152600f60209081526040918290208e9055815192835282018d90527f5950f8f847391657e6cce7c70212227aaa283c49f5ad0f3e6a3b841d3d7c75ac910160405180910390a1505060018055505050505050505050565b606060038054610483906124e4565b336001600160a01b038316036111f55760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161057b565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b815181518082146112c25760405162461bcd60e51b815260206004820152602560248201527f726563697069656e747320636f756e7420646f65736e2774206d6174636820746044820152646f6b656e7360d81b606482015260840161057b565b60005b8281101561135f5760008582815181106112e1576112e161251e565b6020026020010151905060006001600160a01b0316816001600160a01b03160361130b575061134d565b336001600160a01b03821603611321575061134d565b60008583815181106113355761133561251e565b6020026020010151905061134a3383836107b9565b50505b806113578161254a565b9150506112c5565b5050505050565b6113703383611685565b61138c5760405162461bcd60e51b815260040161057b90612563565b61139884848484611941565b50505050565b6000818152600460205260409020546060906001600160a01b031661141d5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161057b565b6000611427611479565b905060008151116114475760405180602001604052806000815250611472565b8061145184611974565b6040516020016114629291906126cd565b6040516020818303038152906040525b9392505050565b606060138054610483906124e4565b6000546001600160a01b031633146114b25760405162461bcd60e51b815260040161057b906125b4565b80600c60008282546114c49190612600565b9250508190555080600d60008282546109ce9190612600565b6000546001600160a01b031633146115075760405162461bcd60e51b815260040161057b906125b4565b6001600160a01b03811661156c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161057b565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b14806115f857506001600160e01b03198216635b5e139f60e01b145b8061046e57506301ffc9a760e01b6001600160e01b031983161461046e565b600081815260066020526040902080546001600160a01b0319166001600160a01b038416908117909155819061164c82610a84565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600460205260408120546001600160a01b03166116fe5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161057b565b600061170983610a84565b9050806001600160a01b0316846001600160a01b031614806117445750836001600160a01b031661173984610506565b6001600160a01b0316145b8061177457506001600160a01b0380821660009081526007602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661178f82610a84565b6001600160a01b0316146117f75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161057b565b6001600160a01b0382166118595760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161057b565b611864838383611a75565b61186f600082611617565b6001600160a01b03831660009081526005602052604081208054600192906118989084906125e9565b90915550506001600160a01b03821660009081526005602052604081208054600192906118c6908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6108bd828260405180602001604052806000815250611b2d565b61194c84848461177c565b61195884848484611b60565b6113985760405162461bcd60e51b815260040161057b906126fc565b60608160000361199b5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156119c557806119af8161254a565b91506119be9050600a83612764565b915061199f565b60008167ffffffffffffffff8111156119e0576119e0612173565b6040519080825280601f01601f191660200182016040528015611a0a576020820181803683370190505b5090505b841561177457611a1f6001836125e9565b9150611a2c600a86612778565b611a37906030612600565b60f81b818381518110611a4c57611a4c61251e565b60200101906001600160f81b031916908160001a905350611a6e600a86612764565b9450611a0e565b6001600160a01b038316611ad057611acb81600b80546000838152600a60205260408120829055600182018355919091527f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90155565b611af3565b816001600160a01b0316836001600160a01b031614611af357611af38382611c61565b6001600160a01b038216611b0a576106b081611cfe565b826001600160a01b0316826001600160a01b0316146106b0576106b08282611dad565b611b378383611df1565b611b446000848484611b60565b6106b05760405162461bcd60e51b815260040161057b906126fc565b60006001600160a01b0384163b15611c5657604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290611ba490339089908890889060040161278c565b6020604051808303816000875af1925050508015611bdf575060408051601f3d908101601f19168201909252611bdc918101906127c9565b60015b611c3c573d808015611c0d576040519150601f19603f3d011682016040523d82523d6000602084013e611c12565b606091505b508051600003611c345760405162461bcd60e51b815260040161057b906126fc565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611774565b506001949350505050565b60006001611c6e84610afb565b611c7891906125e9565b600083815260096020526040902054909150808214611ccb576001600160a01b03841660009081526008602090815260408083208584528252808320548484528184208190558352600990915290208190555b5060009182526009602090815260408084208490556001600160a01b039094168352600881528383209183525290812055565b600b54600090611d10906001906125e9565b6000838152600a6020526040812054600b8054939450909284908110611d3857611d3861251e565b9060005260206000200154905080600b8381548110611d5957611d5961251e565b6000918252602080832090910192909255828152600a9091526040808220849055858252812055600b805480611d9157611d916127e6565b6001900381819060005260206000200160009055905550505050565b6000611db883610afb565b6001600160a01b039093166000908152600860209081526040808320868452825280832085905593825260099052919091209190915550565b6001600160a01b038216611e475760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161057b565b6000818152600460205260409020546001600160a01b031615611eac5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161057b565b611eb860008383611a75565b6001600160a01b0382166000908152600560205260408120805460019290611ee1908490612600565b909155505060008181526004602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054611f4b906124e4565b90600052602060002090601f016020900481019282611f6d5760008555611fb3565b82601f10611f8657805160ff1916838001178555611fb3565b82800160010185558215611fb3579182015b82811115611fb3578251825591602001919060010190611f98565b50611fbf929150611fc3565b5090565b5b80821115611fbf5760008155600101611fc4565b6001600160e01b031981168114611fee57600080fd5b50565b60006020828403121561200357600080fd5b813561147281611fd8565b60005b83811015612029578181015183820152602001612011565b838111156113985750506000910152565b6000815180845261205281602086016020860161200e565b601f01601f19169290920160200192915050565b602081526000611472602083018461203a565b60006020828403121561208b57600080fd5b5035919050565b80356001600160a01b03811681146120a957600080fd5b919050565b600080604083850312156120c157600080fd5b6120ca83612092565b946020939093013593505050565b6000602082840312156120ea57600080fd5b61147282612092565b6020808252825182820181905260009190848201906040850190845b8181101561212b5783518352928401929184019160010161210f565b50909695505050505050565b60008060006060848603121561214c57600080fd5b61215584612092565b925061216360208501612092565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156121b2576121b2612173565b604052919050565b600067ffffffffffffffff8311156121d4576121d4612173565b6121e7601f8401601f1916602001612189565b90508281528383830111156121fb57600080fd5b828260208301376000602084830101529392505050565b60006020828403121561222457600080fd5b813567ffffffffffffffff81111561223b57600080fd5b8201601f8101841361224c57600080fd5b611774848235602084016121ba565b600080600080600060a0868803121561227357600080fd5b8535945060208601359350604086013560ff8116811461229257600080fd5b94979396509394606081013594506080013592915050565b600080604083850312156122bd57600080fd5b6122c683612092565b9150602083013580151581146122db57600080fd5b809150509250929050565b600067ffffffffffffffff82111561230057612300612173565b5060051b60200190565b600082601f83011261231b57600080fd5b8135602061233061232b836122e6565b612189565b82815260059290921b8401810191818101908684111561234f57600080fd5b8286015b8481101561236a5780358352918301918301612353565b509695505050505050565b6000806040838503121561238857600080fd5b823567ffffffffffffffff808211156123a057600080fd5b818501915085601f8301126123b457600080fd5b813560206123c461232b836122e6565b82815260059290921b840181019181810190898411156123e357600080fd5b948201945b83861015612408576123f986612092565b825294820194908201906123e8565b9650508601359250508082111561241e57600080fd5b5061242b8582860161230a565b9150509250929050565b6000806000806080858703121561244b57600080fd5b61245485612092565b935061246260208601612092565b925060408501359150606085013567ffffffffffffffff81111561248557600080fd5b8501601f8101871361249657600080fd5b6124a5878235602084016121ba565b91505092959194509250565b600080604083850312156124c457600080fd5b6124cd83612092565b91506124db60208401612092565b90509250929050565b600181811c908216806124f857607f821691505b60208210810361251857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161255c5761255c612534565b5060010190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000828210156125fb576125fb612534565b500390565b6000821982111561261357612613612534565b500190565b600080845481600182811c91508083168061263457607f831692505b6020808410820361265357634e487b7160e01b86526022600452602486fd5b8180156126675760018114612678576126a5565b60ff198616895284890196506126a5565b60008b81526020902060005b8681101561269d5781548b820152908501908301612684565b505084890196505b509785525050509301949350505050565b6000816126c5576126c5612534565b506000190190565b600083516126df81846020880161200e565b8351908301906126f381836020880161200e565b01949350505050565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b6000826127735761277361274e565b500490565b6000826127875761278761274e565b500690565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906127bf9083018461203a565b9695505050505050565b6000602082840312156127db57600080fd5b815161147281611fd8565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220264d48447c84110bdb343ef4166320e8431bdf864cd6c817014f6697038631ea64736f6c634300080d0033

Deployed Bytecode Sourcemap

25574:7917:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15589:229;;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;15589:229:0;;;;;;;;7734:105;;;:::i;:::-;;;;;;;:::i;8860:226::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;8860:226:0;1528:203:1;8459:385:0;;;;;;:::i;:::-;;:::i;:::-;;29543:489;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;15826:118::-;15919:10;:17;15826:118;;;3147:25:1;;;3135:2;3120:18;15826:118:0;3001:177:1;9608:325:0;;;;;;:::i;:::-;;:::i;15952:266::-;;;;;;:::i;:::-;;:::i;28096:109::-;;;;;;:::i;:::-;;:::i;28541:329::-;;;;;;:::i;:::-;;:::i;9949:156::-;;;;;;:::i;:::-;;:::i;16226:243::-;;;;;;:::i;:::-;;:::i;7474:244::-;;;;;;:::i;:::-;;:::i;7236:222::-;;;;;;:::i;:::-;;:::i;4551:162::-;;;:::i;32024:658::-;;;;;;:::i;:::-;;:::i;30121:1573::-;;;;;;:::i;:::-;;:::i;4302:92::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;4302:92;;7855:109;;;:::i;9102:305::-;;;;;;:::i;:::-;;:::i;32771:551::-;;;;;;:::i;:::-;;:::i;10121:299::-;;;;;;:::i;:::-;;:::i;7980:348::-;;;;;;:::i;:::-;;:::i;28956:103::-;;;:::i;31783:152::-;;;;;;:::i;:::-;-1:-1:-1;;;;;31900:27:0;31852:23;31900:27;;;:17;:27;;;;;;;31783:152;29145:110;29233:14;;29145:110;;28291:164;;;;;;:::i;:::-;;:::i;9423:169::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9549:25:0;;;9520:4;9549:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9423:169;4729:267;;;;;;:::i;:::-;;:::i;15589:229::-;15691:4;-1:-1:-1;;;;;;15720:50:0;;-1:-1:-1;;;15720:50:0;;:90;;;15774:36;15798:11;15774:23;:36::i;:::-;15713:97;15589:229;-1:-1:-1;;15589:229:0:o;7734:105::-;7788:13;7826:5;7819:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7734:105;:::o;8860:226::-;8936:7;10828:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10828:16:0;8961:73;;;;-1:-1:-1;;;8961:73:0;;9226:2:1;8961:73:0;;;9208:21:1;9265:2;9245:18;;;9238:30;9304:34;9284:18;;;9277:62;-1:-1:-1;;;9355:18:1;;;9348:42;9407:19;;8961:73:0;;;;;;;;;-1:-1:-1;9054:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;9054:24:0;;8860:226::o;8459:385::-;8545:13;8561:23;8576:7;8561:14;:23::i;:::-;8545:39;;8612:5;-1:-1:-1;;;;;8608:9:0;:2;-1:-1:-1;;;;;8608:9:0;;8600:55;;;;-1:-1:-1;;;8600:55:0;;9639:2:1;8600:55:0;;;9621:21:1;9678:2;9658:18;;;9651:30;9717:34;9697:18;;;9690:62;-1:-1:-1;;;9768:18:1;;;9761:31;9809:19;;8600:55:0;9437:397:1;8600:55:0;3559:10;-1:-1:-1;;;;;8674:19:0;;;;:67;;-1:-1:-1;8697:44:0;8721:5;3559:10;9423:169;:::i;8697:44::-;8666:136;;;;-1:-1:-1;;;8666:136:0;;10041:2:1;8666:136:0;;;10023:21:1;10080:2;10060:18;;;10053:30;10119:34;10099:18;;;10092:62;10190:26;10170:18;;;10163:54;10234:19;;8666:136:0;9839:420:1;8666:136:0;8815:21;8824:2;8828:7;8815:8;:21::i;:::-;8534:310;8459:385;;:::o;29543:489::-;29620:16;-1:-1:-1;;;;;29662:25:0;;29654:74;;;;-1:-1:-1;;;29654:74:0;;10466:2:1;29654:74:0;;;10448:21:1;10505:2;10485:18;;;10478:30;10544:34;10524:18;;;10517:62;-1:-1:-1;;;10595:18:1;;;10588:34;10639:19;;29654:74:0;10264:400:1;29654:74:0;29748:22;29774:24;29784:13;29774:9;:24::i;:::-;29748:50;;29809:23;29849:5;29835:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29835:20:0;;29809:46;;29880:9;29875:117;29895:5;29893:1;:7;29875:117;;;29943:37;29963:13;29978:1;29943:19;:37::i;:::-;29931:6;29938:1;29931:9;;;;;;;;:::i;:::-;;;;;;;;;;:49;29902:3;;;;:::i;:::-;;;;29875:117;;;-1:-1:-1;30018:6:0;29543:489;-1:-1:-1;;;29543:489:0:o;9608:325::-;9789:41;3559:10;9822:7;9789:18;:41::i;:::-;9781:103;;;;-1:-1:-1;;;9781:103:0;;;;;;;:::i;:::-;9897:28;9907:4;9913:2;9917:7;9897:9;:28::i;15952:266::-;16049:7;16090:23;16107:5;16090:16;:23::i;:::-;16082:5;:31;16074:87;;;;-1:-1:-1;;;16074:87:0;;11693:2:1;16074:87:0;;;11675:21:1;11732:2;11712:18;;;11705:30;11771:34;11751:18;;;11744:62;-1:-1:-1;;;11822:18:1;;;11815:41;11873:19;;16074:87:0;11491:407:1;16074:87:0;-1:-1:-1;;;;;;16184:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;15952:266::o;28096:109::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;28181:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;28096:109:::0;:::o;28541:329::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;28646:11:::1;;28634:9;:23;28626:72;;;::::0;-1:-1:-1;;;28626:72:0;;12466:2:1;28626:72:0::1;::::0;::::1;12448:21:1::0;12505:2;12485:18;;;12478:30;12544:34;12524:18;;;12517:62;-1:-1:-1;;;12595:18:1;;;12588:31;12636:19;;28626:72:0::1;12264:397:1::0;28626:72:0::1;28729:14;;28717:9;:26;28709:75;;;::::0;-1:-1:-1;;;28709:75:0;;12868:2:1;28709:75:0::1;::::0;::::1;12850:21:1::0;12907:2;12887:18;;;12880:30;12946:34;12926:18;;;12919:62;-1:-1:-1;;;12997:18:1;;;12990:34;13041:19;;28709:75:0::1;12666:400:1::0;28709:75:0::1;28815:9;28797:11;;:27;;;;;;;:::i;:::-;;;;;;;;28853:9;28835:14;;:27;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;28541:329:0:o;9949:156::-;10058:39;10075:4;10081:2;10085:7;10058:39;;;;;;;;;;;;:16;:39::i;16226:243::-;16301:7;16342:30;15919:10;:17;;15826:118;16342:30;16334:5;:38;16326:95;;;;-1:-1:-1;;;16326:95:0;;13403:2:1;16326:95:0;;;13385:21:1;13442:2;13422:18;;;13415:30;13481:34;13461:18;;;13454:62;-1:-1:-1;;;13532:18:1;;;13525:42;13584:19;;16326:95:0;13201:408:1;16326:95:0;16444:10;16455:5;16444:17;;;;;;;;:::i;:::-;;;;;;;;;16437:24;;16226:243;;;:::o;7474:244::-;7546:7;7587:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7587:16:0;;7614:73;;;;-1:-1:-1;;;7614:73:0;;13816:2:1;7614:73:0;;;13798:21:1;13855:2;13835:18;;;13828:30;13894:34;13874:18;;;13867:62;-1:-1:-1;;;13945:18:1;;;13938:39;13994:19;;7614:73:0;13614:405:1;7236:222:0;7308:7;-1:-1:-1;;;;;7341:19:0;;7333:74;;;;-1:-1:-1;;;7333:74:0;;14226:2:1;7333:74:0;;;14208:21:1;14265:2;14245:18;;;14238:30;14304:34;14284:18;;;14277:62;-1:-1:-1;;;14355:18:1;;;14348:40;14405:19;;7333:74:0;14024:406:1;7333:74:0;-1:-1:-1;;;;;;7434:16:0;;;;;:9;:16;;;;;;;7236:222::o;4551:162::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;4663:1:::1;4647:6:::0;;4626:40:::1;::::0;-1:-1:-1;;;;;4647:6:0;;::::1;::::0;4626:40:::1;::::0;4663:1;;4626:40:::1;4703:1;4686:19:::0;;-1:-1:-1;;;;;;4686:19:0::1;::::0;;4551:162::o;32024:658::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;32122:3:::1;32104:6;:21;;32096:78;;;::::0;-1:-1:-1;;;32096:78:0;;14637:2:1;32096:78:0::1;::::0;::::1;14619:21:1::0;14676:2;14656:18;;;14649:30;14715:34;14695:18;;;14688:62;-1:-1:-1;;;14766:18:1;;;14759:39;14815:19;;32096:78:0::1;14435:405:1::0;32096:78:0::1;32211:6;32193:14;;:24;;32185:78;;;::::0;-1:-1:-1;;;32185:78:0;;15047:2:1;32185:78:0::1;::::0;::::1;15029:21:1::0;15086:2;15066:18;;;15059:30;15125:34;15105:18;;;15098:62;-1:-1:-1;;;15176:18:1;;;15169:39;15225:19;;32185:78:0::1;14845:405:1::0;32185:78:0::1;32293:10;32276:28;::::0;;;:16:::1;:28;::::0;;;;:38;;32308:6;;32276:28;:38:::1;::::0;32308:6;;32276:38:::1;:::i;:::-;::::0;;;-1:-1:-1;32332:9:0::1;::::0;-1:-1:-1;32327:242:0::1;32349:6;32345:1;:10;32327:242;;;32386:16;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;32454:16:0::1;::::0;;32432:39:::1;::::0;;;:21:::1;:39;::::0;;;;32474:15:::1;32432:57:::0;;32540:16;32518:39:::1;::::0;32528:10:::1;::::0;32518:9:::1;:39::i;:::-;32357:3:::0;::::1;::::0;::::1;:::i;:::-;;;;32327:242;;;;32612:16;;32598:11;;:30;;;;:::i;:::-;32581:14;:47:::0;32646:28:::1;::::0;;32655:10:::1;15562:51:1::0;;15644:2;15629:18;;15622:34;;;32646:28:0::1;::::0;15535:18:1;32646:28:0::1;;;;;;;32024:658:::0;:::o;30121:1573::-;25736:9;25749:10;25736:23;25728:66;;;;-1:-1:-1;;;25728:66:0;;15869:2:1;25728:66:0;;;15851:21:1;15908:2;15888:18;;;15881:30;15947:32;15927:18;;;15920:60;15997:18;;25728:66:0;15667:354:1;25728:66:0;5216:1:::1;5458:7;;:19:::0;5450:63:::1;;;::::0;-1:-1:-1;;;5450:63:0;;16228:2:1;5450:63:0::1;::::0;::::1;16210:21:1::0;16267:2;16247:18;;;16240:30;16306:33;16286:18;;;16279:61;16357:18;;5450:63:0::1;16026:355:1::0;5450:63:0::1;5216:1;5590:7;:18:::0;30350:25:::2;30378:28:::0;;;:14:::2;:28;::::0;;;;;::::2;;30427:27:::0;::::2;30419:66;;;::::0;-1:-1:-1;;;30419:66:0;;16588:2:1;30419:66:0::2;::::0;::::2;16570:21:1::0;16627:2;16607:18;;;16600:30;16666:28;16646:18;;;16639:56;16712:18;;30419:66:0::2;16386:350:1::0;30419:66:0::2;30498:28;::::0;;;:14:::2;:28;::::0;;;;;;;:35;;-1:-1:-1;;30498:35:0::2;30529:4;30498:35;::::0;;30580:42;::::2;::::0;30597:10:::2;::::0;30513:12;;30580:42:::2;;:::i;:::-;;::::0;;-1:-1:-1;;30580:42:0;;::::2;::::0;;;;;;30570:53;;30580:42:::2;30570:53:::0;;::::2;::::0;30634:14:::2;30658:33:::0;;;;;::::2;::::0;;;18263:25:1;;;18336:4;18324:17;;18304:18;;;18297:45;;;;18358:18;;;18351:34;;;18401:18;;;18394:34;;;30570:53:0;;-1:-1:-1;30634:14:0;30658:33:::2;::::0;18235:19:1;;30658:33:0::2;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;30658:33:0::2;::::0;-1:-1:-1;;30658:33:0;;30735:5:::2;::::0;30658:33;;-1:-1:-1;;;;;;30727:13:0;;::::2;30735:5:::0;::::2;30727:13;::::0;-1:-1:-1;30735:5:0;30762:17;::::2;30754:44;;;::::0;-1:-1:-1;;;30754:44:0;;18641:2:1;30754:44:0::2;::::0;::::2;18623:21:1::0;18680:2;18660:18;;;18653:30;-1:-1:-1;;;18699:18:1;;;18692:44;18753:18;;30754:44:0::2;18439:338:1::0;30754:44:0::2;30829:1;30819:8;:11;;30811:44;;;::::0;-1:-1:-1;;;30811:44:0;;18984:2:1;30811:44:0::2;::::0;::::2;18966:21:1::0;19023:2;19003:18;;;18996:30;-1:-1:-1;;;19042:18:1;;;19035:50;19102:18;;30811:44:0::2;18782:344:1::0;30811:44:0::2;30920:1;30903:14;;:18;30895:59;;;::::0;-1:-1:-1;;;30895:59:0;;19333:2:1;30895:59:0::2;::::0;::::2;19315:21:1::0;19372:2;19352:18;;;19345:30;19411;19391:18;;;19384:58;19459:18;;30895:59:0::2;19131:352:1::0;30895:59:0::2;31012:10;30967:23;30993:31:::0;;;:17:::2;:31;::::0;;;;;31046:18;;31038:54:::2;;;::::0;-1:-1:-1;;;31038:54:0;;19690:2:1;31038:54:0::2;::::0;::::2;19672:21:1::0;19729:2;19709:18;;;19702:30;19768:25;19748:18;;;19741:53;19811:18;;31038:54:0::2;19488:347:1::0;31038:54:0::2;31132:15;31167:6:::0;31162:352:::2;31177:8;31175:1;:10;31162:352;;;31233:10;31216:28;::::0;;;:16:::2;:28;::::0;;;;:30;;;::::2;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31261:16:0::2;:18:::0;;;:16:::2;:18;::::0;::::2;:::i;:::-;::::0;;;-1:-1:-1;;31294:14:0::2;:16:::0;;;:14:::2;:16;::::0;::::2;:::i;:::-;;;;;;31335:39;31345:10;31357:16;;31335:9;:39::i;:::-;31391:9:::0;::::2;::::0;::::2;:::i;:::-;;;;31421:14;;31437:1;31421:17:::0;31417:37;31449:5:::2;31417:37;31187:3:::0;::::2;::::0;::::2;:::i;:::-;;;;31162:352;;;-1:-1:-1::0;31544:10:0::2;31526:29;::::0;;;:17:::2;:29;::::0;;;;;;;;:40;;;31642:44;;15562:51:1;;;15629:18;;15622:34;;;31642:44:0::2;::::0;15535:18:1;31642:44:0::2;;;;;;;-1:-1:-1::0;;5168:1:0::1;5735:22:::0;;-1:-1:-1;;;;;;;;;30121:1573:0:o;7855:109::-;7911:13;7949:7;7942:14;;;;;:::i;9102:305::-;3559:10;-1:-1:-1;;;;;9210:24:0;;;9202:62;;;;-1:-1:-1;;;9202:62:0;;20183:2:1;9202:62:0;;;20165:21:1;20222:2;20202:18;;;20195:30;20261:27;20241:18;;;20234:55;20306:18;;9202:62:0;19981:349:1;9202:62:0;3559:10;9277:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9277:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;9277:53:0;;;;;;;;;;9351:48;;540:41:1;;;9277:42:0;;3559:10;9351:48;;513:18:1;9351:48:0;;;;;;;9102:305;;:::o;32771:551::-;32887:17;;32928:15;;32964:6;;;32956:56;;;;-1:-1:-1;;;32956:56:0;;20537:2:1;32956:56:0;;;20519:21:1;20576:2;20556:18;;;20549:30;20615:34;20595:18;;;20588:62;-1:-1:-1;;;20666:18:1;;;20659:35;20711:19;;32956:56:0;20335:401:1;32956:56:0;33030:6;33025:290;33040:2;33038:1;:4;33025:290;;;33073:10;33086;33097:1;33086:13;;;;;;;;:::i;:::-;;;;;;;33073:26;;33132:3;-1:-1:-1;;;;;33120:16:0;:2;-1:-1:-1;;;;;33120:16:0;;33116:36;;33144:8;;;33116:36;33175:10;-1:-1:-1;;;;;33171:14:0;;;33167:36;;33195:8;;;33167:36;33220:15;33238:8;33247:1;33238:11;;;;;;;;:::i;:::-;;;;;;;33220:29;;33266:37;33279:10;33291:2;33295:7;33266:12;:37::i;:::-;33058:257;;33025:290;33044:3;;;;:::i;:::-;;;;33025:290;;;;32863:459;;32771:551;;:::o;10121:299::-;10258:41;3559:10;10291:7;10258:18;:41::i;:::-;10250:103;;;;-1:-1:-1;;;10250:103:0;;;;;;;:::i;:::-;10373:39;10387:4;10393:2;10397:7;10406:5;10373:13;:39::i;:::-;10121:299;;;;:::o;7980:348::-;10799:4;10828:16;;;:7;:16;;;;;;8053:13;;-1:-1:-1;;;;;10828:16:0;8084:76;;;;-1:-1:-1;;;8084:76:0;;20943:2:1;8084:76:0;;;20925:21:1;20982:2;20962:18;;;20955:30;21021:34;21001:18;;;20994:62;-1:-1:-1;;;21072:18:1;;;21065:45;21127:19;;8084:76:0;20741:411:1;8084:76:0;8173:21;8197:10;:8;:10::i;:::-;8173:34;;8257:1;8241:7;8235:21;:23;8234:86;;;;;;;;;;;;;;;;;8286:7;8295:18;:7;:16;:18::i;:::-;8269:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8234:86;8227:93;7980:348;-1:-1:-1;;;7980:348:0:o;28956:103::-;29006:13;29044:7;29037:14;;;;;:::i;28291:164::-;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;28396:11:::1;28378;;:29;;;;;;;:::i;:::-;;;;;;;;28436:11;28418:14;;:29;;;;;;;:::i;4729:267::-:0;4348:7;4380:6;-1:-1:-1;;;;;4380:6:0;3559:10;4455:23;4447:68;;;;-1:-1:-1;;;4447:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;4823:22:0;::::1;4815:73;;;::::0;-1:-1:-1;;;4815:73:0;;21834:2:1;4815:73:0::1;::::0;::::1;21816:21:1::0;21873:2;21853:18;;;21846:30;21912:34;21892:18;;;21885:62;-1:-1:-1;;;21963:18:1;;;21956:36;22009:19;;4815:73:0::1;21632:402:1::0;4815:73:0::1;4934:6;::::0;;4913:38:::1;::::0;-1:-1:-1;;;;;4913:38:0;;::::1;::::0;4934:6;::::1;::::0;4913:38:::1;::::0;::::1;4971:6;:17:::0;;-1:-1:-1;;;;;;4971:17:0::1;-1:-1:-1::0;;;;;4971:17:0;;;::::1;::::0;;;::::1;::::0;;4729:267::o;6906:314::-;7008:4;-1:-1:-1;;;;;;7038:40:0;;-1:-1:-1;;;7038:40:0;;:117;;-1:-1:-1;;;;;;;7107:48:0;;-1:-1:-1;;;7107:48:0;7038:117;:174;;;-1:-1:-1;;;;;;;;;;3302:40:0;;;7176:36;3187:164;13594:184;13674:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;13674:29:0;-1:-1:-1;;;;;13674:29:0;;;;;;;;:24;;13733:23;13674:24;13733:14;:23::i;:::-;-1:-1:-1;;;;;13724:46:0;;;;;;;;;;;13594:184;;:::o;10882:378::-;10975:4;10828:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10828:16:0;10997:73;;;;-1:-1:-1;;;10997:73:0;;22241:2:1;10997:73:0;;;22223:21:1;22280:2;22260:18;;;22253:30;22319:34;22299:18;;;22292:62;-1:-1:-1;;;22370:18:1;;;22363:42;22422:19;;10997:73:0;22039:408:1;10997:73:0;11090:13;11106:23;11121:7;11106:14;:23::i;:::-;11090:39;;11168:5;-1:-1:-1;;;;;11157:16:0;:7;-1:-1:-1;;;;;11157:16:0;;:51;;;;11201:7;-1:-1:-1;;;;;11177:31:0;:20;11189:7;11177:11;:20::i;:::-;-1:-1:-1;;;;;11177:31:0;;11157:51;:94;;;-1:-1:-1;;;;;;9549:25:0;;;9520:4;9549:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;11212:39;11149:103;10882:378;-1:-1:-1;;;;10882:378:0:o;13018:560::-;13146:4;-1:-1:-1;;;;;13121:29:0;:23;13136:7;13121:14;:23::i;:::-;-1:-1:-1;;;;;13121:29:0;;13113:84;;;;-1:-1:-1;;;13113:84:0;;22654:2:1;13113:84:0;;;22636:21:1;22693:2;22673:18;;;22666:30;22732:34;22712:18;;;22705:62;-1:-1:-1;;;22783:18:1;;;22776:39;22832:19;;13113:84:0;22452:405:1;13113:84:0;-1:-1:-1;;;;;13216:16:0;;13208:79;;;;-1:-1:-1;;;13208:79:0;;23064:2:1;13208:79:0;;;23046:21:1;23103:2;23083:18;;;23076:30;23142:34;23122:18;;;23115:62;-1:-1:-1;;;23193:18:1;;;23186:34;23237:19;;13208:79:0;22862:400:1;13208:79:0;13300:39;13321:4;13327:2;13331:7;13300:20;:39::i;:::-;13352:29;13369:1;13373:7;13352:8;:29::i;:::-;-1:-1:-1;;;;;13442:15:0;;;;;;:9;:15;;;;;:20;;13461:1;;13442:15;:20;;13461:1;;13442:20;:::i;:::-;;;;-1:-1:-1;;;;;;;13473:13:0;;;;;;:9;:13;;;;;:20;;13492:1;;13473:13;:20;;13492:1;;13473:20;:::i;:::-;;;;-1:-1:-1;;13504:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;13504:21:0;-1:-1:-1;;;;;13504:21:0;;;;;;;;;13543:27;;13504:16;;13543:27;;;;;;;13018:560;;;:::o;11276:115::-;11357:26;11367:2;11371:7;11357:26;;;;;;;;;;;;:9;:26::i;10436:282::-;10555:28;10565:4;10571:2;10575:7;10555:9;:28::i;:::-;10607:48;10630:4;10636:2;10640:7;10649:5;10607:22;:48::i;:::-;10599:111;;;;-1:-1:-1;;;10599:111:0;;;;;;;:::i;19699:774::-;19755:13;19981:5;19988:1;19981:8;19977:30;;-1:-1:-1;;19997:10:0;;;;;;;;;;;;-1:-1:-1;;;19997:10:0;;;;;19699:774::o;19977:30::-;20038:5;20023:12;20084:85;20091:7;;20084:85;;20124:8;;;;:::i;:::-;;-1:-1:-1;20147:10:0;;-1:-1:-1;20155:2:0;20147:10;;:::i;:::-;;;20084:85;;;20188:19;20220:6;20210:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20210:17:0;;20188:39;;20247:178;20254:10;;20247:178;;20290:18;20307:1;20290:18;;:::i;:::-;;-1:-1:-1;20366:10:0;20374:2;20366:5;:10;:::i;:::-;20353:24;;:2;:24;:::i;:::-;20340:39;;20323:6;20330;20323:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;20323:56:0;;;;;;;;-1:-1:-1;20394:19:0;20411:2;20394:19;;:::i;:::-;;;20247:178;;16477:525;-1:-1:-1;;;;;16657:18:0;;16653:159;;16681:40;16713:7;17360:10;:17;;17333:24;;;;:15;:24;;;;;:44;;;17393:24;;;;;;;;;;;;17251:174;16681:40;16653:159;;;16749:2;-1:-1:-1;;;;;16741:10:0;:4;-1:-1:-1;;;;;16741:10:0;;16737:75;;16765:47;16798:4;16804:7;16765:32;:47::i;:::-;-1:-1:-1;;;;;16841:16:0;;16837:157;;16865:45;16902:7;16865:36;:45::i;16837:157::-;16936:4;-1:-1:-1;;;;;16930:10:0;:2;-1:-1:-1;;;;;16930:10:0;;16926:68;;16954:40;16982:2;16986:7;16954:27;:40::i;11407:260::-;11508:18;11514:2;11518:7;11508:5;:18::i;:::-;11550:54;11581:1;11585:2;11589:7;11598:5;11550:22;:54::i;:::-;11542:117;;;;-1:-1:-1;;;11542:117:0;;;;;;;:::i;13794:941::-;13903:4;-1:-1:-1;;;;;13929:13:0;;21592:20;21681:8;13925:803;;14004:72;;-1:-1:-1;;;14004:72:0;;-1:-1:-1;;;;;14004:36:0;;;;;:72;;3559:10;;14055:4;;14061:7;;14070:5;;14004:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;14004:72:0;;;;;;;;-1:-1:-1;;14004:72:0;;;;;;;;;;;;:::i;:::-;;;13970:685;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14315:6;:13;14330:1;14315:16;14311:329;;14373:60;;-1:-1:-1;;;14373:60:0;;;;;;;:::i;14311:329::-;14557:6;14551:13;14542:6;14538:2;14534:15;14527:38;13970:685;-1:-1:-1;;;;;;14166:55:0;-1:-1:-1;;;14166:55:0;;-1:-1:-1;14159:62:0;;13925:803;-1:-1:-1;14712:4:0;13794:941;;;;;;:::o;17433:993::-;17704:22;17754:1;17729:22;17746:4;17729:16;:22::i;:::-;:26;;;;:::i;:::-;17766:18;17787:26;;;:17;:26;;;;;;17704:51;;-1:-1:-1;17920:28:0;;;17916:328;;-1:-1:-1;;;;;17987:18:0;;17965:19;17987:18;;;:12;:18;;;;;;;;:34;;;;;;;;;18038:30;;;;;;:44;;;18155:30;;:17;:30;;;;;:43;;;17916:328;-1:-1:-1;18340:26:0;;;;:17;:26;;;;;;;;18333:33;;;-1:-1:-1;;;;;18384:18:0;;;;;:12;:18;;;;;:34;;;;;;;18377:41;17433:993::o;18434:1084::-;18717:10;:17;18692:22;;18717:21;;18737:1;;18717:21;:::i;:::-;18749:18;18770:24;;;:15;:24;;;;;;19143:10;:26;;18692:46;;-1:-1:-1;18770:24:0;;18692:46;;19143:26;;;;;;:::i;:::-;;;;;;;;;19121:48;;19207:11;19182:10;19193;19182:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;19287:28;;;:15;:28;;;;;;;:41;;;19459:24;;;;;19452:31;19494:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;18510:1008;;;18434:1084;:::o;17010:233::-;17100:14;17117:20;17134:2;17117:16;:20::i;:::-;-1:-1:-1;;;;;17153:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:36;;;17200:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;17010:233:0:o;11683:390::-;-1:-1:-1;;;;;11768:16:0;;11760:62;;;;-1:-1:-1;;;11760:62:0;;25142:2:1;11760:62:0;;;25124:21:1;;;25161:18;;;25154:30;25220:34;25200:18;;;25193:62;25272:18;;11760:62:0;24940:356:1;11760:62:0;10799:4;10828:16;;;:7;:16;;;;;;-1:-1:-1;;;;;10828:16:0;:30;11833:58;;;;-1:-1:-1;;;11833:58:0;;25503:2:1;11833:58:0;;;25485:21:1;25542:2;25522:18;;;25515:30;25581;25561:18;;;25554:58;25629:18;;11833:58:0;25301:352:1;11833:58:0;11904:45;11933:1;11937:2;11941:7;11904:20;:45::i;:::-;-1:-1:-1;;;;;11962:13:0;;;;;;:9;:13;;;;;:20;;11981:1;;11962:13;:20;;11981:1;;11962:20;:::i;:::-;;;;-1:-1:-1;;11993:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11993:21:0;-1:-1:-1;;;;;11993:21:0;;;;;;;;12032:33;;11993:16;;;12032:33;;11993:16;;12032:33;11683:390;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;68:71;14:131;:::o;150:245::-;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:186::-;2232:6;2285:2;2273:9;2264:7;2260:23;2256:32;2253:52;;;2301:1;2298;2291:12;2253:52;2324:29;2343:9;2324:29;:::i;2364:632::-;2535:2;2587:21;;;2657:13;;2560:18;;;2679:22;;;2506:4;;2535:2;2758:15;;;;2732:2;2717:18;;;2506:4;2801:169;2815:6;2812:1;2809:13;2801:169;;;2876:13;;2864:26;;2945:15;;;;2910:12;;;;2837:1;2830:9;2801:169;;;-1:-1:-1;2987:3:1;;2364:632;-1:-1:-1;;;;;;2364:632:1:o;3183:328::-;3260:6;3268;3276;3329:2;3317:9;3308:7;3304:23;3300:32;3297:52;;;3345:1;3342;3335:12;3297:52;3368:29;3387:9;3368:29;:::i;:::-;3358:39;;3416:38;3450:2;3439:9;3435:18;3416:38;:::i;:::-;3406:48;;3501:2;3490:9;3486:18;3473:32;3463:42;;3183:328;;;;;:::o;3516:127::-;3577:10;3572:3;3568:20;3565:1;3558:31;3608:4;3605:1;3598:15;3632:4;3629:1;3622:15;3648:275;3719:2;3713:9;3784:2;3765:13;;-1:-1:-1;;3761:27:1;3749:40;;3819:18;3804:34;;3840:22;;;3801:62;3798:88;;;3866:18;;:::i;:::-;3902:2;3895:22;3648:275;;-1:-1:-1;3648:275:1:o;3928:407::-;3993:5;4027:18;4019:6;4016:30;4013:56;;;4049:18;;:::i;:::-;4087:57;4132:2;4111:15;;-1:-1:-1;;4107:29:1;4138:4;4103:40;4087:57;:::i;:::-;4078:66;;4167:6;4160:5;4153:21;4207:3;4198:6;4193:3;4189:16;4186:25;4183:45;;;4224:1;4221;4214:12;4183:45;4273:6;4268:3;4261:4;4254:5;4250:16;4237:43;4327:1;4320:4;4311:6;4304:5;4300:18;4296:29;4289:40;3928:407;;;;;:::o;4340:451::-;4409:6;4462:2;4450:9;4441:7;4437:23;4433:32;4430:52;;;4478:1;4475;4468:12;4430:52;4518:9;4505:23;4551:18;4543:6;4540:30;4537:50;;;4583:1;4580;4573:12;4537:50;4606:22;;4659:4;4651:13;;4647:27;-1:-1:-1;4637:55:1;;4688:1;4685;4678:12;4637:55;4711:74;4777:7;4772:2;4759:16;4754:2;4750;4746:11;4711:74;:::i;4796:543::-;4889:6;4897;4905;4913;4921;4974:3;4962:9;4953:7;4949:23;4945:33;4942:53;;;4991:1;4988;4981:12;4942:53;5027:9;5014:23;5004:33;;5084:2;5073:9;5069:18;5056:32;5046:42;;5138:2;5127:9;5123:18;5110:32;5182:4;5175:5;5171:16;5164:5;5161:27;5151:55;;5202:1;5199;5192:12;5151:55;4796:543;;;;-1:-1:-1;5225:5:1;;5277:2;5262:18;;5249:32;;-1:-1:-1;5328:3:1;5313:19;5300:33;;4796:543;-1:-1:-1;;4796:543:1:o;5344:347::-;5409:6;5417;5470:2;5458:9;5449:7;5445:23;5441:32;5438:52;;;5486:1;5483;5476:12;5438:52;5509:29;5528:9;5509:29;:::i;:::-;5499:39;;5588:2;5577:9;5573:18;5560:32;5635:5;5628:13;5621:21;5614:5;5611:32;5601:60;;5657:1;5654;5647:12;5601:60;5680:5;5670:15;;;5344:347;;;;;:::o;5696:183::-;5756:4;5789:18;5781:6;5778:30;5775:56;;;5811:18;;:::i;:::-;-1:-1:-1;5856:1:1;5852:14;5868:4;5848:25;;5696:183::o;5884:662::-;5938:5;5991:3;5984:4;5976:6;5972:17;5968:27;5958:55;;6009:1;6006;5999:12;5958:55;6045:6;6032:20;6071:4;6095:60;6111:43;6151:2;6111:43;:::i;:::-;6095:60;:::i;:::-;6189:15;;;6275:1;6271:10;;;;6259:23;;6255:32;;;6220:12;;;;6299:15;;;6296:35;;;6327:1;6324;6317:12;6296:35;6363:2;6355:6;6351:15;6375:142;6391:6;6386:3;6383:15;6375:142;;;6457:17;;6445:30;;6495:12;;;;6408;;6375:142;;;-1:-1:-1;6535:5:1;5884:662;-1:-1:-1;;;;;;5884:662:1:o;6551:1146::-;6669:6;6677;6730:2;6718:9;6709:7;6705:23;6701:32;6698:52;;;6746:1;6743;6736:12;6698:52;6786:9;6773:23;6815:18;6856:2;6848:6;6845:14;6842:34;;;6872:1;6869;6862:12;6842:34;6910:6;6899:9;6895:22;6885:32;;6955:7;6948:4;6944:2;6940:13;6936:27;6926:55;;6977:1;6974;6967:12;6926:55;7013:2;7000:16;7035:4;7059:60;7075:43;7115:2;7075:43;:::i;7059:60::-;7153:15;;;7235:1;7231:10;;;;7223:19;;7219:28;;;7184:12;;;;7259:19;;;7256:39;;;7291:1;7288;7281:12;7256:39;7315:11;;;;7335:148;7351:6;7346:3;7343:15;7335:148;;;7417:23;7436:3;7417:23;:::i;:::-;7405:36;;7368:12;;;;7461;;;;7335:148;;;7502:5;-1:-1:-1;;7545:18:1;;7532:32;;-1:-1:-1;;7576:16:1;;;7573:36;;;7605:1;7602;7595:12;7573:36;;7628:63;7683:7;7672:8;7661:9;7657:24;7628:63;:::i;:::-;7618:73;;;6551:1146;;;;;:::o;7702:667::-;7797:6;7805;7813;7821;7874:3;7862:9;7853:7;7849:23;7845:33;7842:53;;;7891:1;7888;7881:12;7842:53;7914:29;7933:9;7914:29;:::i;:::-;7904:39;;7962:38;7996:2;7985:9;7981:18;7962:38;:::i;:::-;7952:48;;8047:2;8036:9;8032:18;8019:32;8009:42;;8102:2;8091:9;8087:18;8074:32;8129:18;8121:6;8118:30;8115:50;;;8161:1;8158;8151:12;8115:50;8184:22;;8237:4;8229:13;;8225:27;-1:-1:-1;8215:55:1;;8266:1;8263;8256:12;8215:55;8289:74;8355:7;8350:2;8337:16;8332:2;8328;8324:11;8289:74;:::i;:::-;8279:84;;;7702:667;;;;;;;:::o;8374:260::-;8442:6;8450;8503:2;8491:9;8482:7;8478:23;8474:32;8471:52;;;8519:1;8516;8509:12;8471:52;8542:29;8561:9;8542:29;:::i;:::-;8532:39;;8590:38;8624:2;8613:9;8609:18;8590:38;:::i;:::-;8580:48;;8374:260;;;;;:::o;8639:380::-;8718:1;8714:12;;;;8761;;;8782:61;;8836:4;8828:6;8824:17;8814:27;;8782:61;8889:2;8881:6;8878:14;8858:18;8855:38;8852:161;;8935:10;8930:3;8926:20;8923:1;8916:31;8970:4;8967:1;8960:15;8998:4;8995:1;8988:15;8852:161;;8639:380;;;:::o;10669:127::-;10730:10;10725:3;10721:20;10718:1;10711:31;10761:4;10758:1;10751:15;10785:4;10782:1;10775:15;10801:127;10862:10;10857:3;10853:20;10850:1;10843:31;10893:4;10890:1;10883:15;10917:4;10914:1;10907:15;10933:135;10972:3;10993:17;;;10990:43;;11013:18;;:::i;:::-;-1:-1:-1;11060:1:1;11049:13;;10933:135::o;11073:413::-;11275:2;11257:21;;;11314:2;11294:18;;;11287:30;11353:34;11348:2;11333:18;;11326:62;-1:-1:-1;;;11419:2:1;11404:18;;11397:47;11476:3;11461:19;;11073:413::o;11903:356::-;12105:2;12087:21;;;12124:18;;;12117:30;12183:34;12178:2;12163:18;;12156:62;12250:2;12235:18;;11903:356::o;13071:125::-;13111:4;13139:1;13136;13133:8;13130:34;;;13144:18;;:::i;:::-;-1:-1:-1;13181:9:1;;13071:125::o;15255:128::-;15295:3;15326:1;15322:6;15319:1;15316:13;15313:39;;;15332:18;;:::i;:::-;-1:-1:-1;15368:9:1;;15255:128::o;16867:1164::-;17023:3;17052:1;17085:6;17079:13;17115:3;17137:1;17165:9;17161:2;17157:18;17147:28;;17225:2;17214:9;17210:18;17247;17237:61;;17291:4;17283:6;17279:17;17269:27;;17237:61;17317:2;17365;17357:6;17354:14;17334:18;17331:38;17328:165;;-1:-1:-1;;;17392:33:1;;17448:4;17445:1;17438:15;17478:4;17399:3;17466:17;17328:165;17509:18;17536:104;;;;17654:1;17649:320;;;;17502:467;;17536:104;-1:-1:-1;;17569:24:1;;17557:37;;17614:16;;;;-1:-1:-1;17536:104:1;;17649:320;16814:1;16807:14;;;16851:4;16838:18;;17744:1;17758:165;17772:6;17769:1;17766:13;17758:165;;;17850:14;;17837:11;;;17830:35;17893:16;;;;17787:10;;17758:165;;;17762:3;;17952:6;17947:3;17943:16;17936:23;;17502:467;-1:-1:-1;17978:19:1;;;-1:-1:-1;;;18013:12:1;;;16867:1164;-1:-1:-1;;;;16867:1164:1:o;19840:136::-;19879:3;19907:5;19897:39;;19916:18;;:::i;:::-;-1:-1:-1;;;19952:18:1;;19840:136::o;21157:470::-;21336:3;21374:6;21368:13;21390:53;21436:6;21431:3;21424:4;21416:6;21412:17;21390:53;:::i;:::-;21506:13;;21465:16;;;;21528:57;21506:13;21465:16;21562:4;21550:17;;21528:57;:::i;:::-;21601:20;;21157:470;-1:-1:-1;;;;21157:470:1:o;23267:414::-;23469:2;23451:21;;;23508:2;23488:18;;;23481:30;23547:34;23542:2;23527:18;;23520:62;-1:-1:-1;;;23613:2:1;23598:18;;23591:48;23671:3;23656:19;;23267:414::o;23686:127::-;23747:10;23742:3;23738:20;23735:1;23728:31;23778:4;23775:1;23768:15;23802:4;23799:1;23792:15;23818:120;23858:1;23884;23874:35;;23889:18;;:::i;:::-;-1:-1:-1;23923:9:1;;23818:120::o;23943:112::-;23975:1;24001;23991:35;;24006:18;;:::i;:::-;-1:-1:-1;24040:9:1;;23943:112::o;24060:489::-;-1:-1:-1;;;;;24329:15:1;;;24311:34;;24381:15;;24376:2;24361:18;;24354:43;24428:2;24413:18;;24406:34;;;24476:3;24471:2;24456:18;;24449:31;;;24254:4;;24497:46;;24523:19;;24515:6;24497:46;:::i;:::-;24489:54;24060:489;-1:-1:-1;;;;;;24060:489:1:o;24554:249::-;24623:6;24676:2;24664:9;24655:7;24651:23;24647:32;24644:52;;;24692:1;24689;24682:12;24644:52;24724:9;24718:16;24743:30;24767:5;24743:30;:::i;24808:127::-;24869:10;24864:3;24860:20;24857:1;24850:31;24900:4;24897:1;24890:15;24924:4;24921:1;24914:15

Swarm Source

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