ETH Price: $2,491.47 (-0.84%)

Example Token (EKTN)
 

Overview

TokenID

100000717

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 8 Decimals)

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:
E741V1Token

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2024-02-22
*/

//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⣀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣶⣾⣿⣷⣾⣿⣿⣿⣿⣶⣾⣿⣿⣶⣦⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠛⠉⢉⡽⢋⣙⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢰⣿⣦⣀⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣛⣛⣓⣒⠶⢤⣾⠀⠀⠸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢸⣿⠳⣿⣷⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣿⡄⠀⠀⢳⣦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⣿⡄⠀⠙⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡿⠿⣿⡦⠀⠀⠻⠿⣦⣀⡀⠀⠀⠀⠀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⠀⢸⣷⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠿⢿⡏⠀⠜⡴⠁⠀⠀⠀⡀⠀⠀⠉⠉⠲⢦⡀⠀⠀
//⠀⠀⠀⠀⠀⠀⠀⢠⣿⣷⡾⢿⣿⣿⣿⣿⣿⠿⢿⣿⣿⣿⣿⣿⡿⠛⠉⠁⠀⠀⣸⠀⠀⠀⢧⠀⠀⠀⠀⠹⠒⢤⣀⠀⠀⠁⠈⢢⠀
//⠀⠀⠀⠀⠀⠀⠀⠈⣿⣟⠀⠀⠈⠻⣿⠏⢨⠔⢦⠈⢻⣿⡼⠋⢀⣤⣶⣶⣿⣿⣿⣄⢠⣀⡜⠆⠀⢀⡠⠴⠒⠂⠈⢻⢦⡀⠀⠈⡇
//⠀⠀⢀⣶⣿⣷⠀⠀⠘⣿⡄⠀⠐⣶⢬⣇⠉⢣⡸⠀⣰⣿⣁⣴⣿⣿⣿⣿⣿⣿⣟⢿⣽⡛⣧⠔⠒⡏⣀⠀⠀⣀⣀⣾⠀⠑⠢⠤⠃
//⠀⣴⡟⣾⡟⣿⡇⣀⣼⣿⣿⣦⡀⠀⠙⠻⡆⠀⠇⢰⠟⠻⣿⣿⣿⣿⣿⡿⣿⣿⣿⣷⡿⠟⣇⠀⠀⢙⣰⣺⣽⣿⣿⣿⠀⠀⠀⠀⠀
//⢸⡿⢸⡿⣰⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡴⠃⠀⠀⢸⡀⠀⢹⣿⣿⣿⣿⣿⢹⣿⣿⣯⣀⣀⣀⣭⣏⠁⠀⠀⠈⠻⣿⣿⠀⠀⠀⠀⠀
//⣿⡇⢸⡗⢸⠛⣿⡍⠉⠙⠛⠻⢭⣻⣿⣧⠀⠀⢀⣴⠷⣄⡀⠻⣿⣿⣿⣿⣿⣿⣿⣽⣿⣿⣿⣿⡻⡆⠀⠀⠀⠀⠙⠇⠀⠀⠀⠀⠀
//⣿⡇⢸⣷⣽⠶⠛⢷⡀⣠⠤⢤⣾⣿⣿⣽⣞⣿⣭⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡙⢿⣿⠉⠛⢿⣿⣷⡇⠀⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀
//⣿⣇⣼⢿⠁⠀⠀⢠⡷⡇⢠⣶⡽⣿⠋⠉⢻⠿⠛⠋⠉⠉⢹⠉⢻⢻⣿⣿⣿⣿⣿⣷⡶⢏⡠⠿⣿⣷⡞⠛⠙⢳⣦⡀⠀⠀⠀⠀⠀
//⣿⡏⢠⡋⣆⠀⠀⡞⠀⠇⠈⢿⣿⣏⠀⠀⠸⡀⠀⠀⠀⢀⡞⠀⢸⢸⣿⡏⠛⠛⠛⠉⣠⠋⣠⠀⠸⠧⢻⡝⢷⡄⢿⣷⠀⠀⠀⠀⠀
//⢸⣧⠸⡹⡌⢆⣴⣿⡀⠀⠀⠈⠻⠿⣆⠀⠀⠳⣄⣰⣚⠉⠉⠉⠻⣾⣿⡻⣦⣀⣠⣴⠷⠟⣻⠀⠀⠀⢸⡇⢸⣧⢨⣿⠀⠀⠀⠀⠀
//⠀⢿⣇⠓⠃⣼⣇⡈⠻⣄⠀⠰⢦⣀⢀⣷⡄⠀⠀⠀⠈⠉⠓⡤⣄⡈⡿⣿⣷⣶⣶⣶⣾⣿⠟⢀⠆⠀⡾⢷⣾⡇⣼⡟⠀⠀⠀⠀⠀
//⠀⠈⢿⢷⣞⠛⣿⣿⣤⡍⠳⣤⣤⣤⡿⠗⠁⠀⠀⠀⠀⠀⠀⠙⠀⠹⡅⠀⠈⠉⠉⠉⠻⣤⠔⠚⠒⠊⠀⠀⠈⣿⡿⠃⠀⠀⠀⠀⠀
// ███████ █████ ██   ██  ██⣤⣔⡊⣀⠀⠀⡷⠀⠀⠀⢀⣴⠞⠓⠲⠦⣤⡀⠀⠀⣠⡿⠁⠀⠀⠀⠀⠀⠀
// ██         ██ ██   ██ ███⠀⢹⠀⠙⣤⣃⣤⠶⠞⣫⣤⣟⣛⣷⣶⣿⢟⡦⣾⠟⠀⠀⠀⠀⠀⠀⠀⠀
// █████     ██  ███████  ██ ⢸⠀⠀⣿⡏⠾⠿⣶⣿⣿⣿⠿⣛⣽⣾⡿⠚⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ██       ██        ██  ██ ⡇⠀⣠⠏⠉⠛⠳⠶⢶⣶⡿⠿⠟⠊⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
// ███████  ██        ██  ██⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀

// A public demonstration in single-contract dual-token implementations
// with zero-conflict events, and function overloading.
// https://github.com/SJ741/E741-Platform
// https://t.me/UniswapEMERALDS
// Emerald Token Standard

// WARNING - Fungible NFT specs are universally new, and inherently DANGEROUS
// no systems have been built with these usecases in mind, and there are a number of 
// ways that experimental, complex contracts can lead to unforseen consequences.
// INTERACT WITH EXPERIMENTAL SMART CONTRACTS AT YOUR OWN RISK

//SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;


// libraries to separate ERC20 and ERC721 events, and certain signature-specific functions
// ERC20 events
library libES20 {
    event Transfer(address indexed from, address indexed to, uint amount);
    event Approval(address indexed owner, address indexed spender, uint256 value);
    function emitTransfer(address _from, address _to, uint _amount) internal { emit Transfer(_from, _to, _amount); }
    function emitApproval(address _owner, address _spender, uint _value) internal { emit Approval(_owner, _spender, _value); }
}

// ERC721 events
library libES721 {
    event Transfer(address indexed _from, address indexed _to, uint indexed _tokenId);
    event Approval(address indexed _owner, address indexed _approved, uint indexed _tokenId);
    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);
    function emitTransfer(address _from, address _to, uint _tokenId) internal { emit Transfer(_from, _to, _tokenId); }
    function emitApproval(address _owner, address _approve, uint _tokenId) internal { emit Approval(_owner, _approve, _tokenId); }
    function emitApprovalForAll(address _owner, address _operator, bool _approved) internal { emit ApprovalForAll(_owner, _operator, _approved); }
}

// ERC165 https://eips.ethereum.org/EIPS/eip-721
interface IERC165 {
    function supportsInterface(bytes4 interfaceID) external view returns (bool);
}

// ERC20 https://eips.ethereum.org/EIPS/eip-20
interface IERC20 {
    function balanceOf(address account) external view returns (uint256);
    function totalSupply() external view returns (uint256);
    function transfer(address to, uint256 value) external returns (bool);
    function allowance(address owner, address spender) external view returns (uint256);
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

// ERC721 https://eips.ethereum.org/EIPS/eip-721
interface IERC721 is IERC165 {
    function balanceOf(address account) external view returns (uint256);
    function ownerOf(uint256 _tokenId) external view returns (address);
    function safeTransferFrom(address _from, address _to, uint256 _tokenId, bytes memory data) external payable;
    function safeTransferFrom(address _from, address _to, uint256 _tokenId) external payable;
    function setApprovalForAll(address _operator, bool _approved) external;
    function getApproved(uint256 _tokenId) external view returns (address);
    function isApprovedForAll(address _owner, address _operator) external view returns (bool);
    // payable removed for erc20 etherscan compatibility
    function approve(address spender, uint256 value) external returns (bool);
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

interface IE741 is IERC20, IERC721 {
    // supportsInterface 0x5a46575f
    // library transfers can not be included in the interface
    // incorporate them directly with library
    // libES20.Transfer
    // libES20.Approval
    // libES721.Transfer
    // libES721.Approval
    // libES721.ApprovalForAll
    function balanceOf(address account) external override(IERC20, IERC721) view returns (uint256);
    function approve(address spender, uint256 value) external override(IERC20, IERC721) returns (bool);
    function transferFrom(address from, address to, uint256 value) external override(IERC20, IERC721) returns (bool);
}

interface IERC721Metadata {
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
    function contractURI() external view returns (string memory);
}

interface IERC20Metadata {
    function name() external view returns (string memory _name);
    function symbol() external view returns (string memory _symbol);
    function tokenURI(uint256 _tokenId) external view returns (string memory);
}

interface IDevable {
    function dev() external returns (address dev);
    function setContractURI(string memory newContractURI) external;
    function setBaseURI(string memory newBaseURI) external;
    function changeDev(address newDev) external;
    function toggelNFTinterface() external;
    function withdraw() external;
}

interface IERC721TokenReceiver {
    function onERC721Received(address _operator, address _from, uint256 _tokenId, bytes memory _data) external returns(bytes4);
}

contract ERC721TokenReceiver is IERC721TokenReceiver {
    function onERC721Received(address, address, uint256, bytes memory) external virtual returns(bytes4) {
        return IERC721TokenReceiver.onERC721Received.selector;
    }
}

abstract contract E741V1Base is IDevable, ERC721TokenReceiver, IE741  {

    string public baseURI;
    string internal _contractURI;
    string internal _name;
    string internal _symbol;
    uint internal _decimals;
    uint internal _totalIds;
    uint internal ONE; // 1.0 token(s)
    uint internal MAXID; // e.g. 1.00000001 : 1.00007777 is the range for NFT IDs

    uint64 public minted; // number of unique ID mints + ONE
    uint64[] internal broken; // broken NFTs stored in limbo list 

    address public dev;
    bool public supportsNFTinterface;

    mapping(address => mapping(address => bool)) private _operatorApprovals;
    mapping(address => mapping(address => uint)) internal _allowance;
    mapping(uint256 tokenId => address) public ownerOf;
    mapping(uint256 => address) private _nftApprovals;
    mapping(address => uint) internal _balanceOf;
    mapping(address => uint64[]) public ownedNFTs;
    mapping(uint64 => uint256) internal idToIndex; 

    error UnsupportedReceiver();

    modifier onlyDev() {
        require(msg.sender == dev, "Not the developer");
        _;
    }

    constructor() {
        dev = msg.sender;
    }

    function initialze(bytes memory encodedParameters) public virtual;
    //function deposit(uint amount) public virtual;
    //function withdraw(uint amount) public virtual;
    function deposit(uint[] memory amounts) public virtual;
    function withdraw(uint[] memory amounts) public payable virtual;

    function name() public view virtual returns (string memory) { return _name; }
    function symbol() public view virtual returns (string memory) { return _symbol; }
    function decimals() public view virtual returns (uint) { return _decimals; }
    function totalSupply() public view virtual returns (uint) { return _totalIds * ONE; }
    function balanceOf( address account) public view override returns (uint) { return _balanceOf[account]; }
    function allowance(address owner, address spender) public view override returns (uint) { return _allowance[owner][spender]; }
    function setBaseURI(string memory newBaseURI) public onlyDev override {baseURI = newBaseURI;}
    function setContractURI(string memory newContractURI) public onlyDev override {_contractURI = newContractURI;}
    function changeDev(address newDev) public onlyDev override  {dev = newDev;}//simple function to change developer address, or revoke ownership (with address(0))
    // @DEV toggleNFTinterface is for the small possibility of frontend system changes leading the contract to favor enabling the disabled supportsNFTinterface flag
    // don't waste it, as frontends don't typically change classification of contracts
    // probably never to be used.
    function toggelNFTinterface() public onlyDev override {supportsNFTinterface = !supportsNFTinterface;}
    function tokensOfOwner(address owner) public view returns (uint64[] memory){return ownedNFTs[owner];}
    function nftBalanceOf(address account) public view returns (uint) {return ownedNFTs[account].length;}
    function contractURI() public view virtual returns (string memory) {return _contractURI;}


    function approve(address spender, uint amount) public override returns (bool) {

        // if the amount is greater than one token, and within range of IDs for NFTs 
        // then set NFT approval for the given ID
        if(amount >= ONE && amount <= MAXID) {
            address owner = ownerOf[amount]; // getting the owner of token ID via the `amount` input
            if (msg.sender != owner && !isApprovedForAll(owner, msg.sender)) revert("E741: You are not approved");
            _nftApprovals[amount] = spender; // calling nft approval for the token and spender
            libES721.emitApproval(owner, spender, amount);
            return true;
        }
        
        // else set the ERC20 allowance
        // the NFT ID range being set within a limited subset of ONE token(s)
        // allows for non-clashing interactions
        _allowance[msg.sender][spender] = amount;
        libES20.emitApproval(msg.sender, spender, amount);
        return true;
    }

    function _transfer741(address from, address to, uint amount) internal virtual {
        
        require(_balanceOf[from] >= amount, "E741: transfer amount exceeds balance");
        
        // checking the decimal amount of tokens owned before transaction for both participants
        uint256 fromDecimalsPre = _balanceOf[from] % ONE;
        uint256 toDecimalsPre = _balanceOf[to] % ONE;
        
        // simple erc20 balance operations
        _transfer20(from, to, amount);

        // checking the decimal amount of tokens after transaction for both partcipants
        uint256 fromDecimalsPost = _balanceOf[from] % ONE;
        uint256 toDecimalsPost = _balanceOf[to] % ONE;

        // stores the NFT IDs owned by `from`, enabling NFT management for that address.
        uint64[] storage ownedNFTsArray = ownedNFTs[from];

        // references NFTs marked as "broken", tracking these special state NFTs.
        uint64[] storage brokenIDsArray = broken;

        // if sender has higher decimal count after transaction, then they "roll under" and break an NFT
        if (fromDecimalsPre < fromDecimalsPost) {

            if(ownedNFTsArray.length > 0) { // if the sender has an nft to send

                uint64 tokenId = ownedNFTsArray[0];//selects the user's first NFT from the list

                brokenIDsArray.push(tokenId);//pushes the nft into the "broken list" for limbo NFTs
                _transfer721(from, address(0), tokenId);//transfers the NFT ID ownership to (0) address for stewardship
            }
        }

        // if receiver has lower decimal count after transaction then they "roll over" and will "remake" an nft 
        if (toDecimalsPre > toDecimalsPost) {

            if(brokenIDsArray.length > 0) { // recover an id from broken list

                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }
            else { // mint new id
                _mint(to);
            }
            
        }
        
        // amount of tokens - amount of whole tokens being processed in int
        uint amountInTokens = amount / ONE;

        uint len = ownedNFTsArray.length; //len is the length, or number of NFTs in the addresses's owned array

        // ignore minting nfts from dev when they call -- this allows for gas-efficient team operations
        // @DEV if dev gathers NFTs, use the ERC721 transferFrom method to extract
        // @DEV be careful, don't let the wallet fall to some convoluted transferFrom scam to do something unexpected
        if(from == dev) {
            // todo clean up comments. the dev can only send out the nfts they hold
            amountInTokens = amountInTokens < len ? amountInTokens : len;
        }

        if(amountInTokens > 0) {

            len = amountInTokens < len ? amountInTokens : len;
            // transfers owned NFTs from `from` to `to` until either all are transferred or the desired amount is reached
            // Subtracts transferred NFT count from `amountInTokens` to update remaining transfers
            for (uint i = 0; i < len; i++) {
                _transfer721(from, to, ownedNFTsArray[0]); 
            }
            amountInTokens -= len;
            len = brokenIDsArray.length;
            len = amountInTokens < len ? amountInTokens : len;
            
            // recovers NFTs from the broken state to `to`, or mints new ones if not enough broken NFTs are available
            // if any tokens remain to be allocated, it mints new NFTs to `to` for the remaining balance
            for (uint i = 0; i < len; i++) {        
                _transfer721(address(0), to, brokenIDsArray[brokenIDsArray.length - 1]);
                brokenIDsArray.pop();
            }

            _mintBatch(to, amountInTokens - len);

        }
    }

    function _mintBatch(address to, uint256 amount) internal virtual {
        if(amount == 0) return; // Exit if no NFTs to mint

        if(amount == 1) { // Optimize single mint process
            _mint(to);
            return;
        }
        uint64 id = minted; // Start ID from last minted value
        uint256 ownedLen = ownedNFTs[to].length; // Current number of NFTs owned by 'to'
        for(uint i = 0; i < amount;) {
            unchecked {
                id++; // Increment ID for each new NFT
            }
            ownerOf[id] = to; // Assign new NFT to owner.
            idToIndex[id] = ownedLen; // Map NFT ID to its index in owner's array
            ownedNFTs[to].push(id); // Add new NFT ID to owner's list

            libES721.emitTransfer(address(0), to, id); // Emit NFT transfer event

            unchecked {
                ownedLen++; // Increment count of owned NFTs
                i++; // Move to next NFT
            }
        }
        unchecked {
            minted += uint64(amount); // Update total minted count
        }
    }


    function _mint(address to) internal virtual returns(uint64 tokenId){
        unchecked {
            minted++; // Increment the total number of minted tokens
        }
        tokenId = minted; // Assign the newly minted token ID

        ownerOf[tokenId] = to; // Set ownership of the new token to 'to'
        idToIndex[tokenId] = ownedNFTs[to].length; // Map the new token ID to its index in the owner's list
        ownedNFTs[to].push(tokenId); // Add the new token ID to the owner's list of owned tokens
        
        libES721.emitTransfer(address(0), to, tokenId); // Emit an event for the token transfer
    }


    // Updates the mappings and arrays managing ownership and index of NFTs after a transfer
    function _updateOwnedNFTs(address from, address to, uint64 tokenId) internal { 
        uint256 index = idToIndex[tokenId]; // Get current index of the token in the owner's list
        uint64[] storage nftArray = ownedNFTs[from]; // Reference to the list of NFTs owned by 'from'
        uint256 len = nftArray.length; // Current number of NFTs owned by 'from'
        uint64 lastTokenId = nftArray[len - 1]; // Last token in the 'from' array to swap with transferred token
        
        nftArray[index] = lastTokenId; // Replace the transferred token with the last token in the array
        nftArray.pop(); // Remove the last element, effectively deleting the transferred token from 'from'
        
        if(len - 1 != 0){ 
            idToIndex[lastTokenId] = index; // Update the index of the swapped token
        } 
    
        ownedNFTs[to].push(tokenId); // Add the transferred token to the 'to' array
        idToIndex[tokenId] = ownedNFTs[to].length - 1; // Update the index mapping for the transferred token
    }

    // Executes a simple ERC20 token transfer.
    function _transfer20(address from, address to, uint256 amount) internal {
        _balanceOf[from] -= amount; // Deduct the amount from the sender's balance
        unchecked {
            _balanceOf[to] += amount; // Add the amount to the recipient's balance
        }
        libES20.emitTransfer(from, to, amount); // Emit an ERC20 transfer event
    }

    // Handles the transfer of an ERC721 token, ensuring proper ownership and event emission
    function _transfer721(address from, address to, uint64 tokenId) internal virtual {
        require(from == ownerOf[tokenId], "E741: Incorrect owner"); // Ensure 'from' is the current owner
        
        delete _nftApprovals[tokenId]; // Clear any approvals for this token
        ownerOf[tokenId] = to; // Transfer ownership of the token to 'to'
        _updateOwnedNFTs(from, to, tokenId); // Update ownership tracking structures
        libES721.emitTransfer(from, to, tokenId); // Emit an ERC721 transfer event
    }


    // only erc20 calls this
    // if amount is a token id owned my the caller send as an NFT
    // else transfer741
    function transfer(address to, uint amount) public override returns (bool) {
        if(ownerOf[amount] == msg.sender) {
            _transfer721(msg.sender, to, uint64(amount));
            _transfer20(msg.sender, to, ONE);
            return true;
        }
        _transfer741(msg.sender, to, amount);
        return true;
    }

    // erc20 and erc721 call this
    function transferFrom(address from, address to, uint amount) public override returns (bool) {

        //if amount is within the NFT id range, then a simple NFT transfer + token amount (ONE)
        if(amount >= ONE && amount <= MAXID) {
            require(
                //require from is the msg caller, or that caller is approved for that specific NFT, or all NFTs 
                msg.sender == from || msg.sender == getApproved(amount) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
                );

            _transfer721(from, to, uint64(amount));
            _transfer20(from, to, ONE);
            return true;
        }

        _spendAllowance(from, msg.sender, amount);
        _transfer741(from, to, amount);
        return true;

    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
            );
        _transfer721(from, to, uint64(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, "") !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    // erc721
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public payable override {
        require(
                msg.sender == from || msg.sender == getApproved(tokenId) || isApprovedForAll(from, msg.sender),
                "E741: You don't have the right"
            );
        _transfer721(from, to, uint64(tokenId)); 
        _transfer20(from, to, ONE);

        if (
            to.code.length != 0 &&
            IERC721TokenReceiver(to).onERC721Received(msg.sender, from, tokenId, data) !=
            IERC721TokenReceiver.onERC721Received.selector
        ) {
            revert UnsupportedReceiver();
        }
    }

    function _spendAllowance(address owner, address spender, uint amount) internal virtual {
        require(_allowance[owner][spender] >= amount, "E741: insufficient allowance");
        _allowance[owner][spender] -= amount;
    }

    function getApproved(uint256 tokenId) public view override returns (address) {
        if (ownerOf[tokenId] == address(0)) revert();
        return _nftApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved) public override {
        _operatorApprovals[msg.sender][operator] = approved;
        libES721.emitApprovalForAll(msg.sender, operator, approved);
    }

    function isApprovedForAll(address owner, address operator) public view override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    function tokenURI(uint256 tokenId) public view virtual returns (string memory) {
        require(tokenId <= MAXID, "E741: invalid id");
        if (bytes(baseURI).length == 0) {return "";}
        return string(abi.encodePacked(baseURI, toString(tokenId - ONE), ".json"));
    }

    function toString(uint256 value) internal pure returns (string memory) {
        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(value % 10) + 48); value /= 10;}
        return string(buffer);
    }

    function withdraw() external onlyDev override {
        (bool success,) = payable(dev).call{value: address(this).balance}("");
        require(success);
    }

    function supportsInterface(bytes4 interfaceId) public view override returns (bool) {
        return
            // Even though we support ERC721 and should return true, etherscan wants to treat us as ERC721 instead of ERC20
            // @DEV ERC165 for ERC721 can be toggled on for reasons of frontend/dapp/script implementations, but is very specific
            (supportsNFTinterface && interfaceId == 0x80ac58cd) || // ERC165 interface ID for ERC721
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165
            interfaceId == 0x36372b07 || // ERC165 interface ID for ERC20
            interfaceId == 0x150b7a02 || // ERC165 interface ID for IERC721TokenReceiver
            interfaceId == 0x5a46575f;   // ERC165 interface ID for IE741
            
    }
}

contract E741V1Token is E741V1Base {

    constructor() {}

    function initialze(bytes memory encodedParameters) public override {
        require(_decimals == 0, "Already initialized");
        (_name, _symbol, _decimals, baseURI, _contractURI, _totalIds) = abi.decode(encodedParameters, (string,string,uint,string,string,uint));
        
        ONE = 10 ** _decimals;
        MAXID = ONE + _totalIds - 1;
        minted = uint64(ONE) - 1; // start minting from ID ONE-1 so you can get id 0

        _balanceOf[msg.sender] = totalSupply();

        require(ONE > _totalIds, "Not enough decimals for NFT count");
    }

    function deposit(uint[] memory /*amountsArray20*/) public pure override {
        revert("Unsupported");
    }

    function withdraw(uint256[] memory /*_amounts741*/) public override payable {
        revert("Unsupported");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"UnsupportedReceiver","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newDev","type":"address"}],"name":"changeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"deposit","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"encodedParameters","type":"bytes"}],"name":"initialze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"nftBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownedNFTs","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newContractURI","type":"string"}],"name":"setContractURI","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":"supportsNFTinterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggelNFTinterface","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint64[]","name":"","type":"uint64[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

608060405234801561000f575f80fd5b50600a80546001600160a01b031916331790556127858061002f5f395ff3fe6080604052600436106101f1575f3560e01c80636c0360eb11610108578063a22cb4651161009d578063c87b56dd1161006d578063c87b56dd146105d5578063dd62ed3e146105f4578063e8a3d48514610638578063e985e9c51461064c578063ff54d6f01461066b575f80fd5b8063a22cb46514610564578063a563833b14610583578063a9059cbb146105a3578063b88d4fde146105c2575f80fd5b806391cca3db116100d857806391cca3db14610504578063938e3d7b1461052357806395d89b4114610542578063983d95ce14610556575f80fd5b80636c0360eb1461047157806370a08231146104855780638462151c146104b957806388a8c95c146104e5575f80fd5b806323b872dd116101895780634f02c420116101595780634f02c420146103cc57806355f804b3146103eb578063598b8e711461040a5780636352211e146104295780636bcef9a61461045d575f80fd5b806323b872dd14610370578063313ce5671461038f5780633ccfd60b146103a357806342842e0e146103b9575f80fd5b80630e313e98116101c45780630e313e98146102a0578063150b7a02146102e257806318160ddd146103255780631a72b87d14610339575f80fd5b806301ffc9a7146101f557806306fdde0314610229578063081812fc1461024a578063095ea7b314610281575b5f80fd5b348015610200575f80fd5b5061021461020f366004611dd0565b61068a565b60405190151581526020015b60405180910390f35b348015610234575f80fd5b5061023d610727565b6040516102209190611e38565b348015610255575f80fd5b50610269610264366004611e4a565b6107b7565b6040516001600160a01b039091168152602001610220565b34801561028c575f80fd5b5061021461029b366004611e77565b6107f1565b3480156102ab575f80fd5b506102d46102ba366004611e9f565b6001600160a01b03165f9081526010602052604090205490565b604051908152602001610220565b3480156102ed575f80fd5b5061030c6102fc366004611f7b565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610220565b348015610330575f80fd5b506102d46108ff565b348015610344575f80fd5b50610358610353366004611e77565b610915565b6040516001600160401b039091168152602001610220565b34801561037b575f80fd5b5061021461038a366004611fde565b61095c565b34801561039a575f80fd5b506004546102d4565b3480156103ae575f80fd5b506103b7610a13565b005b6103b76103c7366004611fde565b610a9c565b3480156103d7575f80fd5b50600854610358906001600160401b031681565b3480156103f6575f80fd5b506103b7610405366004612017565b610bdb565b348015610415575f80fd5b506103b761042436600461205b565b610c14565b348015610434575f80fd5b50610269610443366004611e4a565b600d6020525f90815260409020546001600160a01b031681565b348015610468575f80fd5b506103b7610c4a565b34801561047c575f80fd5b5061023d610c95565b348015610490575f80fd5b506102d461049f366004611e9f565b6001600160a01b03165f908152600f602052604090205490565b3480156104c4575f80fd5b506104d86104d3366004611e9f565b610d20565b60405161022091906120fb565b3480156104f0575f80fd5b506103b76104ff366004611e9f565b610dba565b34801561050f575f80fd5b50600a54610269906001600160a01b031681565b34801561052e575f80fd5b506103b761053d366004612017565b610e06565b34801561054d575f80fd5b5061023d610e3c565b6103b761042436600461205b565b34801561056f575f80fd5b506103b761057e366004612147565b610e4b565b34801561058e575f80fd5b50600a5461021490600160a01b900460ff1681565b3480156105ae575f80fd5b506102146105bd366004611e77565b610e84565b6103b76105d0366004611f7b565b610ece565b3480156105e0575f80fd5b5061023d6105ef366004611e4a565b610ffb565b3480156105ff575f80fd5b506102d461060e366004612180565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205490565b348015610643575f80fd5b5061023d6110a7565b348015610657575f80fd5b50610214610666366004612180565b6110b6565b348015610676575f80fd5b506103b76106853660046121b1565b6110e3565b600a545f90600160a01b900460ff1680156106b557506380ac58cd60e01b6001600160e01b03198316145b806106d057506301ffc9a760e01b6001600160e01b03198316145b806106eb57506336372b0760e01b6001600160e01b03198316145b806107065750630a85bd0160e11b6001600160e01b03198316145b806107215750635a46575f60e01b6001600160e01b03198316145b92915050565b606060028054610736906121e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610762906121e2565b80156107ad5780601f10610784576101008083540402835291602001916107ad565b820191905f5260205f20905b81548152906001019060200180831161079057829003601f168201915b5050505050905090565b5f818152600d60205260408120546001600160a01b03166107d6575f80fd5b505f908152600e60205260409020546001600160a01b031690565b5f600654821015801561080657506007548211155b156108c6575f828152600d60205260409020546001600160a01b0316338114801590610839575061083781336110b6565b155b1561088b5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600e6020526040902080546001600160a01b0319166001600160a01b0386161790556108bc81858561125f565b6001915050610721565b335f818152600c602090815260408083206001600160a01b038816845290915290208390556108f69084846112a5565b50600192915050565b5f600654600554610910919061222e565b905090565b6010602052815f5260405f20818154811061092e575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f600654821015801561097157506007548211155b156109f257336001600160a01b03851614806109a65750610991826107b7565b6001600160a01b0316336001600160a01b0316145b806109b657506109b684336110b6565b6109d25760405162461bcd60e51b815260040161088290612245565b6109dd8484846112f7565b6109ea84846006546113c5565b506001610a0c565b6109fd843384611419565b610a088484846114cd565b5060015b9392505050565b600a546001600160a01b03163314610a3d5760405162461bcd60e51b81526004016108829061227c565b600a546040515f916001600160a01b03169047908381818185875af1925050503d805f8114610a87576040519150601f19603f3d011682016040523d82523d5f602084013e610a8c565b606091505b5050905080610a99575f80fd5b50565b336001600160a01b0384161480610acc5750610ab7816107b7565b6001600160a01b0316336001600160a01b0316145b80610adc5750610adc83336110b6565b610af85760405162461bcd60e51b815260040161088290612245565b610b038383836112f7565b610b1083836006546113c5565b6001600160a01b0382163b15801590610bb85750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bab91906122a7565b6001600160e01b03191614155b15610bd6576040516301d6c93560e61b815260040160405180910390fd5b505050565b600a546001600160a01b03163314610c055760405162461bcd60e51b81526004016108829061227c565b5f610c10828261230d565b5050565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606401610882565b600a546001600160a01b03163314610c745760405162461bcd60e51b81526004016108829061227c565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610ca1906121e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccd906121e2565b8015610d185780601f10610cef57610100808354040283529160200191610d18565b820191905f5260205f20905b815481529060010190602001808311610cfb57829003601f168201915b505050505081565b6001600160a01b0381165f90815260106020908152604091829020805483518184028101840190945280845260609392830182828015610dae57602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b031681526020019060080190602082600701049283019260010382029150808411610d6b5790505b50505050509050919050565b600a546001600160a01b03163314610de45760405162461bcd60e51b81526004016108829061227c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314610e305760405162461bcd60e51b81526004016108829061227c565b6001610c10828261230d565b606060038054610736906121e2565b335f818152600b602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610c10908383611872565b5f818152600d6020526040812054336001600160a01b0390911603610ec357610eae3384846112f7565b610ebb33846006546113c5565b506001610721565b6108f63384846114cd565b336001600160a01b0385161480610efe5750610ee9826107b7565b6001600160a01b0316336001600160a01b0316145b80610f0e5750610f0e84336110b6565b610f2a5760405162461bcd60e51b815260040161088290612245565b610f358484846112f7565b610f4284846006546113c5565b6001600160a01b0383163b15801590610fd75750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610f8a9033908990889088906004016123cc565b6020604051808303815f875af1158015610fa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fca91906122a7565b6001600160e01b03191614155b15610ff5576040516301d6c93560e61b815260040160405180910390fd5b50505050565b60606007548211156110425760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610882565b5f805461104e906121e2565b90505f0361106957505060408051602081019091525f815290565b5f6110806006548461107b9190612408565b6118b9565b60405160200161109192919061241b565b6040516020818303038152906040529050919050565b606060018054610736906121e2565b6001600160a01b039182165f908152600b6020908152604080832093909416825291909152205460ff1690565b600454156111295760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610882565b8080602001905181019061113d91906124f0565b600581905560025f600381600481808060016111598b8261230d565b5061116690508a8261230d565b505088905550611176888261230d565b506111839050878261230d565b50505050505050600454600a6111999190612677565b60068190556005546001916111ae9190612682565b6111b89190612408565b6007556006546111ca90600190612695565b6008805467ffffffffffffffff19166001600160401b03929092169190911790556111f36108ff565b335f908152600f602052604090205560055460065411610a995760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610882565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112ea91815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600d60205260409020546001600160a01b038481169116146113615760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610882565b6001600160401b0381165f908152600e6020908152604080832080546001600160a01b0319908116909155600d90925290912080549091166001600160a01b0384161790556113b18383836119bd565b610bd68383836001600160401b0316611b73565b6001600160a01b0383165f908152600f6020526040812080548392906113ec908490612408565b90915550506001600160a01b0382165f908152600f60205260409020805482019055610bd6838383611bb9565b6001600160a01b038084165f908152600c602090815260408083209386168352929052205481111561148d5760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610882565b6001600160a01b038084165f908152600c60209081526040808320938616835292905290812080548392906114c3908490612408565b9091555050505050565b6001600160a01b0383165f908152600f60205260409020548111156115425760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610882565b6006546001600160a01b0384165f908152600f60205260408120549091611568916126d0565b6006546001600160a01b0385165f908152600f60205260408120549293509161159191906126d0565b905061159e8585856113c5565b6006546001600160a01b0386165f908152600f602052604081205490916115c4916126d0565b6006546001600160a01b0387165f908152600f6020526040812054929350916115ed91906126d0565b6001600160a01b0388165f90815260106020526040902090915060098386101561169857815415611698575f825f8154811061162b5761162b6126e3565b5f9182526020808320600480840490910154865460018101885587865292852091830490910180546003948516600890810261010090810a9094046001600160401b03908116969095160290920a8481029302199091169190911790559150611696908b90836112f7565b505b828511156117495780541561173e576116fa5f8983600185805490506116be9190612408565b815481106116ce576116ce6126e3565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03166112f7565b8080548061170a5761170a6126f7565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611749565b61174788611bfe565b505b5f60065488611758919061270b565b8354600a54919250906001600160a01b03908116908c1603611786578082106117815780611783565b815b91505b811561186557808210611799578061179b565b815b90505f5b818110156117c6576117be8c8c875f815481106116ce576116ce6126e3565b60010161179f565b506117d18183612408565b835490925090508082106117e557806117e7565b815b90505f5b818110156118515761180a5f8c86600188805490506116be9190612408565b8380548061181a5761181a6126f7565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a021916905590556001016117eb565b506118658a6118608385612408565b611caa565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ea911515815260200190565b6060815f036118df5750506040805180820190915260018152600360fc1b602082015290565b815f5b811561190857806118f28161271e565b91506119019050600a8361270b565b91506118e2565b5f816001600160401b0381111561192157611921611eb8565b6040519080825280601f01601f19166020018201604052801561194b576020820181803683370190505b5090505b84156119b557611960600183612408565b915061196d600a866126d0565b611978906030612736565b60f81b81838151811061198d5761198d6126e3565b60200101906001600160f81b03191690815f1a9053506119ae600a8661270b565b945061194f565b949350505050565b6001600160401b0381165f908152601160209081526040808320546001600160a01b03871684526010909252822080549192909190826119fe600184612408565b81548110611a0e57611a0e6126e3565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b0316905080838581548110611a4a57611a4a6126e3565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b0316021790555082805480611a9157611a916126f7565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611acb600183612408565b15611aeb576001600160401b0381165f9081526011602052604090208490555b6001600160a01b0386165f81815260106020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c1602919091179055929091529054611b4f9190612408565b6001600160401b039095165f90815260116020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112ea91815260200190565b6008805467ffffffffffffffff19811660016001600160401b039283168101831691821784555f828152600d6020908152604080832080546001600160a01b0319166001600160a01b038a1690811790915583526010808352818420805487865260118552928520839055908352938101845592825281206004830401805460039093169095026101000a9384021990911692820292909217909255611ca5908383611b73565b919050565b805f03611cb5575050565b80600103611cc657610bd682611bfe565b6008546001600160a01b0383165f908152601060205260408120546001600160401b0390921691905b83811015611d8e5760019283016001600160401b038181165f818152600d6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560118352818420899055835260108252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093611d8291908790611b73565b60019182019101611cef565b50506008805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610a99575f80fd5b5f60208284031215611de0575f80fd5b8135610a0c81611dbb565b5f5b83811015611e05578181015183820152602001611ded565b50505f910152565b5f8151808452611e24816020860160208601611deb565b601f01601f19169290920160200192915050565b602081525f610a0c6020830184611e0d565b5f60208284031215611e5a575f80fd5b5035919050565b80356001600160a01b0381168114611ca5575f80fd5b5f8060408385031215611e88575f80fd5b611e9183611e61565b946020939093013593505050565b5f60208284031215611eaf575f80fd5b610a0c82611e61565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715611ef457611ef4611eb8565b604052919050565b5f6001600160401b03821115611f1457611f14611eb8565b50601f01601f191660200190565b5f611f34611f2f84611efc565b611ecc565b9050828152838383011115611f47575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112611f6c575f80fd5b610a0c83833560208501611f22565b5f805f8060808587031215611f8e575f80fd5b611f9785611e61565b9350611fa560208601611e61565b92506040850135915060608501356001600160401b03811115611fc6575f80fd5b611fd287828801611f5d565b91505092959194509250565b5f805f60608486031215611ff0575f80fd5b611ff984611e61565b925061200760208501611e61565b9150604084013590509250925092565b5f60208284031215612027575f80fd5b81356001600160401b0381111561203c575f80fd5b8201601f8101841361204c575f80fd5b6119b584823560208401611f22565b5f602080838503121561206c575f80fd5b82356001600160401b0380821115612082575f80fd5b818501915085601f830112612095575f80fd5b8135818111156120a7576120a7611eb8565b8060051b91506120b8848301611ecc565b81815291830184019184810190888411156120d1575f80fd5b938501935b838510156120ef578435825293850193908501906120d6565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b8181101561213b5783516001600160401b031683529284019291840191600101612116565b50909695505050505050565b5f8060408385031215612158575f80fd5b61216183611e61565b915060208301358015158114612175575f80fd5b809150509250929050565b5f8060408385031215612191575f80fd5b61219a83611e61565b91506121a860208401611e61565b90509250929050565b5f602082840312156121c1575f80fd5b81356001600160401b038111156121d6575f80fd5b6119b584828501611f5d565b600181811c908216806121f657607f821691505b60208210810361221457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107215761072161221a565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f602082840312156122b7575f80fd5b8151610a0c81611dbb565b601f821115610bd657805f5260205f20601f840160051c810160208510156122e75750805b601f840160051c820191505b81811015612306575f81556001016122f3565b5050505050565b81516001600160401b0381111561232657612326611eb8565b61233a8161233484546121e2565b846122c2565b602080601f83116001811461236d575f84156123565750858301515b5f19600386901b1c1916600185901b1785556123c4565b5f85815260208120601f198616915b8281101561239b5788860151825594840194600190910190840161237c565b50858210156123b857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906123fe90830184611e0d565b9695505050505050565b818103818111156107215761072161221a565b5f808454612428816121e2565b60018281168015612440576001811461245557612481565b60ff1984168752821515830287019450612481565b885f526020805f205f5b858110156124785781548a82015290840190820161245f565b50505082870194505b505050508351612495818360208801611deb565b64173539b7b760d91b9101908152600501949350505050565b5f82601f8301126124bd575f80fd5b81516124cb611f2f82611efc565b8181528460208386010111156124df575f80fd5b6119b5826020830160208701611deb565b5f805f805f8060c08789031215612505575f80fd5b86516001600160401b038082111561251b575f80fd5b6125278a838b016124ae565b9750602089015191508082111561253c575f80fd5b6125488a838b016124ae565b9650604089015195506060890151915080821115612564575f80fd5b6125708a838b016124ae565b94506080890151915080821115612585575f80fd5b5061259289828a016124ae565b92505060a087015190509295509295509295565b600181815b808511156125e057815f19048211156125c6576125c661221a565b808516156125d357918102915b93841c93908002906125ab565b509250929050565b5f826125f657506001610721565b8161260257505f610721565b81600181146108bc576002810361262f5760ff8411156126245761262461221a565b50506001821b610721565b5060208310610133831016604e8410600b8410161715612652575081810a610721565b61265c83836125a6565b805f190482111561266f5761266f61221a565b029392505050565b5f610a0c83836125e8565b808201808211156107215761072161221a565b6001600160401b038281168282160390808211156126b5576126b561221a565b5092915050565b634e487b7160e01b5f52601260045260245ffd5b5f826126de576126de6126bc565b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f82612719576127196126bc565b500490565b5f6001820161272f5761272f61221a565b5060010190565b60ff81811683821601908111156107215761072161221a56fea2646970667358221220d10c8c7986b55e3c6498a13e8b98294df6d0b9e7cc2765303d9252ceeaf6e40c64736f6c63430008180033

Deployed Bytecode

0x6080604052600436106101f1575f3560e01c80636c0360eb11610108578063a22cb4651161009d578063c87b56dd1161006d578063c87b56dd146105d5578063dd62ed3e146105f4578063e8a3d48514610638578063e985e9c51461064c578063ff54d6f01461066b575f80fd5b8063a22cb46514610564578063a563833b14610583578063a9059cbb146105a3578063b88d4fde146105c2575f80fd5b806391cca3db116100d857806391cca3db14610504578063938e3d7b1461052357806395d89b4114610542578063983d95ce14610556575f80fd5b80636c0360eb1461047157806370a08231146104855780638462151c146104b957806388a8c95c146104e5575f80fd5b806323b872dd116101895780634f02c420116101595780634f02c420146103cc57806355f804b3146103eb578063598b8e711461040a5780636352211e146104295780636bcef9a61461045d575f80fd5b806323b872dd14610370578063313ce5671461038f5780633ccfd60b146103a357806342842e0e146103b9575f80fd5b80630e313e98116101c45780630e313e98146102a0578063150b7a02146102e257806318160ddd146103255780631a72b87d14610339575f80fd5b806301ffc9a7146101f557806306fdde0314610229578063081812fc1461024a578063095ea7b314610281575b5f80fd5b348015610200575f80fd5b5061021461020f366004611dd0565b61068a565b60405190151581526020015b60405180910390f35b348015610234575f80fd5b5061023d610727565b6040516102209190611e38565b348015610255575f80fd5b50610269610264366004611e4a565b6107b7565b6040516001600160a01b039091168152602001610220565b34801561028c575f80fd5b5061021461029b366004611e77565b6107f1565b3480156102ab575f80fd5b506102d46102ba366004611e9f565b6001600160a01b03165f9081526010602052604090205490565b604051908152602001610220565b3480156102ed575f80fd5b5061030c6102fc366004611f7b565b630a85bd0160e11b949350505050565b6040516001600160e01b03199091168152602001610220565b348015610330575f80fd5b506102d46108ff565b348015610344575f80fd5b50610358610353366004611e77565b610915565b6040516001600160401b039091168152602001610220565b34801561037b575f80fd5b5061021461038a366004611fde565b61095c565b34801561039a575f80fd5b506004546102d4565b3480156103ae575f80fd5b506103b7610a13565b005b6103b76103c7366004611fde565b610a9c565b3480156103d7575f80fd5b50600854610358906001600160401b031681565b3480156103f6575f80fd5b506103b7610405366004612017565b610bdb565b348015610415575f80fd5b506103b761042436600461205b565b610c14565b348015610434575f80fd5b50610269610443366004611e4a565b600d6020525f90815260409020546001600160a01b031681565b348015610468575f80fd5b506103b7610c4a565b34801561047c575f80fd5b5061023d610c95565b348015610490575f80fd5b506102d461049f366004611e9f565b6001600160a01b03165f908152600f602052604090205490565b3480156104c4575f80fd5b506104d86104d3366004611e9f565b610d20565b60405161022091906120fb565b3480156104f0575f80fd5b506103b76104ff366004611e9f565b610dba565b34801561050f575f80fd5b50600a54610269906001600160a01b031681565b34801561052e575f80fd5b506103b761053d366004612017565b610e06565b34801561054d575f80fd5b5061023d610e3c565b6103b761042436600461205b565b34801561056f575f80fd5b506103b761057e366004612147565b610e4b565b34801561058e575f80fd5b50600a5461021490600160a01b900460ff1681565b3480156105ae575f80fd5b506102146105bd366004611e77565b610e84565b6103b76105d0366004611f7b565b610ece565b3480156105e0575f80fd5b5061023d6105ef366004611e4a565b610ffb565b3480156105ff575f80fd5b506102d461060e366004612180565b6001600160a01b039182165f908152600c6020908152604080832093909416825291909152205490565b348015610643575f80fd5b5061023d6110a7565b348015610657575f80fd5b50610214610666366004612180565b6110b6565b348015610676575f80fd5b506103b76106853660046121b1565b6110e3565b600a545f90600160a01b900460ff1680156106b557506380ac58cd60e01b6001600160e01b03198316145b806106d057506301ffc9a760e01b6001600160e01b03198316145b806106eb57506336372b0760e01b6001600160e01b03198316145b806107065750630a85bd0160e11b6001600160e01b03198316145b806107215750635a46575f60e01b6001600160e01b03198316145b92915050565b606060028054610736906121e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610762906121e2565b80156107ad5780601f10610784576101008083540402835291602001916107ad565b820191905f5260205f20905b81548152906001019060200180831161079057829003601f168201915b5050505050905090565b5f818152600d60205260408120546001600160a01b03166107d6575f80fd5b505f908152600e60205260409020546001600160a01b031690565b5f600654821015801561080657506007548211155b156108c6575f828152600d60205260409020546001600160a01b0316338114801590610839575061083781336110b6565b155b1561088b5760405162461bcd60e51b815260206004820152601a60248201527f453734313a20596f7520617265206e6f7420617070726f76656400000000000060448201526064015b60405180910390fd5b5f838152600e6020526040902080546001600160a01b0319166001600160a01b0386161790556108bc81858561125f565b6001915050610721565b335f818152600c602090815260408083206001600160a01b038816845290915290208390556108f69084846112a5565b50600192915050565b5f600654600554610910919061222e565b905090565b6010602052815f5260405f20818154811061092e575f80fd5b905f5260205f209060049182820401919006600802915091509054906101000a90046001600160401b031681565b5f600654821015801561097157506007548211155b156109f257336001600160a01b03851614806109a65750610991826107b7565b6001600160a01b0316336001600160a01b0316145b806109b657506109b684336110b6565b6109d25760405162461bcd60e51b815260040161088290612245565b6109dd8484846112f7565b6109ea84846006546113c5565b506001610a0c565b6109fd843384611419565b610a088484846114cd565b5060015b9392505050565b600a546001600160a01b03163314610a3d5760405162461bcd60e51b81526004016108829061227c565b600a546040515f916001600160a01b03169047908381818185875af1925050503d805f8114610a87576040519150601f19603f3d011682016040523d82523d5f602084013e610a8c565b606091505b5050905080610a99575f80fd5b50565b336001600160a01b0384161480610acc5750610ab7816107b7565b6001600160a01b0316336001600160a01b0316145b80610adc5750610adc83336110b6565b610af85760405162461bcd60e51b815260040161088290612245565b610b038383836112f7565b610b1083836006546113c5565b6001600160a01b0382163b15801590610bb85750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401525f608484015290919084169063150b7a029060a4016020604051808303815f875af1158015610b87573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610bab91906122a7565b6001600160e01b03191614155b15610bd6576040516301d6c93560e61b815260040160405180910390fd5b505050565b600a546001600160a01b03163314610c055760405162461bcd60e51b81526004016108829061227c565b5f610c10828261230d565b5050565b60405162461bcd60e51b815260206004820152600b60248201526a155b9cdd5c1c1bdc9d195960aa1b6044820152606401610882565b600a546001600160a01b03163314610c745760405162461bcd60e51b81526004016108829061227c565b600a805460ff60a01b198116600160a01b9182900460ff1615909102179055565b5f8054610ca1906121e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccd906121e2565b8015610d185780601f10610cef57610100808354040283529160200191610d18565b820191905f5260205f20905b815481529060010190602001808311610cfb57829003601f168201915b505050505081565b6001600160a01b0381165f90815260106020908152604091829020805483518184028101840190945280845260609392830182828015610dae57602002820191905f5260205f20905f905b82829054906101000a90046001600160401b03166001600160401b031681526020019060080190602082600701049283019260010382029150808411610d6b5790505b50505050509050919050565b600a546001600160a01b03163314610de45760405162461bcd60e51b81526004016108829061227c565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b600a546001600160a01b03163314610e305760405162461bcd60e51b81526004016108829061227c565b6001610c10828261230d565b606060038054610736906121e2565b335f818152600b602090815260408083206001600160a01b03871684529091529020805460ff1916831515179055610c10908383611872565b5f818152600d6020526040812054336001600160a01b0390911603610ec357610eae3384846112f7565b610ebb33846006546113c5565b506001610721565b6108f63384846114cd565b336001600160a01b0385161480610efe5750610ee9826107b7565b6001600160a01b0316336001600160a01b0316145b80610f0e5750610f0e84336110b6565b610f2a5760405162461bcd60e51b815260040161088290612245565b610f358484846112f7565b610f4284846006546113c5565b6001600160a01b0383163b15801590610fd75750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610f8a9033908990889088906004016123cc565b6020604051808303815f875af1158015610fa6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fca91906122a7565b6001600160e01b03191614155b15610ff5576040516301d6c93560e61b815260040160405180910390fd5b50505050565b60606007548211156110425760405162461bcd60e51b815260206004820152601060248201526f114dcd0c4e881a5b9d985b1a59081a5960821b6044820152606401610882565b5f805461104e906121e2565b90505f0361106957505060408051602081019091525f815290565b5f6110806006548461107b9190612408565b6118b9565b60405160200161109192919061241b565b6040516020818303038152906040529050919050565b606060018054610736906121e2565b6001600160a01b039182165f908152600b6020908152604080832093909416825291909152205460ff1690565b600454156111295760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610882565b8080602001905181019061113d91906124f0565b600581905560025f600381600481808060016111598b8261230d565b5061116690508a8261230d565b505088905550611176888261230d565b506111839050878261230d565b50505050505050600454600a6111999190612677565b60068190556005546001916111ae9190612682565b6111b89190612408565b6007556006546111ca90600190612695565b6008805467ffffffffffffffff19166001600160401b03929092169190911790556111f36108ff565b335f908152600f602052604090205560055460065411610a995760405162461bcd60e51b815260206004820152602160248201527f4e6f7420656e6f75676820646563696d616c7320666f72204e465420636f756e6044820152601d60fa1b6064820152608401610882565b80826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516112ea91815260200190565b60405180910390a3505050565b6001600160401b0381165f908152600d60205260409020546001600160a01b038481169116146113615760405162461bcd60e51b8152602060048201526015602482015274229b9a189d1024b731b7b93932b1ba1037bbb732b960591b6044820152606401610882565b6001600160401b0381165f908152600e6020908152604080832080546001600160a01b0319908116909155600d90925290912080549091166001600160a01b0384161790556113b18383836119bd565b610bd68383836001600160401b0316611b73565b6001600160a01b0383165f908152600f6020526040812080548392906113ec908490612408565b90915550506001600160a01b0382165f908152600f60205260409020805482019055610bd6838383611bb9565b6001600160a01b038084165f908152600c602090815260408083209386168352929052205481111561148d5760405162461bcd60e51b815260206004820152601c60248201527f453734313a20696e73756666696369656e7420616c6c6f77616e6365000000006044820152606401610882565b6001600160a01b038084165f908152600c60209081526040808320938616835292905290812080548392906114c3908490612408565b9091555050505050565b6001600160a01b0383165f908152600f60205260409020548111156115425760405162461bcd60e51b815260206004820152602560248201527f453734313a207472616e7366657220616d6f756e7420657863656564732062616044820152646c616e636560d81b6064820152608401610882565b6006546001600160a01b0384165f908152600f60205260408120549091611568916126d0565b6006546001600160a01b0385165f908152600f60205260408120549293509161159191906126d0565b905061159e8585856113c5565b6006546001600160a01b0386165f908152600f602052604081205490916115c4916126d0565b6006546001600160a01b0387165f908152600f6020526040812054929350916115ed91906126d0565b6001600160a01b0388165f90815260106020526040902090915060098386101561169857815415611698575f825f8154811061162b5761162b6126e3565b5f9182526020808320600480840490910154865460018101885587865292852091830490910180546003948516600890810261010090810a9094046001600160401b03908116969095160290920a8481029302199091169190911790559150611696908b90836112f7565b505b828511156117495780541561173e576116fa5f8983600185805490506116be9190612408565b815481106116ce576116ce6126e3565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b03166112f7565b8080548061170a5761170a6126f7565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611749565b61174788611bfe565b505b5f60065488611758919061270b565b8354600a54919250906001600160a01b03908116908c1603611786578082106117815780611783565b815b91505b811561186557808210611799578061179b565b815b90505f5b818110156117c6576117be8c8c875f815481106116ce576116ce6126e3565b60010161179f565b506117d18183612408565b835490925090508082106117e557806117e7565b815b90505f5b818110156118515761180a5f8c86600188805490506116be9190612408565b8380548061181a5761181a6126f7565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a021916905590556001016117eb565b506118658a6118608385612408565b611caa565b5050505050505050505050565b816001600160a01b0316836001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112ea911515815260200190565b6060815f036118df5750506040805180820190915260018152600360fc1b602082015290565b815f5b811561190857806118f28161271e565b91506119019050600a8361270b565b91506118e2565b5f816001600160401b0381111561192157611921611eb8565b6040519080825280601f01601f19166020018201604052801561194b576020820181803683370190505b5090505b84156119b557611960600183612408565b915061196d600a866126d0565b611978906030612736565b60f81b81838151811061198d5761198d6126e3565b60200101906001600160f81b03191690815f1a9053506119ae600a8661270b565b945061194f565b949350505050565b6001600160401b0381165f908152601160209081526040808320546001600160a01b03871684526010909252822080549192909190826119fe600184612408565b81548110611a0e57611a0e6126e3565b905f5260205f2090600491828204019190066008029054906101000a90046001600160401b0316905080838581548110611a4a57611a4a6126e3565b905f5260205f2090600491828204019190066008026101000a8154816001600160401b0302191690836001600160401b0316021790555082805480611a9157611a916126f7565b5f8281526020902060045f199092019182040180546001600160401b03600860038516026101000a02191690559055611acb600183612408565b15611aeb576001600160401b0381165f9081526011602052604090208490555b6001600160a01b0386165f81815260106020908152604082208054600180820183558285529284206004820401805460039092166008026101000a6001600160401b0381810219909316928c1602919091179055929091529054611b4f9190612408565b6001600160401b039095165f90815260116020526040902094909455505050505050565b80826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516112ea91815260200190565b6008805467ffffffffffffffff19811660016001600160401b039283168101831691821784555f828152600d6020908152604080832080546001600160a01b0319166001600160a01b038a1690811790915583526010808352818420805487865260118552928520839055908352938101845592825281206004830401805460039093169095026101000a9384021990911692820292909217909255611ca5908383611b73565b919050565b805f03611cb5575050565b80600103611cc657610bd682611bfe565b6008546001600160a01b0383165f908152601060205260408120546001600160401b0390921691905b83811015611d8e5760019283016001600160401b038181165f818152600d6020908152604080832080546001600160a01b0319166001600160a01b038d1690811790915560118352818420899055835260108252822080549889018155825281206004880401805460039098166008026101000a93840219909716928202929092179095559093611d8291908790611b73565b60019182019101611cef565b50506008805467ffffffffffffffff1981166001600160401b039182169490940116929092179091555050565b6001600160e01b031981168114610a99575f80fd5b5f60208284031215611de0575f80fd5b8135610a0c81611dbb565b5f5b83811015611e05578181015183820152602001611ded565b50505f910152565b5f8151808452611e24816020860160208601611deb565b601f01601f19169290920160200192915050565b602081525f610a0c6020830184611e0d565b5f60208284031215611e5a575f80fd5b5035919050565b80356001600160a01b0381168114611ca5575f80fd5b5f8060408385031215611e88575f80fd5b611e9183611e61565b946020939093013593505050565b5f60208284031215611eaf575f80fd5b610a0c82611e61565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715611ef457611ef4611eb8565b604052919050565b5f6001600160401b03821115611f1457611f14611eb8565b50601f01601f191660200190565b5f611f34611f2f84611efc565b611ecc565b9050828152838383011115611f47575f80fd5b828260208301375f602084830101529392505050565b5f82601f830112611f6c575f80fd5b610a0c83833560208501611f22565b5f805f8060808587031215611f8e575f80fd5b611f9785611e61565b9350611fa560208601611e61565b92506040850135915060608501356001600160401b03811115611fc6575f80fd5b611fd287828801611f5d565b91505092959194509250565b5f805f60608486031215611ff0575f80fd5b611ff984611e61565b925061200760208501611e61565b9150604084013590509250925092565b5f60208284031215612027575f80fd5b81356001600160401b0381111561203c575f80fd5b8201601f8101841361204c575f80fd5b6119b584823560208401611f22565b5f602080838503121561206c575f80fd5b82356001600160401b0380821115612082575f80fd5b818501915085601f830112612095575f80fd5b8135818111156120a7576120a7611eb8565b8060051b91506120b8848301611ecc565b81815291830184019184810190888411156120d1575f80fd5b938501935b838510156120ef578435825293850193908501906120d6565b98975050505050505050565b602080825282518282018190525f9190848201906040850190845b8181101561213b5783516001600160401b031683529284019291840191600101612116565b50909695505050505050565b5f8060408385031215612158575f80fd5b61216183611e61565b915060208301358015158114612175575f80fd5b809150509250929050565b5f8060408385031215612191575f80fd5b61219a83611e61565b91506121a860208401611e61565b90509250929050565b5f602082840312156121c1575f80fd5b81356001600160401b038111156121d6575f80fd5b6119b584828501611f5d565b600181811c908216806121f657607f821691505b60208210810361221457634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b80820281158282048414176107215761072161221a565b6020808252601e908201527f453734313a20596f7520646f6e27742068617665207468652072696768740000604082015260600190565b6020808252601190820152702737ba103a3432903232bb32b637b832b960791b604082015260600190565b5f602082840312156122b7575f80fd5b8151610a0c81611dbb565b601f821115610bd657805f5260205f20601f840160051c810160208510156122e75750805b601f840160051c820191505b81811015612306575f81556001016122f3565b5050505050565b81516001600160401b0381111561232657612326611eb8565b61233a8161233484546121e2565b846122c2565b602080601f83116001811461236d575f84156123565750858301515b5f19600386901b1c1916600185901b1785556123c4565b5f85815260208120601f198616915b8281101561239b5788860151825594840194600190910190840161237c565b50858210156123b857878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f906123fe90830184611e0d565b9695505050505050565b818103818111156107215761072161221a565b5f808454612428816121e2565b60018281168015612440576001811461245557612481565b60ff1984168752821515830287019450612481565b885f526020805f205f5b858110156124785781548a82015290840190820161245f565b50505082870194505b505050508351612495818360208801611deb565b64173539b7b760d91b9101908152600501949350505050565b5f82601f8301126124bd575f80fd5b81516124cb611f2f82611efc565b8181528460208386010111156124df575f80fd5b6119b5826020830160208701611deb565b5f805f805f8060c08789031215612505575f80fd5b86516001600160401b038082111561251b575f80fd5b6125278a838b016124ae565b9750602089015191508082111561253c575f80fd5b6125488a838b016124ae565b9650604089015195506060890151915080821115612564575f80fd5b6125708a838b016124ae565b94506080890151915080821115612585575f80fd5b5061259289828a016124ae565b92505060a087015190509295509295509295565b600181815b808511156125e057815f19048211156125c6576125c661221a565b808516156125d357918102915b93841c93908002906125ab565b509250929050565b5f826125f657506001610721565b8161260257505f610721565b81600181146108bc576002810361262f5760ff8411156126245761262461221a565b50506001821b610721565b5060208310610133831016604e8410600b8410161715612652575081810a610721565b61265c83836125a6565b805f190482111561266f5761266f61221a565b029392505050565b5f610a0c83836125e8565b808201808211156107215761072161221a565b6001600160401b038281168282160390808211156126b5576126b561221a565b5092915050565b634e487b7160e01b5f52601260045260245ffd5b5f826126de576126de6126bc565b500690565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b5f82612719576127196126bc565b500490565b5f6001820161272f5761272f61221a565b5060010190565b60ff81811683821601908111156107215761072161221a56fea2646970667358221220d10c8c7986b55e3c6498a13e8b98294df6d0b9e7cc2765303d9252ceeaf6e40c64736f6c63430008180033

Deployed Bytecode Sourcemap

26261:885:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25459:795;;;;;;;;;;-1:-1:-1;25459:795:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;25459:795:0;;;;;;;;10537:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;24031:180::-;;;;;;;;;;-1:-1:-1;24031:180:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;24031:180:0;1533:203:1;12210:997:0;;;;;;;;;;-1:-1:-1;12210:997:0;;;;;:::i;:::-;;:::i;12004:101::-;;;;;;;;;;-1:-1:-1;12004:101:0;;;;;:::i;:::-;-1:-1:-1;;;;;12078:18:0;12064:4;12078:18;;;:9;:18;;;;;:25;;12004:101;;;;2515:25:1;;;2503:2;2488:18;12004:101:0;2369:177:1;8845:172:0;;;;;;;;;;-1:-1:-1;8845:172:0;;;;;:::i;:::-;-1:-1:-1;;;8845:172:0;;;;;;;;;;-1:-1:-1;;;;;;4424:33:1;;;4406:52;;4394:2;4379:18;8845:172:0;4262:202:1;10789:85:0;;;;;;;;;;;;;:::i;9920:45::-;;;;;;;;;;-1:-1:-1;9920:45:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;4631:31:1;;;4613:50;;4601:2;4586:18;9920:45:0;4469:200:1;21593:817:0;;;;;;;;;;-1:-1:-1;21593:817:0;;;;;:::i;:::-;;:::i;10707:76::-;;;;;;;;;;-1:-1:-1;10771:9:0;;10707:76;;25290:161;;;;;;;;;;;;;:::i;:::-;;22433:654;;;;;;:::i;:::-;;:::i;9409:20::-;;;;;;;;;;-1:-1:-1;9409:20:0;;;;-1:-1:-1;;;;;9409:20:0;;;11121:93;;;;;;;;;;-1:-1:-1;11121:93:0;;;;;:::i;:::-;;:::i;26905:112::-;;;;;;;;;;-1:-1:-1;26905:112:0;;;;;:::i;:::-;;:::i;9756:50::-;;;;;;;;;;-1:-1:-1;9756:50:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;9756:50:0;;;11790:101;;;;;;;;;;;;;:::i;9103:21::-;;;;;;;;;;;;;:::i;10880:104::-;;;;;;;;;;-1:-1:-1;10880:104:0;;;;;:::i;:::-;-1:-1:-1;;;;;10962:19:0;10947:4;10962:19;;;:10;:19;;;;;;;10880:104;11897:101;;;;;;;;;;-1:-1:-1;11897:101:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11336:75::-;;;;;;;;;;-1:-1:-1;11336:75:0;;;;;:::i;:::-;;:::i;9541:18::-;;;;;;;;;;-1:-1:-1;9541:18:0;;;;-1:-1:-1;;;;;9541:18:0;;;11220:110;;;;;;;;;;-1:-1:-1;11220:110:0;;;;;:::i;:::-;;:::i;10620:81::-;;;;;;;;;;;;;:::i;27025:116::-;;;;;;:::i;24219:216::-;;;;;;;;;;-1:-1:-1;24219:216:0;;;;;:::i;:::-;;:::i;9566:32::-;;;;;;;;;;-1:-1:-1;9566:32:0;;;;-1:-1:-1;;;9566:32:0;;;;;;21211:339;;;;;;;;;;-1:-1:-1;21211:339:0;;;;;:::i;:::-;;:::i;23110:675::-;;;;;;:::i;:::-;;:::i;24607:282::-;;;;;;;;;;-1:-1:-1;24607:282:0;;;;;:::i;:::-;;:::i;10990:125::-;;;;;;;;;;-1:-1:-1;10990:125:0;;;;;:::i;:::-;-1:-1:-1;;;;;11086:17:0;;;11071:4;11086:17;;;:10;:17;;;;;;;;:26;;;;;;;;;;;;;10990:125;12111:89;;;;;;;;;;;;;:::i;24443:156::-;;;;;;;;;;-1:-1:-1;24443:156:0;;;;;:::i;:::-;;:::i;26329:568::-;;;;;;;;;;-1:-1:-1;26329:568:0;;;;;:::i;:::-;;:::i;25459:795::-;25830:20;;25536:4;;-1:-1:-1;;;25830:20:0;;;;:49;;;;-1:-1:-1;;;;;;;;;;25854:25:0;;;25830:49;25829:127;;;-1:-1:-1;;;;;;;;;;25931:25:0;;;25829:127;:203;;;-1:-1:-1;;;;;;;;;;26007:25:0;;;25829:203;:278;;;-1:-1:-1;;;;;;;;;;26082:25:0;;;25829:278;:368;;;-1:-1:-1;;;;;;;;;;26172:25:0;;;25829:368;25553:644;25459:795;-1:-1:-1;;25459:795:0:o;10537:77::-;10582:13;10606:5;10599:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10537:77;:::o;24031:180::-;24099:7;24123:16;;;:7;:16;;;;;;-1:-1:-1;;;;;24123:16:0;24119:44;;24155:8;;;24119:44;-1:-1:-1;24181:22:0;;;;:13;:22;;;;;;-1:-1:-1;;;;;24181:22:0;;24031:180::o;12210:997::-;12282:4;12452:3;;12442:6;:13;;:32;;;;;12469:5;;12459:6;:15;;12442:32;12439:449;;;12491:13;12507:15;;;:7;:15;;;;;;-1:-1:-1;;;;;12507:15:0;12597:10;:19;;;;;:59;;;12621:35;12638:5;12645:10;12621:16;:35::i;:::-;12620:36;12597:59;12593:101;;;12658:36;;-1:-1:-1;;;12658:36:0;;8602:2:1;12658:36:0;;;8584:21:1;8641:2;8621:18;;;8614:30;8680:28;8660:18;;;8653:56;8726:18;;12658:36:0;;;;;;;;12593:101;12709:21;;;;:13;:21;;;;;:31;;-1:-1:-1;;;;;;12709:31:0;-1:-1:-1;;;;;12709:31:0;;;;;12805:45;12827:5;12709:31;:21;12805;:45::i;:::-;12872:4;12865:11;;;;;12439:449;13088:10;13077:22;;;;:10;:22;;;;;;;;-1:-1:-1;;;;;13077:31:0;;;;;;;;;:40;;;13128:49;;13100:7;13111:6;13128:20;:49::i;:::-;-1:-1:-1;13195:4:0;12210:997;;;;:::o;10789:85::-;10841:4;10868:3;;10856:9;;:15;;;;:::i;:::-;10849:22;;10789:85;:::o;9920:45::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;9920:45:0;;:::o;21593:817::-;21679:4;21808:3;;21798:6;:13;;:32;;;;;21825:5;;21815:6;:15;;21798:32;21795:489;;;21987:10;-1:-1:-1;;;;;21987:18:0;;;;:55;;;22023:19;22035:6;22023:11;:19::i;:::-;-1:-1:-1;;;;;22009:33:0;:10;-1:-1:-1;;;;;22009:33:0;;21987:55;:93;;;;22046:34;22063:4;22069:10;22046:16;:34::i;:::-;21847:303;;;;-1:-1:-1;;;21847:303:0;;;;;;;:::i;:::-;22167:38;22180:4;22186:2;22197:6;22167:12;:38::i;:::-;22220:26;22232:4;22238:2;22242:3;;22220:11;:26::i;:::-;-1:-1:-1;22268:4:0;22261:11;;21795:489;22296:41;22312:4;22318:10;22330:6;22296:15;:41::i;:::-;22348:30;22361:4;22367:2;22371:6;22348:12;:30::i;:::-;-1:-1:-1;22396:4:0;21593:817;;;;;;:::o;25290:161::-;10115:3;;-1:-1:-1;;;;;10115:3:0;10101:10;:17;10093:47;;;;-1:-1:-1;;;10093:47:0;;;;;;;:::i;:::-;25373:3:::1;::::0;25365:51:::1;::::0;25348:12:::1;::::0;-1:-1:-1;;;;;25373:3:0::1;::::0;25390:21:::1;::::0;25348:12;25365:51;25348:12;25365:51;25390:21;25373:3;25365:51:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25347:69;;;25435:7;25427:16;;;::::0;::::1;;25336:115;25290:161::o:0;22433:654::-;22563:10;-1:-1:-1;;;;;22563:18:0;;;;:56;;;22599:20;22611:7;22599:11;:20::i;:::-;-1:-1:-1;;;;;22585:34:0;:10;-1:-1:-1;;;;;22585:34:0;;22563:56;:94;;;;22623:34;22640:4;22646:10;22623:16;:34::i;:::-;22537:186;;;;-1:-1:-1;;;22537:186:0;;;;;;;:::i;:::-;22734:39;22747:4;22753:2;22764:7;22734:12;:39::i;:::-;22785:26;22797:4;22803:2;22807:3;;22785:11;:26::i;:::-;-1:-1:-1;;;;;22842:14:0;;;:19;;;;:171;;-1:-1:-1;22878:72:0;;-1:-1:-1;;;22878:72:0;;;22920:10;22878:72;;;10280:34:1;-1:-1:-1;;;;;10350:15:1;;;10330:18;;;10323:43;10382:18;;;10375:34;;;10445:3;10425:18;;;10418:31;-1:-1:-1;10465:19:1;;;10458:30;22967:46:0;;22878:41;;;;22967:46;;10505:19:1;;22878:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;22878:135:0;;;22842:171;22824:256;;;23047:21;;-1:-1:-1;;;23047:21:0;;;;;;;;;;;22824:256;22433:654;;;:::o;11121:93::-;10115:3;;-1:-1:-1;;;;;10115:3:0;10101:10;:17;10093:47;;;;-1:-1:-1;;;10093:47:0;;;;;;;:::i;:::-;11192:7:::1;:20;11202:10:::0;11192:7;:20:::1;:::i;:::-;;11121:93:::0;:::o;26905:112::-;26988:21;;-1:-1:-1;;;26988:21:0;;13161:2:1;26988:21:0;;;13143::1;13200:2;13180:18;;;13173:30;-1:-1:-1;;;13219:18:1;;;13212:41;13270:18;;26988:21:0;12959:335:1;11790:101:0;10115:3;;-1:-1:-1;;;;;10115:3:0;10101:10;:17;10093:47;;;;-1:-1:-1;;;10093:47:0;;;;;;;:::i;:::-;11869:20:::1;::::0;;-1:-1:-1;;;;11845:44:0;::::1;-1:-1:-1::0;;;11869:20:0;;;::::1;;;11868:21;11845:44:::0;;::::1;;::::0;;11790:101::o;9103:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;11897:101::-;-1:-1:-1;;;;;11980:16:0;;;;;;:9;:16;;;;;;;;;11973:23;;;;;;;;;;;;;;;;;11956:15;;11973:23;;;11980:16;11973:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11973:23:0;-1:-1:-1;;;;;11973:23:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11897:101;;;:::o;11336:75::-;10115:3;;-1:-1:-1;;;;;10115:3:0;10101:10;:17;10093:47;;;;-1:-1:-1;;;10093:47:0;;;;;;;:::i;:::-;11397:3:::1;:12:::0;;-1:-1:-1;;;;;;11397:12:0::1;-1:-1:-1::0;;;;;11397:12:0;;;::::1;::::0;;;::::1;::::0;;11336:75::o;11220:110::-;10115:3;;-1:-1:-1;;;;;10115:3:0;10101:10;:17;10093:47;;;;-1:-1:-1;;;10093:47:0;;;;;;;:::i;:::-;11299:12:::1;:29;11314:14:::0;11299:12;:29:::1;:::i;10620:81::-:0;10667:13;10691:7;10684:14;;;;;:::i;24219:216::-;24325:10;24306:30;;;;:18;:30;;;;;;;;-1:-1:-1;;;;;24306:40:0;;;;;;;;;:51;;-1:-1:-1;;24306:51:0;;;;;;;24368:59;;24306:40;:51;24368:27;:59::i;21211:339::-;21279:4;21299:15;;;:7;:15;;;;;;21318:10;-1:-1:-1;;;;;21299:15:0;;;:29;21296:178;;21345:44;21358:10;21370:2;21381:6;21345:12;:44::i;:::-;21404:32;21416:10;21428:2;21432:3;;21404:11;:32::i;:::-;-1:-1:-1;21458:4:0;21451:11;;21296:178;21484:36;21497:10;21509:2;21513:6;21484:12;:36::i;23110:675::-;23259:10;-1:-1:-1;;;;;23259:18:0;;;;:56;;;23295:20;23307:7;23295:11;:20::i;:::-;-1:-1:-1;;;;;23281:34:0;:10;-1:-1:-1;;;;;23281:34:0;;23259:56;:94;;;;23319:34;23336:4;23342:10;23319:16;:34::i;:::-;23233:186;;;;-1:-1:-1;;;23233:186:0;;;;;;;:::i;:::-;23430:39;23443:4;23449:2;23460:7;23430:12;:39::i;:::-;23481:26;23493:4;23499:2;23503:3;;23481:11;:26::i;:::-;-1:-1:-1;;;;;23538:14:0;;;:19;;;;:173;;-1:-1:-1;23574:74:0;;-1:-1:-1;;;23574:74:0;;;23665:46;-1:-1:-1;;;;;23574:41:0;;;23665:46;;23574:74;;23616:10;;23628:4;;23634:7;;23643:4;;23574:74;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23574:137:0;;;23538:173;23520:258;;;23745:21;;-1:-1:-1;;;23745:21:0;;;;;;;;;;;23520:258;23110:675;;;;:::o;24607:282::-;24671:13;24716:5;;24705:7;:16;;24697:45;;;;-1:-1:-1;;;24697:45:0;;13995:2:1;24697:45:0;;;13977:21:1;14034:2;14014:18;;;14007:30;-1:-1:-1;;;14053:18:1;;;14046:46;14109:18;;24697:45:0;13793:340:1;24697:45:0;24763:7;24757:21;;;;;:::i;:::-;;;24782:1;24757:26;24753:44;;-1:-1:-1;;24786:9:0;;;;;;;;;-1:-1:-1;24786:9:0;;;24607:282::o;24753:44::-;24838:7;24847:23;24866:3;;24856:7;:13;;;;:::i;:::-;24847:8;:23::i;:::-;24821:59;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24807:74;;24607:282;;;:::o;12111:89::-;12163:13;12186:12;12179:19;;;;;:::i;24443:156::-;-1:-1:-1;;;;;24556:25:0;;;24532:4;24556:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24443:156::o;26329:568::-;26415:9;;:14;26407:46;;;;-1:-1:-1;;;26407:46:0;;15666:2:1;26407:46:0;;;15648:21:1;15705:2;15685:18;;;15678:30;-1:-1:-1;;;15724:18:1;;;15717:49;15783:18;;26407:46:0;15464:343:1;26407:46:0;26539:17;26528:70;;;;;;;;;;;;:::i;:::-;26515:9;26464:134;;;26465:5;;26472:7;26465:5;26481:9;26465:5;;;26501:12;26464:134;;26501:12;26464:134;:::i;:::-;-1:-1:-1;26464:134:0;;-1:-1:-1;26464:134:0;;;:::i;:::-;-1:-1:-1;;26464:134:0;;;-1:-1:-1;26464:134:0;;;;:::i;:::-;-1:-1:-1;26464:134:0;;-1:-1:-1;26464:134:0;;;:::i;:::-;;;;;;;;26631:9;;26625:2;:15;;;;:::i;:::-;26619:3;:21;;;26665:9;;26677:1;;26659:15;;26665:9;26659:15;:::i;:::-;:19;;;;:::i;:::-;26651:5;:27;26705:3;;26698:15;;26712:1;;26698:15;:::i;:::-;26689:6;:24;;-1:-1:-1;;26689:24:0;-1:-1:-1;;;;;26689:24:0;;;;;;;;;;26802:13;:11;:13::i;:::-;26788:10;26777:22;;;;:10;:22;;;;;:38;26842:9;;26836:3;;:15;26828:61;;;;-1:-1:-1;;;26828:61:0;;19247:2:1;26828:61:0;;;19229:21:1;19286:2;19266:18;;;19259:30;19325:34;19305:18;;;19298:62;-1:-1:-1;;;19376:18:1;;;19369:31;19417:19;;26828:61:0;19045:397:1;5158:126:0;5272:8;5262;-1:-1:-1;;;;;5245:36:0;5254:6;-1:-1:-1;;;;;5245:36:0;;;;;;;;;;;5158:126;;;:::o;4590:122::-;4692:8;-1:-1:-1;;;;;4675:34:0;4684:6;-1:-1:-1;;;;;4675:34:0;;4702:6;4675:34;;;;2515:25:1;;2503:2;2488:18;;2369:177;4675:34:0;;;;;;;;4590:122;;;:::o;20550:529::-;-1:-1:-1;;;;;20658:16:0;;;;;;:7;:16;;;;;;-1:-1:-1;;;;;20650:24:0;;;20658:16;;20650:24;20642:58;;;;-1:-1:-1;;;20642:58:0;;19649:2:1;20642:58:0;;;19631:21:1;19688:2;19668:18;;;19661:30;-1:-1:-1;;;19707:18:1;;;19700:51;19768:18;;20642:58:0;19447:345:1;20642:58:0;-1:-1:-1;;;;;20766:22:0;;;;;;:13;:22;;;;;;;;20759:29;;-1:-1:-1;;;;;;20759:29:0;;;;;;20837:7;:16;;;;;;:21;;;;;-1:-1:-1;;;;;20837:21:0;;;;;20912:35;20929:4;20837:21;20766:22;20912:16;:35::i;:::-;20998:40;21020:4;21026:2;21030:7;-1:-1:-1;;;;;20998:40:0;:21;:40::i;20087:361::-;-1:-1:-1;;;;;20170:16:0;;;;;;:10;:16;;;;;:26;;20190:6;;20170:16;:26;;20190:6;;20170:26;:::i;:::-;;;;-1:-1:-1;;;;;;;20279:14:0;;;;;;:10;:14;;;;;:24;;;;;;20370:38;20391:4;20290:2;20297:6;20370:20;:38::i;23793:230::-;-1:-1:-1;;;;;23899:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;:36;-1:-1:-1;23899:36:0;23891:77;;;;-1:-1:-1;;;23891:77:0;;19999:2:1;23891:77:0;;;19981:21:1;20038:2;20018:18;;;20011:30;20077;20057:18;;;20050:58;20125:18;;23891:77:0;19797:352:1;23891:77:0;-1:-1:-1;;;;;23979:17:0;;;;;;;:10;:17;;;;;;;;:26;;;;;;;;;;;:36;;24009:6;;23979:17;:36;;24009:6;;23979:36;:::i;:::-;;;;-1:-1:-1;;;;;23793:230:0:o;13215:3924::-;-1:-1:-1;;;;;13322:16:0;;;;;;:10;:16;;;;;;:26;-1:-1:-1;13322:26:0;13314:76;;;;-1:-1:-1;;;13314:76:0;;20356:2:1;13314:76:0;;;20338:21:1;20395:2;20375:18;;;20368:30;20434:34;20414:18;;;20407:62;-1:-1:-1;;;20485:18:1;;;20478:35;20530:19;;13314:76:0;20154:401:1;13314:76:0;13553:3;;-1:-1:-1;;;;;13534:16:0;;13508:23;13534:16;;;:10;:16;;;;;;13508:23;;13534:22;;;:::i;:::-;13608:3;;-1:-1:-1;;;;;13591:14:0;;13567:21;13591:14;;;:10;:14;;;;;;13508:48;;-1:-1:-1;13567:21:0;13591:20;;13608:3;13591:20;:::i;:::-;13567:44;;13676:29;13688:4;13694:2;13698:6;13676:11;:29::i;:::-;13853:3;;-1:-1:-1;;;;;13834:16:0;;13807:24;13834:16;;;:10;:16;;;;;;13807:24;;13834:22;;;:::i;:::-;13909:3;;-1:-1:-1;;;;;13892:14:0;;13867:22;13892:14;;;:10;:14;;;;;;13807:49;;-1:-1:-1;13867:22:0;13892:20;;13909:3;13892:20;:::i;:::-;-1:-1:-1;;;;;14049:15:0;;14015:31;14049:15;;;:9;:15;;;;;13867:45;;-1:-1:-1;14194:6:0;14323:34;;;14319:473;;;14379:21;;:25;14376:405;;14463:14;14480;14495:1;14480:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;14562:28;;;;;;;;;;;;;;;;;;;;;14480:17;;;;;;;;;;;;;;;-1:-1:-1;;;;;14480:17:0;;;14562:28;;;;;;;;;;;;;;;;;;;;;;;14480:17;-1:-1:-1;14663:39:0;;14676:4;;14480:17;14663:12;:39::i;:::-;14406:375;14376:405;14938:14;14922:13;:30;14918:367;;;14974:21;;:25;14971:289;;15056:71;15077:1;15081:2;15085:14;15124:1;15100:14;:21;;;;:25;;;;:::i;:::-;15085:41;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15085:41:0;15056:12;:71::i;:::-;15146:14;:20;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;15146:20:0;;;;;;;;;-1:-1:-1;;;;;15146:20:0;;;;;;;;;;;;;;14971:289;;;15235:9;15241:2;15235:5;:9::i;:::-;;14971:289;15382:19;15413:3;;15404:6;:12;;;;:::i;:::-;15440:21;;15863:3;;15382:34;;-1:-1:-1;15440:21:0;-1:-1:-1;;;;;15863:3:0;;;15855:11;;;;15852:188;;16002:3;15985:14;:20;:43;;16025:3;15985:43;;;16008:14;15985:43;15968:60;;15852:188;16055:18;;16052:1080;;16115:3;16098:14;:20;:43;;16138:3;16098:43;;;16121:14;16098:43;16092:49;;16384:6;16379:108;16400:3;16396:1;:7;16379:108;;;16429:41;16442:4;16448:2;16452:14;16467:1;16452:17;;;;;;;;:::i;16429:41::-;16405:3;;16379:108;;;-1:-1:-1;16501:21:0;16519:3;16501:21;;:::i;:::-;16543;;16501;;-1:-1:-1;16543:21:0;-1:-1:-1;16585:20:0;;;:43;;16625:3;16585:43;;;16608:14;16585:43;16579:49;;16887:6;16882:184;16903:3;16899:1;:7;16882:184;;;16940:71;16961:1;16965:2;16969:14;17008:1;16984:14;:21;;;;:25;;;;:::i;16940:71::-;17030:14;:20;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;17030:20:0;;;;;;;;;-1:-1:-1;;;;;17030:20:0;;;;;;;;;;;;;;;16908:3;16882:184;;;-1:-1:-1;17082:36:0;17093:2;17097:20;17114:3;17097:14;:20;:::i;:::-;17082:10;:36::i;:::-;13293:3846;;;;;;;;13215:3924;;;:::o;5290:142::-;5408:9;-1:-1:-1;;;;;5385:44:0;5400:6;-1:-1:-1;;;;;5385:44:0;;5419:9;5385:44;;;;565:14:1;558:22;540:41;;528:2;513:18;;400:187;24897:385:0;24953:13;24983:5;24992:1;24983:10;24979:29;;-1:-1:-1;;24996:10:0;;;;;;;;;;;;-1:-1:-1;;;24996:10:0;;;;;24897:385::o;24979:29::-;25024:5;25009:12;25056:41;25063:9;;25056:41;;25075:8;;;;:::i;:::-;;-1:-1:-1;25085:10:0;;-1:-1:-1;25093:2:0;25085:10;;:::i;:::-;;;25056:41;;;25098:19;25130:6;-1:-1:-1;;;;;25120:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25120:17:0;;25098:39;;25148:95;25155:10;;25148:95;;25168:11;25178:1;25168:11;;:::i;:::-;;-1:-1:-1;25211:10:0;25219:2;25211:5;:10;:::i;:::-;25205:22;;25225:2;25205:22;:::i;:::-;25198:30;;25181:6;25188;25181:14;;;;;;;;:::i;:::-;;;;:47;-1:-1:-1;;;;;25181:47:0;;;;;;;;-1:-1:-1;25230:11:0;25239:2;25230:11;;:::i;:::-;;;25148:95;;;25267:6;24897:385;-1:-1:-1;;;;24897:385:0:o;18986:1045::-;-1:-1:-1;;;;;19091:18:0;;19075:13;19091:18;;;:9;:18;;;;;;;;;-1:-1:-1;;;;;19202:15:0;;;;:9;:15;;;;;19291;;19091:18;;19202:15;;19291;19202;19389:7;19395:1;19291:15;19389:7;:::i;:::-;19380:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19380:17:0;19359:38;;19501:11;19483:8;19492:5;19483:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;;-1:-1:-1;;;;;19483:29:0;;;;;-1:-1:-1;;;;;19483:29:0;;;;;;19589:8;:14;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;19589:14:0;;;;;;;;;-1:-1:-1;;;;;19589:14:0;;;;;;;;;;;;;;19710:7;19589:14;19710:3;:7;:::i;:::-;:12;19707:115;;-1:-1:-1;;;;;19739:22:0;;;;;;:9;:22;;;;;:30;;;19707:115;-1:-1:-1;;;;;19839:13:0;;;;;;:9;:13;;;;;;;:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;19839:27:0;;;;;;;;;;;;;;;;;19945:13;;;;:20;;:24;;19839:27;19945:24;:::i;:::-;-1:-1:-1;;;;;19924:18:0;;;;;;;:9;:18;;;;;:45;;;;-1:-1:-1;;;;;;18986:1045:0:o;5038:114::-;5140:8;5135:3;-1:-1:-1;;;;;5119:30:0;5128:5;-1:-1:-1;;;;;5119:30:0;;;;;;;;;;;5038:114;;;:::o;4472:112::-;4568:3;-1:-1:-1;;;;;4552:29:0;4561:5;-1:-1:-1;;;;;4552:29:0;;4573:7;4552:29;;;;2515:25:1;;2503:2;2488:18;;2369:177;18252:630:0;18355:6;:8;;-1:-1:-1;;18355:8:0;;;-1:-1:-1;;;;;18355:8:0;;;;;;;;;;;;-1:-1:-1;18497:16:0;;;:7;:16;;;;;;;;:21;;-1:-1:-1;;;;;;18497:21:0;-1:-1:-1;;;;;18497:21:0;;;;;;;;18592:13;;:9;:13;;;;;;:20;;18571:18;;;:9;:18;;;;;:41;;;18680:13;;;:27;;;;;;;;;;;;;;;;;;;;;;;18355:8;18680:27;;;;;;;;;;;;;;;;;;18788:46;;18497:21;18355:8;18788:21;:46::i;:::-;18252:630;;;:::o;17147:1095::-;17226:6;17236:1;17226:11;17223:23;;17147:1095;;:::o;17223:23::-;17288:6;17298:1;17288:11;17285:105;;17348:9;17354:2;17348:5;:9::i;17285:105::-;17412:6;;-1:-1:-1;;;;;17483:13:0;;17400:9;17483:13;;;:9;:13;;;;;:20;-1:-1:-1;;;;;17412:6:0;;;;17483:20;17554:581;17574:6;17570:1;:10;17554:581;;;17627:4;;;;-1:-1:-1;;;;;17694:11:0;;;;;;;:7;:11;;;;;;;;:16;;-1:-1:-1;;;;;;17694:16:0;-1:-1:-1;;;;;17694:16:0;;;;;;;;17753:9;:13;;;;;:24;;;17836:13;;:9;:13;;;;:22;;;;;;;;;;;;;;;;;;;;;;;17694:16;17836:22;;;;;;;;;;;;;;;;;;17627:4;;17909:41;;17694:11;:16;;17909:21;:41::i;:::-;18023:10;;;;;18085:3;17554:581;;;-1:-1:-1;;18170:6:0;:24;;-1:-1:-1;;18170:24:0;;-1:-1:-1;;;;;18170:24:0;;;;;;;;;;;;;;;-1:-1:-1;;17147:1095:0:o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;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:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1919:254;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:186::-;2237:6;2290:2;2278:9;2269:7;2265:23;2261:32;2258:52;;;2306:1;2303;2296:12;2258:52;2329:29;2348:9;2329:29;:::i;2551:127::-;2612:10;2607:3;2603:20;2600:1;2593:31;2643:4;2640:1;2633:15;2667:4;2664:1;2657:15;2683:275;2754:2;2748:9;2819:2;2800:13;;-1:-1:-1;;2796:27:1;2784:40;;-1:-1:-1;;;;;2839:34:1;;2875:22;;;2836:62;2833:88;;;2901:18;;:::i;:::-;2937:2;2930:22;2683:275;;-1:-1:-1;2683:275:1:o;2963:186::-;3011:4;-1:-1:-1;;;;;3036:6:1;3033:30;3030:56;;;3066:18;;:::i;:::-;-1:-1:-1;3132:2:1;3111:15;-1:-1:-1;;3107:29:1;3138:4;3103:40;;2963:186::o;3154:336::-;3218:5;3247:52;3263:35;3291:6;3263:35;:::i;:::-;3247:52;:::i;:::-;3238:61;;3322:6;3315:5;3308:21;3362:3;3353:6;3348:3;3344:16;3341:25;3338:45;;;3379:1;3376;3369:12;3338:45;3428:6;3423:3;3416:4;3409:5;3405:16;3392:43;3482:1;3475:4;3466:6;3459:5;3455:18;3451:29;3444:40;3154:336;;;;;:::o;3495:220::-;3537:5;3590:3;3583:4;3575:6;3571:17;3567:27;3557:55;;3608:1;3605;3598:12;3557:55;3630:79;3705:3;3696:6;3683:20;3676:4;3668:6;3664:17;3630:79;:::i;3720:537::-;3815:6;3823;3831;3839;3892:3;3880:9;3871:7;3867:23;3863:33;3860:53;;;3909:1;3906;3899:12;3860:53;3932:29;3951:9;3932:29;:::i;:::-;3922:39;;3980:38;4014:2;4003:9;3999:18;3980:38;:::i;:::-;3970:48;;4065:2;4054:9;4050:18;4037:32;4027:42;;4120:2;4109:9;4105:18;4092:32;-1:-1:-1;;;;;4139:6:1;4136:30;4133:50;;;4179:1;4176;4169:12;4133:50;4202:49;4243:7;4234:6;4223:9;4219:22;4202:49;:::i;:::-;4192:59;;;3720:537;;;;;;;:::o;4674:328::-;4751:6;4759;4767;4820:2;4808:9;4799:7;4795:23;4791:32;4788:52;;;4836:1;4833;4826:12;4788:52;4859:29;4878:9;4859:29;:::i;:::-;4849:39;;4907:38;4941:2;4930:9;4926:18;4907:38;:::i;:::-;4897:48;;4992:2;4981:9;4977:18;4964:32;4954:42;;4674:328;;;;;:::o;5007:450::-;5076:6;5129:2;5117:9;5108:7;5104:23;5100:32;5097:52;;;5145:1;5142;5135:12;5097:52;5185:9;5172:23;-1:-1:-1;;;;;5210:6:1;5207:30;5204:50;;;5250:1;5247;5240:12;5204:50;5273:22;;5326:4;5318:13;;5314:27;-1:-1:-1;5304:55:1;;5355:1;5352;5345:12;5304:55;5378:73;5443:7;5438:2;5425:16;5420:2;5416;5412:11;5378:73;:::i;5462:946::-;5546:6;5577:2;5620;5608:9;5599:7;5595:23;5591:32;5588:52;;;5636:1;5633;5626:12;5588:52;5676:9;5663:23;-1:-1:-1;;;;;5746:2:1;5738:6;5735:14;5732:34;;;5762:1;5759;5752:12;5732:34;5800:6;5789:9;5785:22;5775:32;;5845:7;5838:4;5834:2;5830:13;5826:27;5816:55;;5867:1;5864;5857:12;5816:55;5903:2;5890:16;5925:2;5921;5918:10;5915:36;;;5931:18;;:::i;:::-;5977:2;5974:1;5970:10;5960:20;;6000:28;6024:2;6020;6016:11;6000:28;:::i;:::-;6062:15;;;6132:11;;;6128:20;;;6093:12;;;;6160:19;;;6157:39;;;6192:1;6189;6182:12;6157:39;6216:11;;;;6236:142;6252:6;6247:3;6244:15;6236:142;;;6318:17;;6306:30;;6269:12;;;;6356;;;;6236:142;;;6397:5;5462:946;-1:-1:-1;;;;;;;;5462:946:1:o;6413:655::-;6582:2;6634:21;;;6704:13;;6607:18;;;6726:22;;;6553:4;;6582:2;6805:15;;;;6779:2;6764:18;;;6553:4;6848:194;6862:6;6859:1;6856:13;6848:194;;;6927:13;;-1:-1:-1;;;;;6923:38:1;6911:51;;7017:15;;;;6982:12;;;;6884:1;6877:9;6848:194;;;-1:-1:-1;7059:3:1;;6413:655;-1:-1:-1;;;;;;6413:655:1:o;7073:347::-;7138:6;7146;7199:2;7187:9;7178:7;7174:23;7170:32;7167:52;;;7215:1;7212;7205:12;7167:52;7238:29;7257:9;7238:29;:::i;:::-;7228:39;;7317:2;7306:9;7302:18;7289:32;7364:5;7357:13;7350:21;7343:5;7340:32;7330:60;;7386:1;7383;7376:12;7330:60;7409:5;7399:15;;;7073:347;;;;;:::o;7425:260::-;7493:6;7501;7554:2;7542:9;7533:7;7529:23;7525:32;7522:52;;;7570:1;7567;7560:12;7522:52;7593:29;7612:9;7593:29;:::i;:::-;7583:39;;7641:38;7675:2;7664:9;7660:18;7641:38;:::i;:::-;7631:48;;7425:260;;;;;:::o;7690:320::-;7758:6;7811:2;7799:9;7790:7;7786:23;7782:32;7779:52;;;7827:1;7824;7817:12;7779:52;7867:9;7854:23;-1:-1:-1;;;;;7892:6:1;7889:30;7886:50;;;7932:1;7929;7922:12;7886:50;7955:49;7996:7;7987:6;7976:9;7972:22;7955:49;:::i;8015:380::-;8094:1;8090:12;;;;8137;;;8158:61;;8212:4;8204:6;8200:17;8190:27;;8158:61;8265:2;8257:6;8254:14;8234:18;8231:38;8228:161;;8311:10;8306:3;8302:20;8299:1;8292:31;8346:4;8343:1;8336:15;8374:4;8371:1;8364:15;8228:161;;8015:380;;;:::o;8755:127::-;8816:10;8811:3;8807:20;8804:1;8797:31;8847:4;8844:1;8837:15;8871:4;8868:1;8861:15;8887:168;8960:9;;;8991;;9008:15;;;9002:22;;8988:37;8978:71;;9029:18;;:::i;9060:354::-;9262:2;9244:21;;;9301:2;9281:18;;;9274:30;9340:32;9335:2;9320:18;;9313:60;9405:2;9390:18;;9060:354::o;9419:341::-;9621:2;9603:21;;;9660:2;9640:18;;;9633:30;-1:-1:-1;;;9694:2:1;9679:18;;9672:47;9751:2;9736:18;;9419:341::o;10535:249::-;10604:6;10657:2;10645:9;10636:7;10632:23;10628:32;10625:52;;;10673:1;10670;10663:12;10625:52;10705:9;10699:16;10724:30;10748:5;10724:30;:::i;10915:518::-;11017:2;11012:3;11009:11;11006:421;;;11053:5;11050:1;11043:16;11097:4;11094:1;11084:18;11167:2;11155:10;11151:19;11148:1;11144:27;11138:4;11134:38;11203:4;11191:10;11188:20;11185:47;;;-1:-1:-1;11226:4:1;11185:47;11281:2;11276:3;11272:12;11269:1;11265:20;11259:4;11255:31;11245:41;;11336:81;11354:2;11347:5;11344:13;11336:81;;;11413:1;11399:16;;11380:1;11369:13;11336:81;;;11340:3;;10915:518;;;:::o;11609:1345::-;11735:3;11729:10;-1:-1:-1;;;;;11754:6:1;11751:30;11748:56;;;11784:18;;:::i;:::-;11813:97;11903:6;11863:38;11895:4;11889:11;11863:38;:::i;:::-;11857:4;11813:97;:::i;:::-;11965:4;;12022:2;12011:14;;12039:1;12034:663;;;;12741:1;12758:6;12755:89;;;-1:-1:-1;12810:19:1;;;12804:26;12755:89;-1:-1:-1;;11566:1:1;11562:11;;;11558:24;11554:29;11544:40;11590:1;11586:11;;;11541:57;12857:81;;12004:944;;12034:663;10862:1;10855:14;;;10899:4;10886:18;;-1:-1:-1;;12070:20:1;;;12188:236;12202:7;12199:1;12196:14;12188:236;;;12291:19;;;12285:26;12270:42;;12383:27;;;;12351:1;12339:14;;;;12218:19;;12188:236;;;12192:3;12452:6;12443:7;12440:19;12437:201;;;12513:19;;;12507:26;-1:-1:-1;;12596:1:1;12592:14;;;12608:3;12588:24;12584:37;12580:42;12565:58;12550:74;;12437:201;;;12684:1;12675:6;12672:1;12668:14;12664:22;12658:4;12651:36;12004:944;;;;;11609:1345;;:::o;13299:489::-;-1:-1:-1;;;;;13568:15:1;;;13550:34;;13620:15;;13615:2;13600:18;;13593:43;13667:2;13652:18;;13645:34;;;13715:3;13710:2;13695:18;;13688:31;;;13493:4;;13736:46;;13762:19;;13754:6;13736:46;:::i;:::-;13728:54;13299:489;-1:-1:-1;;;;;;13299:489:1:o;14138:128::-;14205:9;;;14226:11;;;14223:37;;;14240:18;;:::i;14271:1188::-;14548:3;14577:1;14610:6;14604:13;14640:36;14666:9;14640:36;:::i;:::-;14695:1;14712:17;;;14738:133;;;;14885:1;14880:358;;;;14705:533;;14738:133;-1:-1:-1;;14771:24:1;;14759:37;;14844:14;;14837:22;14825:35;;14816:45;;;-1:-1:-1;14738:133:1;;14880:358;14911:6;14908:1;14901:17;14941:4;14986;14983:1;14973:18;15013:1;15027:165;15041:6;15038:1;15035:13;15027:165;;;15119:14;;15106:11;;;15099:35;15162:16;;;;15056:10;;15027:165;;;15031:3;;;15221:6;15216:3;15212:16;15205:23;;14705:533;;;;;15269:6;15263:13;15285:68;15344:8;15339:3;15332:4;15324:6;15320:17;15285:68;:::i;:::-;-1:-1:-1;;;15375:18:1;;15402:22;;;15451:1;15440:13;;14271:1188;-1:-1:-1;;;;14271:1188:1:o;15812:442::-;15866:5;15919:3;15912:4;15904:6;15900:17;15896:27;15886:55;;15937:1;15934;15927:12;15886:55;15966:6;15960:13;15997:48;16013:31;16041:2;16013:31;:::i;15997:48::-;16070:2;16061:7;16054:19;16116:3;16109:4;16104:2;16096:6;16092:15;16088:26;16085:35;16082:55;;;16133:1;16130;16123:12;16082:55;16146:77;16220:2;16213:4;16204:7;16200:18;16193:4;16185:6;16181:17;16146:77;:::i;16259:1095::-;16414:6;16422;16430;16438;16446;16454;16507:3;16495:9;16486:7;16482:23;16478:33;16475:53;;;16524:1;16521;16514:12;16475:53;16557:9;16551:16;-1:-1:-1;;;;;16627:2:1;16619:6;16616:14;16613:34;;;16643:1;16640;16633:12;16613:34;16666:61;16719:7;16710:6;16699:9;16695:22;16666:61;:::i;:::-;16656:71;;16773:2;16762:9;16758:18;16752:25;16736:41;;16802:2;16792:8;16789:16;16786:36;;;16818:1;16815;16808:12;16786:36;16841:63;16896:7;16885:8;16874:9;16870:24;16841:63;:::i;:::-;16831:73;;16944:2;16933:9;16929:18;16923:25;16913:35;;16994:2;16983:9;16979:18;16973:25;16957:41;;17023:2;17013:8;17010:16;17007:36;;;17039:1;17036;17029:12;17007:36;17062:63;17117:7;17106:8;17095:9;17091:24;17062:63;:::i;:::-;17052:73;;17171:3;17160:9;17156:19;17150:26;17134:42;;17201:2;17191:8;17188:16;17185:36;;;17217:1;17214;17207:12;17185:36;;17240:63;17295:7;17284:8;17273:9;17269:24;17240:63;:::i;:::-;17230:73;;;17343:3;17332:9;17328:19;17322:26;17312:36;;16259:1095;;;;;;;;:::o;17359:416::-;17448:1;17485:5;17448:1;17499:270;17520:7;17510:8;17507:21;17499:270;;;17579:4;17575:1;17571:6;17567:17;17561:4;17558:27;17555:53;;;17588:18;;:::i;:::-;17638:7;17628:8;17624:22;17621:55;;;17658:16;;;;17621:55;17737:22;;;;17697:15;;;;17499:270;;;17503:3;17359:416;;;;;:::o;17780:806::-;17829:5;17859:8;17849:80;;-1:-1:-1;17900:1:1;17914:5;;17849:80;17948:4;17938:76;;-1:-1:-1;17985:1:1;17999:5;;17938:76;18030:4;18048:1;18043:59;;;;18116:1;18111:130;;18023:218;18111:130;18148:3;18138:8;18135:17;18132:43;;;18155:18;;:::i;:::-;-1:-1:-1;;18211:1:1;18197:16;;18226:5;;18023:218;;18325:2;18315:8;18312:16;18306:3;18300:4;18297:13;18293:36;18287:2;18277:8;18274:16;18269:2;18263:4;18260:12;18256:35;18253:77;18250:159;;;-1:-1:-1;18362:19:1;;;18394:5;;18250:159;18441:34;18466:8;18460:4;18441:34;:::i;:::-;18511:6;18507:1;18503:6;18499:19;18490:7;18487:32;18484:58;;;18522:18;;:::i;:::-;18560:20;;17780:806;-1:-1:-1;;;17780:806:1:o;18591:131::-;18651:5;18680:36;18707:8;18701:4;18680:36;:::i;18727:125::-;18792:9;;;18813:10;;;18810:36;;;18826:18;;:::i;18857:183::-;-1:-1:-1;;;;;18976:10:1;;;18964;;;18960:27;;18999:12;;;18996:38;;;19014:18;;:::i;:::-;18996:38;18857:183;;;;:::o;20560:127::-;20621:10;20616:3;20612:20;20609:1;20602:31;20652:4;20649:1;20642:15;20676:4;20673:1;20666:15;20692:112;20724:1;20750;20740:35;;20755:18;;:::i;:::-;-1:-1:-1;20789:9:1;;20692:112::o;20809:127::-;20870:10;20865:3;20861:20;20858:1;20851:31;20901:4;20898:1;20891:15;20925:4;20922:1;20915:15;20941:127;21002:10;20997:3;20993:20;20990:1;20983:31;21033:4;21030:1;21023:15;21057:4;21054:1;21047:15;21073:120;21113:1;21139;21129:35;;21144:18;;:::i;:::-;-1:-1:-1;21178:9:1;;21073:120::o;21198:135::-;21237:3;21258:17;;;21255:43;;21278:18;;:::i;:::-;-1:-1:-1;21325:1:1;21314:13;;21198:135::o;21338:148::-;21426:4;21405:12;;;21419;;;21401:31;;21444:13;;21441:39;;;21460:18;;:::i

Swarm Source

ipfs://d10c8c7986b55e3c6498a13e8b98294df6d0b9e7cc2765303d9252ceeaf6e40c
Loading...
Loading
Loading...
Loading
[ 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.