ETH Price: $3,393.97 (+1.28%)
Gas: 5.98 Gwei

Token

Blvck Paris (BP)
 

Overview

Max Total Supply

9,425 BP

Holders

7,193

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
0 BP
0x89629098f8Aa338Ef793026aB05e2402110c9aeF
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:
BlvckParis

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

// SPDX-License-Identifier: MIT

/**
 /$$$$$$$  /$$                     /$$            /$$$$$$$                     /$$          
| $$__  $$| $$                    | $$           | $$__  $$                   |__/          
| $$  \ $$| $$ /$$    /$$ /$$$$$$$| $$   /$$     | $$  \ $$ /$$$$$$   /$$$$$$  /$$  /$$$$$$$
| $$$$$$$ | $$|  $$  /$$//$$_____/| $$  /$$/     | $$$$$$$/|____  $$ /$$__  $$| $$ /$$_____/
| $$__  $$| $$ \  $$/$$/| $$      | $$$$$$/      | $$____/  /$$$$$$$| $$  \__/| $$|  $$$$$$ 
| $$  \ $$| $$  \  $$$/ | $$      | $$_  $$      | $$      /$$__  $$| $$      | $$ \____  $$
| $$$$$$$/| $$   \  $/  |  $$$$$$$| $$ \  $$     | $$     |  $$$$$$$| $$      | $$ /$$$$$$$/
|_______/ |__/    \_/    \_______/|__/  \__/     |__/      \_______/|__/      |__/|_______/ 

 ___   _______  __   _______    _______    ___      ___   _______  _______  _______  _______  __   __  ___      _______       
|   | |       ||  | |       |  |   _   |  |   |    |   | |       ||       ||       ||       ||  | |  ||   |    |       |      
|   | |_     _||__| |  _____|  |  |_|  |  |   |    |   | |    ___||    ___||  _____||_     _||  |_|  ||   |    |    ___|      
|   |   |   |       | |_____   |       |  |   |    |   | |   |___ |   |___ | |_____   |   |  |       ||   |    |   |___       
|   |   |   |       |_____  |  |       |  |   |___ |   | |    ___||    ___||_____  |  |   |  |_     _||   |___ |    ___| ___  
|   |   |   |        _____| |  |   _   |  |       ||   | |   |    |   |___  _____| |  |   |    |   |  |       ||   |___ |   | 
|___|   |___|       |_______|  |__| |__|  |_______||___| |___|    |_______||_______|  |___|    |___|  |_______||_______||___| 


*/
pragma solidity ^0.8.9;

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

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

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

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

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

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

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

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

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

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

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



/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}



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

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

    function isContractOwner() public virtual returns (bool) {
        return (_owner == _msgSender());
    }

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

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




abstract contract Target721 { 
    function ownerOf(uint256 tokenId) public view virtual returns (address);
}




/**
 * @title Gutter Punks Flyer contract.
 * @author The Gutter Punks team.
 *
 * @notice Airdrops a flyer to Invisible Friends holders.
 *
 */
contract BlvckParis is Context, ERC165, IERC721, IERC721Metadata, Ownable {
    
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

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

    mapping(uint256 => bool) private _tokenBifurcated;

    string internal _baseTokenURI;
    string internal _contractURI;

    uint256 internal _totalSupply;
    uint256 internal MAX_TOKEN_ID; 
	
	bool internal burnAirdrop = false;

    Target721 _target = Target721(0x49cF6f5d44E70224e2E23fDcdd2C053F30aDA28B);


    constructor() {
        _name = "Blvck Paris";
        _symbol = "BP";
    }

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

    function setTargetContract(address contractAddress) external onlyOwner { 
        _target = Target721(contractAddress);
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        uint256 balance = 0;
        for(uint256 i = 0;i <= MAX_TOKEN_ID;i++) {
           if(_ownerOf(i) == owner) { balance++; }
        }
        return balance;
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        address owner = _owners[tokenId];
        if(owner == address(0) && !_tokenBifurcated[tokenId] && !burnAirdrop) {
           try _target.ownerOf(tokenId) returns (address result) { owner = result; } catch { owner = address(0); }
        }
        return owner;
    }

    function name() public view virtual override returns (string memory) {
        return _name;
    }

    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");
        address approved = _tokenApprovals[tokenId];
        return approved;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

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

    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0) || _target.ownerOf(tokenId) != address(0);
    }

    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    function _mint(address to, uint256 tokenId) internal virtual {
        emit Transfer(address(0), to, tokenId);
    }

    function _burn(uint256 tokenId) internal virtual {
        address owner = ownerOf(tokenId);
        require(owner == _msgSender(), "Must own token to burn.");

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

        // Clear approvals
        _approve(address(0), tokenId);
        unchecked { 
           if(!_tokenBifurcated[tokenId]) { _tokenBifurcated[tokenId] = true; }
           _totalSupply -= 1;
        }
        delete _owners[tokenId];

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

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

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);
       
        unchecked { 
           _owners[tokenId] = to;
        }

        emit Transfer(from, to, tokenId);
    }

    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ownerOf(tokenId), to, tokenId);
    }

    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}


    function setURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setBurnAirdrop(bool setBurn) external onlyOwner {
        burnAirdrop = setBurn;
    }

    function giftAirdrop(address[] calldata recipients) external onlyOwner {
        uint256 startingSupply = _totalSupply;

        // Update the total supply.
        _totalSupply = startingSupply + recipients.length;

        // Note: First token has ID #0.
        for (uint256 i = 0; i < recipients.length; i++) {
            _mint(recipients[i], startingSupply + i);
        }
        if((startingSupply + recipients.length - 1) > MAX_TOKEN_ID) { MAX_TOKEN_ID = (startingSupply + recipients.length - 1); } 
    }

    function bifurcateToken(uint256 tokenId) external { 
        address owner = ownerOf(tokenId);
        require(owner == _msgSender() || isContractOwner(), "Must own token to bifurcate.");
        _tokenBifurcated[tokenId] = true; 
        unchecked { 
           _owners[tokenId] = owner;
        }
    }
    function burn(uint256 tokenId) external { 
        _burn(tokenId);
    }
	
    function emitTransfers(uint256[] calldata tokenId, address[] calldata from, address[] calldata to) external onlyOwner { 
       require(tokenId.length == from.length && from.length == to.length, "Arrays do not match.");
       for(uint256 i = 0;i < tokenId.length;i++) { 
           if(_owners[tokenId[i]] == address(0)) { 
              emit Transfer(from[i], to[i], tokenId[i]);
           } 
       }
    }

    function contractURI() external view returns (string memory) {
        return _contractURI;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        
        return _baseTokenURI;
    }

    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }
}


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

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

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

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

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


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

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"bifurcateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenId","type":"uint256[]"},{"internalType":"address[]","name":"from","type":"address[]"},{"internalType":"address[]","name":"to","type":"address[]"}],"name":"emitTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"}],"name":"giftAirdrop","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":"isContractOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"setBurn","type":"bool"}],"name":"setBurnAirdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setTargetContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff0219169083151502179055507349cf6f5d44e70224e2e23fdcdd2c053f30ada28b600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200008157600080fd5b50620000a2620000966200014460201b60201c565b6200014c60201b60201c565b6040518060400160405280600b81526020017f426c76636b20506172697300000000000000000000000000000000000000000081525060019080519060200190620000ef92919062000210565b506040518060400160405280600281526020017f4250000000000000000000000000000000000000000000000000000000000000815250600290805190602001906200013d92919062000210565b5062000324565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021e90620002ef565b90600052602060002090601f0160209004810192826200024257600085556200028e565b82601f106200025d57805160ff19168380011785556200028e565b828001600101855582156200028e579182015b828111156200028d57825182559160200191906001019062000270565b5b5090506200029d9190620002a1565b5090565b5b80821115620002bc576000816000905550600101620002a2565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200030857607f821691505b6020821081036200031e576200031d620002c0565b5b50919050565b6136c580620003346000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063b88d4fde11610097578063e8a3d48511610071578063e8a3d48514610457578063e985e9c514610475578063f0d6f8ef146104a5578063f2fde38b146104c15761018e565b8063b88d4fde146103ef578063c87b56dd1461040b578063df1e2f281461043b5761018e565b806370a082311461033f578063715018a61461036f5780637f7dcdbf146103795780638da5cb5b1461039757806395d89b41146103b5578063a22cb465146103d35761018e565b806318160ddd1161014b57806342966c681161012557806342966c68146102bb57806342d8c7d5146102d757806347fc822f146102f35780636352211e1461030f5761018e565b806318160ddd1461026557806323b872dd1461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806302fe5305146101c357806306fdde03146101df578063081812fc146101fd578063095ea7b31461022d57806317495dde14610249575b600080fd5b6101ad60048036038101906101a89190612308565b6104dd565b6040516101ba9190612350565b60405180910390f35b6101dd60048036038101906101d891906123d0565b6105bf565b005b6101e7610651565b6040516101f491906124b6565b60405180910390f35b6102176004803603810190610212919061250e565b6106e3565b604051610224919061257c565b60405180910390f35b610247600480360381019061024291906125c3565b61076e565b005b610263600480360381019061025e919061262f565b610885565b005b61026d61091e565b60405161027a919061266b565b60405180910390f35b61029d60048036038101906102989190612686565b610928565b005b6102b960048036038101906102b49190612686565b610988565b005b6102d560048036038101906102d0919061250e565b6109a8565b005b6102f160048036038101906102ec9190612785565b6109b4565b005b61030d60048036038101906103089190612839565b610bf6565b005b6103296004803603810190610324919061250e565b610cb6565b604051610336919061257c565b60405180910390f35b61035960048036038101906103549190612839565b610d3c565b604051610366919061266b565b60405180910390f35b610377610e20565b005b610381610ea8565b60405161038e9190612350565b60405180910390f35b61039f610f05565b6040516103ac919061257c565b60405180910390f35b6103bd610f2e565b6040516103ca91906124b6565b60405180910390f35b6103ed60048036038101906103e89190612866565b610fc0565b005b610409600480360381019061040491906129d6565b610fd6565b005b6104256004803603810190610420919061250e565b611038565b60405161043291906124b6565b60405180910390f35b61045560048036038101906104509190612a59565b611114565b005b61045f611255565b60405161046c91906124b6565b60405180910390f35b61048f600480360381019061048a9190612aa6565b6112e7565b60405161049c9190612350565b60405180910390f35b6104bf60048036038101906104ba919061250e565b61137b565b005b6104db60048036038101906104d69190612839565b61148e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b857506105b782611585565b5b9050919050565b6105c76115ef565b73ffffffffffffffffffffffffffffffffffffffff166105e5610f05565b73ffffffffffffffffffffffffffffffffffffffff161461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290612b32565b60405180910390fd5b81816007919061064c9291906121f9565b505050565b60606001805461066090612b81565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612b81565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b5050505050905090565b60006106ee826115f7565b61072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072490612c24565b60405180910390fd5b60006004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080915050919050565b600061077982610cb6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e090612cb6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108086115ef565b73ffffffffffffffffffffffffffffffffffffffff1614806108375750610836816108316115ef565b6112e7565b5b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90612d48565b60405180910390fd5b6108808383611736565b505050565b61088d6115ef565b73ffffffffffffffffffffffffffffffffffffffff166108ab610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890612b32565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6000600954905090565b6109396109336115ef565b826117ef565b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612dda565b60405180910390fd5b6109838383836118cd565b505050565b6109a383838360405180602001604052806000815250610fd6565b505050565b6109b181611a7a565b50565b6109bc6115ef565b73ffffffffffffffffffffffffffffffffffffffff166109da610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790612b32565b60405180910390fd5b8383905086869050148015610a4a57508181905084849050145b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090612e46565b60405180910390fd5b60005b86869050811015610bed57600073ffffffffffffffffffffffffffffffffffffffff1660036000898985818110610ac657610ac5612e66565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610bda57868682818110610b2a57610b29612e66565b5b90506020020135838383818110610b4457610b43612e66565b5b9050602002016020810190610b599190612839565b73ffffffffffffffffffffffffffffffffffffffff16868684818110610b8257610b81612e66565b5b9050602002016020810190610b979190612839565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b8080610be590612ec4565b915050610a8c565b50505050505050565b610bfe6115ef565b73ffffffffffffffffffffffffffffffffffffffff16610c1c610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990612b32565b60405180910390fd5b80600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610cc283611c0c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90612f7e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390613010565b60405180910390fd5b6000805b600a548111610e16578373ffffffffffffffffffffffffffffffffffffffff16610dd982611c0c565b73ffffffffffffffffffffffffffffffffffffffff1603610e03578180610dff90612ec4565b9250505b8080610e0e90612ec4565b915050610db0565b5080915050919050565b610e286115ef565b73ffffffffffffffffffffffffffffffffffffffff16610e46610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9390612b32565b60405180910390fd5b610ea66000611d6e565b565b6000610eb26115ef565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610f3d90612b81565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6990612b81565b8015610fb65780601f10610f8b57610100808354040283529160200191610fb6565b820191906000526020600020905b815481529060010190602001808311610f9957829003601f168201915b5050505050905090565b610fd2610fcb6115ef565b8383611e32565b5050565b610fe7610fe16115ef565b836117ef565b611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90612dda565b60405180910390fd5b61103284848484611f9e565b50505050565b6060611043826115f7565b611082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611079906130a2565b60405180910390fd5b6007805461108f90612b81565b80601f01602080910402602001604051908101604052809291908181526020018280546110bb90612b81565b80156111085780601f106110dd57610100808354040283529160200191611108565b820191906000526020600020905b8154815290600101906020018083116110eb57829003601f168201915b50505050509050919050565b61111c6115ef565b73ffffffffffffffffffffffffffffffffffffffff1661113a610f05565b73ffffffffffffffffffffffffffffffffffffffff1614611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790612b32565b60405180910390fd5b6000600954905082829050816111a691906130c2565b60098190555060005b83839050811015611209576111f68484838181106111d0576111cf612e66565b5b90506020020160208101906111e59190612839565b82846111f191906130c2565b611ffa565b808061120190612ec4565b9150506111af565b50600a546001848490508361121e91906130c2565b6112289190613118565b1115611250576001838390508261123f91906130c2565b6112499190613118565b600a819055505b505050565b60606008805461126490612b81565b80601f016020809104026020016040519081016040528092919081815260200182805461129090612b81565b80156112dd5780601f106112b2576101008083540402835291602001916112dd565b820191906000526020600020905b8154815290600101906020018083116112c057829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061138682610cb6565b90506113906115ef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806113cd57506113cc610ea8565b5b61140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613198565b60405180910390fd5b60016006600084815260200190815260200160002060006101000a81548160ff021916908315150217905550806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6114966115ef565b73ffffffffffffffffffffffffffffffffffffffff166114b4610f05565b73ffffffffffffffffffffffffffffffffffffffff161461150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150190612b32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115709061322a565b60405180910390fd5b61158281611d6e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158061172f5750600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016116d5919061266b565b602060405180830381865afa1580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611716919061325f565b73ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117a983610cb6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117fa826115f7565b611839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611830906132fe565b60405180910390fd5b600061184483610cb6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118b357508373ffffffffffffffffffffffffffffffffffffffff1661189b846106e3565b73ffffffffffffffffffffffffffffffffffffffff16145b806118c457506118c381856112e7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118ed82610cb6565b73ffffffffffffffffffffffffffffffffffffffff1614611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a90613390565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990613422565b60405180910390fd5b6119bd83838361205a565b6119c8600082611736565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611a8582610cb6565b9050611a8f6115ef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af39061348e565b60405180910390fd5b611b088160008461205a565b611b13600083611736565b6006600083815260200190815260200160002060009054906101000a900460ff16611b655760016006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60016009600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148015611c9f57506006600084815260200190815260200160002060009054906101000a900460ff16155b8015611cb85750600b60009054906101000a900460ff16155b15611d6557600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401611d18919061266b565b602060405180830381865afa925050508015611d5257506040513d601f19601f82011682018060405250810190611d4f919061325f565b60015b611d5f5760009050611d64565b809150505b5b80915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e97906134fa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f919190612350565b60405180910390a3505050565b611fa98484846118cd565b611fb58484848461205f565b611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb9061358c565b60405180910390fd5b50505050565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b60006120808473ffffffffffffffffffffffffffffffffffffffff166121e6565b156121d9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120a96115ef565b8786866040518563ffffffff1660e01b81526004016120cb9493929190613601565b6020604051808303816000875af192505050801561210757506040513d601f19601f820116820180604052508101906121049190613662565b60015b612189573d8060008114612137576040519150601f19603f3d011682016040523d82523d6000602084013e61213c565b606091505b506000815103612181576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121789061358c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121de565b600190505b949350505050565b600080823b905060008111915050919050565b82805461220590612b81565b90600052602060002090601f016020900481019282612227576000855561226e565b82601f1061224057803560ff191683800117855561226e565b8280016001018555821561226e579182015b8281111561226d578235825591602001919060010190612252565b5b50905061227b919061227f565b5090565b5b80821115612298576000816000905550600101612280565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122e5816122b0565b81146122f057600080fd5b50565b600081359050612302816122dc565b92915050565b60006020828403121561231e5761231d6122a6565b5b600061232c848285016122f3565b91505092915050565b60008115159050919050565b61234a81612335565b82525050565b60006020820190506123656000830184612341565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126123905761238f61236b565b5b8235905067ffffffffffffffff8111156123ad576123ac612370565b5b6020830191508360018202830111156123c9576123c8612375565b5b9250929050565b600080602083850312156123e7576123e66122a6565b5b600083013567ffffffffffffffff811115612405576124046122ab565b5b6124118582860161237a565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561245757808201518184015260208101905061243c565b83811115612466576000848401525b50505050565b6000601f19601f8301169050919050565b60006124888261241d565b6124928185612428565b93506124a2818560208601612439565b6124ab8161246c565b840191505092915050565b600060208201905081810360008301526124d0818461247d565b905092915050565b6000819050919050565b6124eb816124d8565b81146124f657600080fd5b50565b600081359050612508816124e2565b92915050565b600060208284031215612524576125236122a6565b5b6000612532848285016124f9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125668261253b565b9050919050565b6125768161255b565b82525050565b6000602082019050612591600083018461256d565b92915050565b6125a08161255b565b81146125ab57600080fd5b50565b6000813590506125bd81612597565b92915050565b600080604083850312156125da576125d96122a6565b5b60006125e8858286016125ae565b92505060206125f9858286016124f9565b9150509250929050565b61260c81612335565b811461261757600080fd5b50565b60008135905061262981612603565b92915050565b600060208284031215612645576126446122a6565b5b60006126538482850161261a565b91505092915050565b612665816124d8565b82525050565b6000602082019050612680600083018461265c565b92915050565b60008060006060848603121561269f5761269e6122a6565b5b60006126ad868287016125ae565b93505060206126be868287016125ae565b92505060406126cf868287016124f9565b9150509250925092565b60008083601f8401126126ef576126ee61236b565b5b8235905067ffffffffffffffff81111561270c5761270b612370565b5b60208301915083602082028301111561272857612727612375565b5b9250929050565b60008083601f8401126127455761274461236b565b5b8235905067ffffffffffffffff81111561276257612761612370565b5b60208301915083602082028301111561277e5761277d612375565b5b9250929050565b600080600080600080606087890312156127a2576127a16122a6565b5b600087013567ffffffffffffffff8111156127c0576127bf6122ab565b5b6127cc89828a016126d9565b9650965050602087013567ffffffffffffffff8111156127ef576127ee6122ab565b5b6127fb89828a0161272f565b9450945050604087013567ffffffffffffffff81111561281e5761281d6122ab565b5b61282a89828a0161272f565b92509250509295509295509295565b60006020828403121561284f5761284e6122a6565b5b600061285d848285016125ae565b91505092915050565b6000806040838503121561287d5761287c6122a6565b5b600061288b858286016125ae565b925050602061289c8582860161261a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128e38261246c565b810181811067ffffffffffffffff82111715612902576129016128ab565b5b80604052505050565b600061291561229c565b905061292182826128da565b919050565b600067ffffffffffffffff821115612941576129406128ab565b5b61294a8261246c565b9050602081019050919050565b82818337600083830152505050565b600061297961297484612926565b61290b565b905082815260208101848484011115612995576129946128a6565b5b6129a0848285612957565b509392505050565b600082601f8301126129bd576129bc61236b565b5b81356129cd848260208601612966565b91505092915050565b600080600080608085870312156129f0576129ef6122a6565b5b60006129fe878288016125ae565b9450506020612a0f878288016125ae565b9350506040612a20878288016124f9565b925050606085013567ffffffffffffffff811115612a4157612a406122ab565b5b612a4d878288016129a8565b91505092959194509250565b60008060208385031215612a7057612a6f6122a6565b5b600083013567ffffffffffffffff811115612a8e57612a8d6122ab565b5b612a9a8582860161272f565b92509250509250929050565b60008060408385031215612abd57612abc6122a6565b5b6000612acb858286016125ae565b9250506020612adc858286016125ae565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b1c602083612428565b9150612b2782612ae6565b602082019050919050565b60006020820190508181036000830152612b4b81612b0f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b9957607f821691505b602082108103612bac57612bab612b52565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c0e602c83612428565b9150612c1982612bb2565b604082019050919050565b60006020820190508181036000830152612c3d81612c01565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ca0602183612428565b9150612cab82612c44565b604082019050919050565b60006020820190508181036000830152612ccf81612c93565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612d32603883612428565b9150612d3d82612cd6565b604082019050919050565b60006020820190508181036000830152612d6181612d25565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612dc4603183612428565b9150612dcf82612d68565b604082019050919050565b60006020820190508181036000830152612df381612db7565b9050919050565b7f41727261797320646f206e6f74206d617463682e000000000000000000000000600082015250565b6000612e30601483612428565b9150612e3b82612dfa565b602082019050919050565b60006020820190508181036000830152612e5f81612e23565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ecf826124d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f0157612f00612e95565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612f68602983612428565b9150612f7382612f0c565b604082019050919050565b60006020820190508181036000830152612f9781612f5b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612ffa602a83612428565b915061300582612f9e565b604082019050919050565b6000602082019050818103600083015261302981612fed565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061308c602f83612428565b915061309782613030565b604082019050919050565b600060208201905081810360008301526130bb8161307f565b9050919050565b60006130cd826124d8565b91506130d8836124d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561310d5761310c612e95565b5b828201905092915050565b6000613123826124d8565b915061312e836124d8565b92508282101561314157613140612e95565b5b828203905092915050565b7f4d757374206f776e20746f6b656e20746f206269667572636174652e00000000600082015250565b6000613182601c83612428565b915061318d8261314c565b602082019050919050565b600060208201905081810360008301526131b181613175565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613214602683612428565b915061321f826131b8565b604082019050919050565b6000602082019050818103600083015261324381613207565b9050919050565b60008151905061325981612597565b92915050565b600060208284031215613275576132746122a6565b5b60006132838482850161324a565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006132e8602c83612428565b91506132f38261328c565b604082019050919050565b60006020820190508181036000830152613317816132db565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061337a602983612428565b91506133858261331e565b604082019050919050565b600060208201905081810360008301526133a98161336d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061340c602483612428565b9150613417826133b0565b604082019050919050565b6000602082019050818103600083015261343b816133ff565b9050919050565b7f4d757374206f776e20746f6b656e20746f206275726e2e000000000000000000600082015250565b6000613478601783612428565b915061348382613442565b602082019050919050565b600060208201905081810360008301526134a78161346b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006134e4601983612428565b91506134ef826134ae565b602082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613576603283612428565b91506135818261351a565b604082019050919050565b600060208201905081810360008301526135a581613569565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006135d3826135ac565b6135dd81856135b7565b93506135ed818560208601612439565b6135f68161246c565b840191505092915050565b6000608082019050613616600083018761256d565b613623602083018661256d565b613630604083018561265c565b818103606083015261364281846135c8565b905095945050505050565b60008151905061365c816122dc565b92915050565b600060208284031215613678576136776122a6565b5b60006136868482850161364d565b9150509291505056fea2646970667358221220eb80bbfe6701c93af666e89eab3779c2be2f2f77cc4e61541842c4311cb0e64c64736f6c634300080d0033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806370a08231116100de578063b88d4fde11610097578063e8a3d48511610071578063e8a3d48514610457578063e985e9c514610475578063f0d6f8ef146104a5578063f2fde38b146104c15761018e565b8063b88d4fde146103ef578063c87b56dd1461040b578063df1e2f281461043b5761018e565b806370a082311461033f578063715018a61461036f5780637f7dcdbf146103795780638da5cb5b1461039757806395d89b41146103b5578063a22cb465146103d35761018e565b806318160ddd1161014b57806342966c681161012557806342966c68146102bb57806342d8c7d5146102d757806347fc822f146102f35780636352211e1461030f5761018e565b806318160ddd1461026557806323b872dd1461028357806342842e0e1461029f5761018e565b806301ffc9a71461019357806302fe5305146101c357806306fdde03146101df578063081812fc146101fd578063095ea7b31461022d57806317495dde14610249575b600080fd5b6101ad60048036038101906101a89190612308565b6104dd565b6040516101ba9190612350565b60405180910390f35b6101dd60048036038101906101d891906123d0565b6105bf565b005b6101e7610651565b6040516101f491906124b6565b60405180910390f35b6102176004803603810190610212919061250e565b6106e3565b604051610224919061257c565b60405180910390f35b610247600480360381019061024291906125c3565b61076e565b005b610263600480360381019061025e919061262f565b610885565b005b61026d61091e565b60405161027a919061266b565b60405180910390f35b61029d60048036038101906102989190612686565b610928565b005b6102b960048036038101906102b49190612686565b610988565b005b6102d560048036038101906102d0919061250e565b6109a8565b005b6102f160048036038101906102ec9190612785565b6109b4565b005b61030d60048036038101906103089190612839565b610bf6565b005b6103296004803603810190610324919061250e565b610cb6565b604051610336919061257c565b60405180910390f35b61035960048036038101906103549190612839565b610d3c565b604051610366919061266b565b60405180910390f35b610377610e20565b005b610381610ea8565b60405161038e9190612350565b60405180910390f35b61039f610f05565b6040516103ac919061257c565b60405180910390f35b6103bd610f2e565b6040516103ca91906124b6565b60405180910390f35b6103ed60048036038101906103e89190612866565b610fc0565b005b610409600480360381019061040491906129d6565b610fd6565b005b6104256004803603810190610420919061250e565b611038565b60405161043291906124b6565b60405180910390f35b61045560048036038101906104509190612a59565b611114565b005b61045f611255565b60405161046c91906124b6565b60405180910390f35b61048f600480360381019061048a9190612aa6565b6112e7565b60405161049c9190612350565b60405180910390f35b6104bf60048036038101906104ba919061250e565b61137b565b005b6104db60048036038101906104d69190612839565b61148e565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105a857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105b857506105b782611585565b5b9050919050565b6105c76115ef565b73ffffffffffffffffffffffffffffffffffffffff166105e5610f05565b73ffffffffffffffffffffffffffffffffffffffff161461063b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063290612b32565b60405180910390fd5b81816007919061064c9291906121f9565b505050565b60606001805461066090612b81565b80601f016020809104026020016040519081016040528092919081815260200182805461068c90612b81565b80156106d95780601f106106ae576101008083540402835291602001916106d9565b820191906000526020600020905b8154815290600101906020018083116106bc57829003601f168201915b5050505050905090565b60006106ee826115f7565b61072d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072490612c24565b60405180910390fd5b60006004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080915050919050565b600061077982610cb6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107e090612cb6565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108086115ef565b73ffffffffffffffffffffffffffffffffffffffff1614806108375750610836816108316115ef565b6112e7565b5b610876576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086d90612d48565b60405180910390fd5b6108808383611736565b505050565b61088d6115ef565b73ffffffffffffffffffffffffffffffffffffffff166108ab610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610901576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f890612b32565b60405180910390fd5b80600b60006101000a81548160ff02191690831515021790555050565b6000600954905090565b6109396109336115ef565b826117ef565b610978576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096f90612dda565b60405180910390fd5b6109838383836118cd565b505050565b6109a383838360405180602001604052806000815250610fd6565b505050565b6109b181611a7a565b50565b6109bc6115ef565b73ffffffffffffffffffffffffffffffffffffffff166109da610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790612b32565b60405180910390fd5b8383905086869050148015610a4a57508181905084849050145b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090612e46565b60405180910390fd5b60005b86869050811015610bed57600073ffffffffffffffffffffffffffffffffffffffff1660036000898985818110610ac657610ac5612e66565b5b90506020020135815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610bda57868682818110610b2a57610b29612e66565b5b90506020020135838383818110610b4457610b43612e66565b5b9050602002016020810190610b599190612839565b73ffffffffffffffffffffffffffffffffffffffff16868684818110610b8257610b81612e66565b5b9050602002016020810190610b979190612839565b73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b8080610be590612ec4565b915050610a8c565b50505050505050565b610bfe6115ef565b73ffffffffffffffffffffffffffffffffffffffff16610c1c610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6990612b32565b60405180910390fd5b80600b60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600080610cc283611c0c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2a90612f7e565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610dac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da390613010565b60405180910390fd5b6000805b600a548111610e16578373ffffffffffffffffffffffffffffffffffffffff16610dd982611c0c565b73ffffffffffffffffffffffffffffffffffffffff1603610e03578180610dff90612ec4565b9250505b8080610e0e90612ec4565b915050610db0565b5080915050919050565b610e286115ef565b73ffffffffffffffffffffffffffffffffffffffff16610e46610f05565b73ffffffffffffffffffffffffffffffffffffffff1614610e9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9390612b32565b60405180910390fd5b610ea66000611d6e565b565b6000610eb26115ef565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060028054610f3d90612b81565b80601f0160208091040260200160405190810160405280929190818152602001828054610f6990612b81565b8015610fb65780601f10610f8b57610100808354040283529160200191610fb6565b820191906000526020600020905b815481529060010190602001808311610f9957829003601f168201915b5050505050905090565b610fd2610fcb6115ef565b8383611e32565b5050565b610fe7610fe16115ef565b836117ef565b611026576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101d90612dda565b60405180910390fd5b61103284848484611f9e565b50505050565b6060611043826115f7565b611082576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611079906130a2565b60405180910390fd5b6007805461108f90612b81565b80601f01602080910402602001604051908101604052809291908181526020018280546110bb90612b81565b80156111085780601f106110dd57610100808354040283529160200191611108565b820191906000526020600020905b8154815290600101906020018083116110eb57829003601f168201915b50505050509050919050565b61111c6115ef565b73ffffffffffffffffffffffffffffffffffffffff1661113a610f05565b73ffffffffffffffffffffffffffffffffffffffff1614611190576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118790612b32565b60405180910390fd5b6000600954905082829050816111a691906130c2565b60098190555060005b83839050811015611209576111f68484838181106111d0576111cf612e66565b5b90506020020160208101906111e59190612839565b82846111f191906130c2565b611ffa565b808061120190612ec4565b9150506111af565b50600a546001848490508361121e91906130c2565b6112289190613118565b1115611250576001838390508261123f91906130c2565b6112499190613118565b600a819055505b505050565b60606008805461126490612b81565b80601f016020809104026020016040519081016040528092919081815260200182805461129090612b81565b80156112dd5780601f106112b2576101008083540402835291602001916112dd565b820191906000526020600020905b8154815290600101906020018083116112c057829003601f168201915b5050505050905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600061138682610cb6565b90506113906115ef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614806113cd57506113cc610ea8565b5b61140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613198565b60405180910390fd5b60016006600084815260200190815260200160002060006101000a81548160ff021916908315150217905550806003600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050565b6114966115ef565b73ffffffffffffffffffffffffffffffffffffffff166114b4610f05565b73ffffffffffffffffffffffffffffffffffffffff161461150a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150190612b32565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611579576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115709061322a565b60405180910390fd5b61158281611d6e565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614158061172f5750600073ffffffffffffffffffffffffffffffffffffffff16600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016116d5919061266b565b602060405180830381865afa1580156116f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611716919061325f565b73ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166117a983610cb6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006117fa826115f7565b611839576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611830906132fe565b60405180910390fd5b600061184483610cb6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806118b357508373ffffffffffffffffffffffffffffffffffffffff1661189b846106e3565b73ffffffffffffffffffffffffffffffffffffffff16145b806118c457506118c381856112e7565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118ed82610cb6565b73ffffffffffffffffffffffffffffffffffffffff1614611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a90613390565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036119b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a990613422565b60405180910390fd5b6119bd83838361205a565b6119c8600082611736565b816003600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000611a8582610cb6565b9050611a8f6115ef565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611afc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611af39061348e565b60405180910390fd5b611b088160008461205a565b611b13600083611736565b6006600083815260200190815260200160002060009054906101000a900460ff16611b655760016006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055505b60016009600082825403925050819055506003600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000806003600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148015611c9f57506006600084815260200190815260200160002060009054906101000a900460ff16155b8015611cb85750600b60009054906101000a900460ff16155b15611d6557600b60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b8152600401611d18919061266b565b602060405180830381865afa925050508015611d5257506040513d601f19601f82011682018060405250810190611d4f919061325f565b60015b611d5f5760009050611d64565b809150505b5b80915050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ea0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e97906134fa565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611f919190612350565b60405180910390a3505050565b611fa98484846118cd565b611fb58484848461205f565b611ff4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611feb9061358c565b60405180910390fd5b50505050565b808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b505050565b60006120808473ffffffffffffffffffffffffffffffffffffffff166121e6565b156121d9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026120a96115ef565b8786866040518563ffffffff1660e01b81526004016120cb9493929190613601565b6020604051808303816000875af192505050801561210757506040513d601f19601f820116820180604052508101906121049190613662565b60015b612189573d8060008114612137576040519150601f19603f3d011682016040523d82523d6000602084013e61213c565b606091505b506000815103612181576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121789061358c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506121de565b600190505b949350505050565b600080823b905060008111915050919050565b82805461220590612b81565b90600052602060002090601f016020900481019282612227576000855561226e565b82601f1061224057803560ff191683800117855561226e565b8280016001018555821561226e579182015b8281111561226d578235825591602001919060010190612252565b5b50905061227b919061227f565b5090565b5b80821115612298576000816000905550600101612280565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122e5816122b0565b81146122f057600080fd5b50565b600081359050612302816122dc565b92915050565b60006020828403121561231e5761231d6122a6565b5b600061232c848285016122f3565b91505092915050565b60008115159050919050565b61234a81612335565b82525050565b60006020820190506123656000830184612341565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126123905761238f61236b565b5b8235905067ffffffffffffffff8111156123ad576123ac612370565b5b6020830191508360018202830111156123c9576123c8612375565b5b9250929050565b600080602083850312156123e7576123e66122a6565b5b600083013567ffffffffffffffff811115612405576124046122ab565b5b6124118582860161237a565b92509250509250929050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561245757808201518184015260208101905061243c565b83811115612466576000848401525b50505050565b6000601f19601f8301169050919050565b60006124888261241d565b6124928185612428565b93506124a2818560208601612439565b6124ab8161246c565b840191505092915050565b600060208201905081810360008301526124d0818461247d565b905092915050565b6000819050919050565b6124eb816124d8565b81146124f657600080fd5b50565b600081359050612508816124e2565b92915050565b600060208284031215612524576125236122a6565b5b6000612532848285016124f9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006125668261253b565b9050919050565b6125768161255b565b82525050565b6000602082019050612591600083018461256d565b92915050565b6125a08161255b565b81146125ab57600080fd5b50565b6000813590506125bd81612597565b92915050565b600080604083850312156125da576125d96122a6565b5b60006125e8858286016125ae565b92505060206125f9858286016124f9565b9150509250929050565b61260c81612335565b811461261757600080fd5b50565b60008135905061262981612603565b92915050565b600060208284031215612645576126446122a6565b5b60006126538482850161261a565b91505092915050565b612665816124d8565b82525050565b6000602082019050612680600083018461265c565b92915050565b60008060006060848603121561269f5761269e6122a6565b5b60006126ad868287016125ae565b93505060206126be868287016125ae565b92505060406126cf868287016124f9565b9150509250925092565b60008083601f8401126126ef576126ee61236b565b5b8235905067ffffffffffffffff81111561270c5761270b612370565b5b60208301915083602082028301111561272857612727612375565b5b9250929050565b60008083601f8401126127455761274461236b565b5b8235905067ffffffffffffffff81111561276257612761612370565b5b60208301915083602082028301111561277e5761277d612375565b5b9250929050565b600080600080600080606087890312156127a2576127a16122a6565b5b600087013567ffffffffffffffff8111156127c0576127bf6122ab565b5b6127cc89828a016126d9565b9650965050602087013567ffffffffffffffff8111156127ef576127ee6122ab565b5b6127fb89828a0161272f565b9450945050604087013567ffffffffffffffff81111561281e5761281d6122ab565b5b61282a89828a0161272f565b92509250509295509295509295565b60006020828403121561284f5761284e6122a6565b5b600061285d848285016125ae565b91505092915050565b6000806040838503121561287d5761287c6122a6565b5b600061288b858286016125ae565b925050602061289c8582860161261a565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6128e38261246c565b810181811067ffffffffffffffff82111715612902576129016128ab565b5b80604052505050565b600061291561229c565b905061292182826128da565b919050565b600067ffffffffffffffff821115612941576129406128ab565b5b61294a8261246c565b9050602081019050919050565b82818337600083830152505050565b600061297961297484612926565b61290b565b905082815260208101848484011115612995576129946128a6565b5b6129a0848285612957565b509392505050565b600082601f8301126129bd576129bc61236b565b5b81356129cd848260208601612966565b91505092915050565b600080600080608085870312156129f0576129ef6122a6565b5b60006129fe878288016125ae565b9450506020612a0f878288016125ae565b9350506040612a20878288016124f9565b925050606085013567ffffffffffffffff811115612a4157612a406122ab565b5b612a4d878288016129a8565b91505092959194509250565b60008060208385031215612a7057612a6f6122a6565b5b600083013567ffffffffffffffff811115612a8e57612a8d6122ab565b5b612a9a8582860161272f565b92509250509250929050565b60008060408385031215612abd57612abc6122a6565b5b6000612acb858286016125ae565b9250506020612adc858286016125ae565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612b1c602083612428565b9150612b2782612ae6565b602082019050919050565b60006020820190508181036000830152612b4b81612b0f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612b9957607f821691505b602082108103612bac57612bab612b52565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612c0e602c83612428565b9150612c1982612bb2565b604082019050919050565b60006020820190508181036000830152612c3d81612c01565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ca0602183612428565b9150612cab82612c44565b604082019050919050565b60006020820190508181036000830152612ccf81612c93565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612d32603883612428565b9150612d3d82612cd6565b604082019050919050565b60006020820190508181036000830152612d6181612d25565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612dc4603183612428565b9150612dcf82612d68565b604082019050919050565b60006020820190508181036000830152612df381612db7565b9050919050565b7f41727261797320646f206e6f74206d617463682e000000000000000000000000600082015250565b6000612e30601483612428565b9150612e3b82612dfa565b602082019050919050565b60006020820190508181036000830152612e5f81612e23565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612ecf826124d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612f0157612f00612e95565b5b600182019050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612f68602983612428565b9150612f7382612f0c565b604082019050919050565b60006020820190508181036000830152612f9781612f5b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612ffa602a83612428565b915061300582612f9e565b604082019050919050565b6000602082019050818103600083015261302981612fed565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b600061308c602f83612428565b915061309782613030565b604082019050919050565b600060208201905081810360008301526130bb8161307f565b9050919050565b60006130cd826124d8565b91506130d8836124d8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561310d5761310c612e95565b5b828201905092915050565b6000613123826124d8565b915061312e836124d8565b92508282101561314157613140612e95565b5b828203905092915050565b7f4d757374206f776e20746f6b656e20746f206269667572636174652e00000000600082015250565b6000613182601c83612428565b915061318d8261314c565b602082019050919050565b600060208201905081810360008301526131b181613175565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613214602683612428565b915061321f826131b8565b604082019050919050565b6000602082019050818103600083015261324381613207565b9050919050565b60008151905061325981612597565b92915050565b600060208284031215613275576132746122a6565b5b60006132838482850161324a565b91505092915050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006132e8602c83612428565b91506132f38261328c565b604082019050919050565b60006020820190508181036000830152613317816132db565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061337a602983612428565b91506133858261331e565b604082019050919050565b600060208201905081810360008301526133a98161336d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061340c602483612428565b9150613417826133b0565b604082019050919050565b6000602082019050818103600083015261343b816133ff565b9050919050565b7f4d757374206f776e20746f6b656e20746f206275726e2e000000000000000000600082015250565b6000613478601783612428565b915061348382613442565b602082019050919050565b600060208201905081810360008301526134a78161346b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006134e4601983612428565b91506134ef826134ae565b602082019050919050565b60006020820190508181036000830152613513816134d7565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613576603283612428565b91506135818261351a565b604082019050919050565b600060208201905081810360008301526135a581613569565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006135d3826135ac565b6135dd81856135b7565b93506135ed818560208601612439565b6135f68161246c565b840191505092915050565b6000608082019050613616600083018761256d565b613623602083018661256d565b613630604083018561265c565b818103606083015261364281846135c8565b905095945050505050565b60008151905061365c816122dc565b92915050565b600060208284031215613678576136776122a6565b5b60006136868482850161364d565b9150509291505056fea2646970667358221220eb80bbfe6701c93af666e89eab3779c2be2f2f77cc4e61541842c4311cb0e64c64736f6c634300080d0033

Deployed Bytecode Sourcemap

13140:10081:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14148:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21187:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15561:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16193:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15781:404;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21297:97;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23127:91;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16793:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17140:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22252:74;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22335:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14461:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14948:240;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14596:344;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11929:103;;;:::i;:::-;;12040:107;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11278:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15669:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16458:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17333:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22866:253;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21402:525;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22759:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16621:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21935:311;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12302:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14148:305;14250:4;14302:25;14287:40;;;:11;:40;;;;:105;;;;14359:33;14344:48;;;:11;:48;;;;14287:105;:158;;;;14409:36;14433:11;14409:23;:36::i;:::-;14287:158;14267:178;;14148:305;;;:::o;21187:102::-;11509:12;:10;:12::i;:::-;11498:23;;:7;:5;:7::i;:::-;:23;;;11490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21274:7:::1;;21258:13;:23;;;;;;;:::i;:::-;;21187:102:::0;;:::o;15561:100::-;15615:13;15648:5;15641:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15561:100;:::o;16193:257::-;16269:7;16297:16;16305:7;16297;:16::i;:::-;16289:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16373:16;16392:15;:24;16408:7;16392:24;;;;;;;;;;;;;;;;;;;;;16373:43;;16434:8;16427:15;;;16193:257;;;:::o;15781:404::-;15862:13;15878:16;15886:7;15878;:16::i;:::-;15862:32;;15919:5;15913:11;;:2;:11;;;15905:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;16013:5;15997:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;16022:37;16039:5;16046:12;:10;:12::i;:::-;16022:16;:37::i;:::-;15997:62;15975:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;16156:21;16165:2;16169:7;16156:8;:21::i;:::-;15851:334;15781:404;;:::o;21297:97::-;11509:12;:10;:12::i;:::-;11498:23;;:7;:5;:7::i;:::-;:23;;;11490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21379:7:::1;21365:11;;:21;;;;;;;;;;;;;;;;;;21297:97:::0;:::o;23127:91::-;23171:7;23198:12;;23191:19;;23127:91;:::o;16793:339::-;16988:41;17007:12;:10;:12::i;:::-;17021:7;16988:18;:41::i;:::-;16980:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;17096:28;17106:4;17112:2;17116:7;17096:9;:28::i;:::-;16793:339;;;:::o;17140:185::-;17278:39;17295:4;17301:2;17305:7;17278:39;;;;;;;;;;;;:16;:39::i;:::-;17140:185;;;:::o;22252:74::-;22304:14;22310:7;22304:5;:14::i;:::-;22252:74;:::o;22335:416::-;11509:12;:10;:12::i;:::-;11498:23;;:7;:5;:7::i;:::-;:23;;;11490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22490:4:::1;;:11;;22472:7;;:14;;:29;:57;;;;;22520:2;;:9;;22505:4;;:11;;:24;22472:57;22464:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;22568:9;22564:180;22586:7;;:14;;22582:1;:18;22564:180;;;22655:1;22624:33;;:7;:19;22632:7;;22640:1;22632:10;;;;;;;:::i;:::-;;;;;;;;22624:19;;;;;;;;;;;;;;;;;;;;;:33;;::::0;22621:112:::1;;22707:7;;22715:1;22707:10;;;;;;;:::i;:::-;;;;;;;;22700:2;;22703:1;22700:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22682:36;;22691:4;;22696:1;22691:7;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;22682:36;;;;;;;;;;;;22621:112;22601:3;;;;;:::i;:::-;;;;22564:180;;;;22335:416:::0;;;;;;:::o;14461:127::-;11509:12;:10;:12::i;:::-;11498:23;;:7;:5;:7::i;:::-;:23;;;11490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14564:15:::1;14544:7;;:36;;;;;;;;;;;;;;;;;;14461:127:::0;:::o;14948:240::-;15020:7;15040:13;15056:17;15065:7;15056:8;:17::i;:::-;15040:33;;15109:1;15092:19;;:5;:19;;;15084:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;15175:5;15168:12;;;14948:240;;;:::o;14596:344::-;14668:7;14713:1;14696:19;;:5;:19;;;14688:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;14773:15;14807:9;14803:105;14826:12;;14821:1;:17;14803:105;;14876:5;14861:20;;:11;14870:1;14861:8;:11::i;:::-;:20;;;14858:39;;14885:9;;;;;:::i;:::-;;;;14858:39;14839:3;;;;;:::i;:::-;;;;14803:105;;;;14925:7;14918:14;;;14596:344;;;:::o;11929:103::-;11509:12;:10;:12::i;:::-;11498:23;;:7;:5;:7::i;:::-;:23;;;11490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;11994:30:::1;12021:1;11994:18;:30::i;:::-;11929:103::o:0;12040:107::-;12091:4;12126:12;:10;:12::i;:::-;12116:22;;:6;;;;;;;;;;:22;;;12108:31;;12040:107;:::o;11278:87::-;11324:7;11351:6;;;;;;;;;;;11344:13;;11278:87;:::o;15669:104::-;15725:13;15758:7;15751:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15669:104;:::o;16458:155::-;16553:52;16572:12;:10;:12::i;:::-;16586:8;16596;16553:18;:52::i;:::-;16458:155;;:::o;17333:328::-;17508:41;17527:12;:10;:12::i;:::-;17541:7;17508:18;:41::i;:::-;17500:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;17614:39;17628:4;17634:2;17638:7;17647:5;17614:13;:39::i;:::-;17333:328;;;;:::o;22866:253::-;22931:13;22979:16;22987:7;22979;:16::i;:::-;22957:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;23098:13;23091:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22866:253;;;:::o;21402:525::-;11509:12;:10;:12::i;:::-;11498:23;;:7;:5;:7::i;:::-;:23;;;11490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21484:22:::1;21509:12;;21484:37;;21603:10;;:17;;21586:14;:34;;;;:::i;:::-;21571:12;:49;;;;21679:9;21674:115;21698:10;;:17;;21694:1;:21;21674:115;;;21737:40;21743:10;;21754:1;21743:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;21775:1;21758:14;:18;;;;:::i;:::-;21737:5;:40::i;:::-;21717:3;;;;;:::i;:::-;;;;21674:115;;;;21845:12;;21840:1;21820:10;;:17;;21803:14;:34;;;;:::i;:::-;:38;;;;:::i;:::-;21802:55;21799:120;;;21914:1;21894:10;;:17;;21877:14;:34;;;;:::i;:::-;:38;;;;:::i;:::-;21861:12;:55;;;;21799:120;21473:454;21402:525:::0;;:::o;22759:99::-;22805:13;22838:12;22831:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22759:99;:::o;16621:164::-;16718:4;16742:18;:25;16761:5;16742:25;;;;;;;;;;;;;;;:35;16768:8;16742:35;;;;;;;;;;;;;;;;;;;;;;;;;16735:42;;16621:164;;;;:::o;21935:311::-;21997:13;22013:16;22021:7;22013;:16::i;:::-;21997:32;;22057:12;:10;:12::i;:::-;22048:21;;:5;:21;;;:42;;;;22073:17;:15;:17::i;:::-;22048:42;22040:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;22162:4;22134:16;:25;22151:7;22134:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;22222:5;22203:7;:16;22211:7;22203:16;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;21985:261;21935:311;:::o;12302:201::-;11509:12;:10;:12::i;:::-;11498:23;;:7;:5;:7::i;:::-;:23;;;11490:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;12411:1:::1;12391:22;;:8;:22;;::::0;12383:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;12467:28;12486:8;12467:18;:28::i;:::-;12302:201:::0;:::o;10195:157::-;10280:4;10319:25;10304:40;;;:11;:40;;;;10297:47;;10195:157;;;:::o;2336:98::-;2389:7;2416:10;2409:17;;2336:98;:::o;17992:169::-;18057:4;18109:1;18081:30;;:7;:16;18089:7;18081:16;;;;;;;;;;;;;;;;;;;;;:30;;;;:72;;;;18151:1;18115:38;;:7;;;;;;;;;;;:15;;;18131:7;18115:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:38;;;;18081:72;18074:79;;17992:169;;;:::o;19746:167::-;19848:2;19821:15;:24;19837:7;19821:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19897:7;19893:2;19866:39;;19875:16;19883:7;19875;:16::i;:::-;19866:39;;;;;;;;;;;;19746:167;;:::o;18169:341::-;18262:4;18287:16;18295:7;18287;:16::i;:::-;18279:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18363:13;18379:16;18387:7;18379;:16::i;:::-;18363:32;;18425:5;18414:16;;:7;:16;;;:51;;;;18458:7;18434:31;;:20;18446:7;18434:11;:20::i;:::-;:31;;;18414:51;:87;;;;18469:32;18486:5;18493:7;18469:16;:32::i;:::-;18414:87;18406:96;;;18169:341;;;;:::o;19184:554::-;19336:4;19316:24;;:16;19324:7;19316;:16::i;:::-;:24;;;19308:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;19419:1;19405:16;;:2;:16;;;19397:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;19475:39;19496:4;19502:2;19506:7;19475:20;:39::i;:::-;19579:29;19596:1;19600:7;19579:8;:29::i;:::-;19672:2;19653:7;:16;19661:7;19653:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;19722:7;19718:2;19703:27;;19712:4;19703:27;;;;;;;;;;;;19184:554;;;:::o;18644:532::-;18704:13;18720:16;18728:7;18720;:16::i;:::-;18704:32;;18764:12;:10;:12::i;:::-;18755:21;;:5;:21;;;18747:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;18817:48;18838:5;18853:1;18857:7;18817:20;:48::i;:::-;18906:29;18923:1;18927:7;18906:8;:29::i;:::-;18975:16;:25;18992:7;18975:25;;;;;;;;;;;;;;;;;;;;;18971:68;;19032:4;19004:16;:25;19021:7;19004:25;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;18971:68;19068:1;19052:12;;:17;;;;;;;;;;;19098:7;:16;19106:7;19098:16;;;;;;;;;;;;19091:23;;;;;;;;;;;19160:7;19156:1;19132:36;;19141:5;19132:36;;;;;;;;;;;;18693:483;18644:532;:::o;15196:357::-;15262:7;15282:13;15298:7;:16;15306:7;15298:16;;;;;;;;;;;;;;;;;;;;;15282:32;;15345:1;15328:19;;:5;:19;;;:49;;;;;15352:16;:25;15369:7;15352:25;;;;;;;;;;;;;;;;;;;;;15351:26;15328:49;:65;;;;;15382:11;;;;;;;;;;;15381:12;15328:65;15325:198;;;15413:7;;;;;;;;;;;:15;;;15429:7;15413:24;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;15409:103;;15507:1;15491:18;;15409:103;;;15473:6;15465:14;;15438:44;15409:103;15325:198;15540:5;15533:12;;;15196:357;;;:::o;12663:191::-;12737:16;12756:6;;;;;;;;;;;12737:25;;12782:8;12773:6;;:17;;;;;;;;;;;;;;;;;;12837:8;12806:40;;12827:8;12806:40;;;;;;;;;;;;12726:128;12663:191;:::o;19921:315::-;20076:8;20067:17;;:5;:17;;;20059:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;20163:8;20125:18;:25;20144:5;20125:25;;;;;;;;;;;;;;;:35;20151:8;20125:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;20209:8;20187:41;;20202:5;20187:41;;;20219:8;20187:41;;;;;;:::i;:::-;;;;;;;;19921:315;;;:::o;17669:::-;17826:28;17836:4;17842:2;17846:7;17826:9;:28::i;:::-;17873:48;17896:4;17902:2;17906:7;17915:5;17873:22;:48::i;:::-;17865:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;17669:315;;;;:::o;18518:118::-;18620:7;18616:2;18595:33;;18612:1;18595:33;;;;;;;;;;;;18518:118;;:::o;21051:126::-;;;;:::o;20244:799::-;20399:4;20420:15;:2;:13;;;:15::i;:::-;20416:620;;;20472:2;20456:36;;;20493:12;:10;:12::i;:::-;20507:4;20513:7;20522:5;20456:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;20452:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20715:1;20698:6;:13;:18;20694:272;;20741:60;;;;;;;;;;:::i;:::-;;;;;;;;20694:272;20916:6;20910:13;20901:6;20897:2;20893:15;20886:38;20452:529;20589:41;;;20579:51;;;:6;:51;;;;20572:58;;;;;20416:620;21020:4;21013:11;;20244:799;;;;;;;:::o;25895:387::-;25955:4;26163:12;26230:7;26218:20;26210:28;;26273:1;26266:4;:8;26259:15;;;25895:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:117;1873:1;1870;1863:12;1901:553;1959:8;1969:6;2019:3;2012:4;2004:6;2000:17;1996:27;1986:122;;2027:79;;:::i;:::-;1986:122;2140:6;2127:20;2117:30;;2170:18;2162:6;2159:30;2156:117;;;2192:79;;:::i;:::-;2156:117;2306:4;2298:6;2294:17;2282:29;;2360:3;2352:4;2344:6;2340:17;2330:8;2326:32;2323:41;2320:128;;;2367:79;;:::i;:::-;2320:128;1901:553;;;;;:::o;2460:529::-;2531:6;2539;2588:2;2576:9;2567:7;2563:23;2559:32;2556:119;;;2594:79;;:::i;:::-;2556:119;2742:1;2731:9;2727:17;2714:31;2772:18;2764:6;2761:30;2758:117;;;2794:79;;:::i;:::-;2758:117;2907:65;2964:7;2955:6;2944:9;2940:22;2907:65;:::i;:::-;2889:83;;;;2685:297;2460:529;;;;;:::o;2995:99::-;3047:6;3081:5;3075:12;3065:22;;2995:99;;;:::o;3100:169::-;3184:11;3218:6;3213:3;3206:19;3258:4;3253:3;3249:14;3234:29;;3100:169;;;;:::o;3275:307::-;3343:1;3353:113;3367:6;3364:1;3361:13;3353:113;;;3452:1;3447:3;3443:11;3437:18;3433:1;3428:3;3424:11;3417:39;3389:2;3386:1;3382:10;3377:15;;3353:113;;;3484:6;3481:1;3478:13;3475:101;;;3564:1;3555:6;3550:3;3546:16;3539:27;3475:101;3324:258;3275:307;;;:::o;3588:102::-;3629:6;3680:2;3676:7;3671:2;3664:5;3660:14;3656:28;3646:38;;3588:102;;;:::o;3696:364::-;3784:3;3812:39;3845:5;3812:39;:::i;:::-;3867:71;3931:6;3926:3;3867:71;:::i;:::-;3860:78;;3947:52;3992:6;3987:3;3980:4;3973:5;3969:16;3947:52;:::i;:::-;4024:29;4046:6;4024:29;:::i;:::-;4019:3;4015:39;4008:46;;3788:272;3696:364;;;;:::o;4066:313::-;4179:4;4217:2;4206:9;4202:18;4194:26;;4266:9;4260:4;4256:20;4252:1;4241:9;4237:17;4230:47;4294:78;4367:4;4358:6;4294:78;:::i;:::-;4286:86;;4066:313;;;;:::o;4385:77::-;4422:7;4451:5;4440:16;;4385:77;;;:::o;4468:122::-;4541:24;4559:5;4541:24;:::i;:::-;4534:5;4531:35;4521:63;;4580:1;4577;4570:12;4521:63;4468:122;:::o;4596:139::-;4642:5;4680:6;4667:20;4658:29;;4696:33;4723:5;4696:33;:::i;:::-;4596:139;;;;:::o;4741:329::-;4800:6;4849:2;4837:9;4828:7;4824:23;4820:32;4817:119;;;4855:79;;:::i;:::-;4817:119;4975:1;5000:53;5045:7;5036:6;5025:9;5021:22;5000:53;:::i;:::-;4990:63;;4946:117;4741:329;;;;:::o;5076:126::-;5113:7;5153:42;5146:5;5142:54;5131:65;;5076:126;;;:::o;5208:96::-;5245:7;5274:24;5292:5;5274:24;:::i;:::-;5263:35;;5208:96;;;:::o;5310:118::-;5397:24;5415:5;5397:24;:::i;:::-;5392:3;5385:37;5310:118;;:::o;5434:222::-;5527:4;5565:2;5554:9;5550:18;5542:26;;5578:71;5646:1;5635:9;5631:17;5622:6;5578:71;:::i;:::-;5434:222;;;;:::o;5662:122::-;5735:24;5753:5;5735:24;:::i;:::-;5728:5;5725:35;5715:63;;5774:1;5771;5764:12;5715:63;5662:122;:::o;5790:139::-;5836:5;5874:6;5861:20;5852:29;;5890:33;5917:5;5890:33;:::i;:::-;5790:139;;;;:::o;5935:474::-;6003:6;6011;6060:2;6048:9;6039:7;6035:23;6031:32;6028:119;;;6066:79;;:::i;:::-;6028:119;6186:1;6211:53;6256:7;6247:6;6236:9;6232:22;6211:53;:::i;:::-;6201:63;;6157:117;6313:2;6339:53;6384:7;6375:6;6364:9;6360:22;6339:53;:::i;:::-;6329:63;;6284:118;5935:474;;;;;:::o;6415:116::-;6485:21;6500:5;6485:21;:::i;:::-;6478:5;6475:32;6465:60;;6521:1;6518;6511:12;6465:60;6415:116;:::o;6537:133::-;6580:5;6618:6;6605:20;6596:29;;6634:30;6658:5;6634:30;:::i;:::-;6537:133;;;;:::o;6676:323::-;6732:6;6781:2;6769:9;6760:7;6756:23;6752:32;6749:119;;;6787:79;;:::i;:::-;6749:119;6907:1;6932:50;6974:7;6965:6;6954:9;6950:22;6932:50;:::i;:::-;6922:60;;6878:114;6676:323;;;;:::o;7005:118::-;7092:24;7110:5;7092:24;:::i;:::-;7087:3;7080:37;7005:118;;:::o;7129:222::-;7222:4;7260:2;7249:9;7245:18;7237:26;;7273:71;7341:1;7330:9;7326:17;7317:6;7273:71;:::i;:::-;7129:222;;;;:::o;7357:619::-;7434:6;7442;7450;7499:2;7487:9;7478:7;7474:23;7470:32;7467:119;;;7505:79;;:::i;:::-;7467:119;7625:1;7650:53;7695:7;7686:6;7675:9;7671:22;7650:53;:::i;:::-;7640:63;;7596:117;7752:2;7778:53;7823:7;7814:6;7803:9;7799:22;7778:53;:::i;:::-;7768:63;;7723:118;7880:2;7906:53;7951:7;7942:6;7931:9;7927:22;7906:53;:::i;:::-;7896:63;;7851:118;7357:619;;;;;:::o;7999:568::-;8072:8;8082:6;8132:3;8125:4;8117:6;8113:17;8109:27;8099:122;;8140:79;;:::i;:::-;8099:122;8253:6;8240:20;8230:30;;8283:18;8275:6;8272:30;8269:117;;;8305:79;;:::i;:::-;8269:117;8419:4;8411:6;8407:17;8395:29;;8473:3;8465:4;8457:6;8453:17;8443:8;8439:32;8436:41;8433:128;;;8480:79;;:::i;:::-;8433:128;7999:568;;;;;:::o;8590:::-;8663:8;8673:6;8723:3;8716:4;8708:6;8704:17;8700:27;8690:122;;8731:79;;:::i;:::-;8690:122;8844:6;8831:20;8821:30;;8874:18;8866:6;8863:30;8860:117;;;8896:79;;:::i;:::-;8860:117;9010:4;9002:6;8998:17;8986:29;;9064:3;9056:4;9048:6;9044:17;9034:8;9030:32;9027:41;9024:128;;;9071:79;;:::i;:::-;9024:128;8590:568;;;;;:::o;9164:1309::-;9322:6;9330;9338;9346;9354;9362;9411:2;9399:9;9390:7;9386:23;9382:32;9379:119;;;9417:79;;:::i;:::-;9379:119;9565:1;9554:9;9550:17;9537:31;9595:18;9587:6;9584:30;9581:117;;;9617:79;;:::i;:::-;9581:117;9730:80;9802:7;9793:6;9782:9;9778:22;9730:80;:::i;:::-;9712:98;;;;9508:312;9887:2;9876:9;9872:18;9859:32;9918:18;9910:6;9907:30;9904:117;;;9940:79;;:::i;:::-;9904:117;10053:80;10125:7;10116:6;10105:9;10101:22;10053:80;:::i;:::-;10035:98;;;;9830:313;10210:2;10199:9;10195:18;10182:32;10241:18;10233:6;10230:30;10227:117;;;10263:79;;:::i;:::-;10227:117;10376:80;10448:7;10439:6;10428:9;10424:22;10376:80;:::i;:::-;10358:98;;;;10153:313;9164:1309;;;;;;;;:::o;10479:329::-;10538:6;10587:2;10575:9;10566:7;10562:23;10558:32;10555:119;;;10593:79;;:::i;:::-;10555:119;10713:1;10738:53;10783:7;10774:6;10763:9;10759:22;10738:53;:::i;:::-;10728:63;;10684:117;10479:329;;;;:::o;10814:468::-;10879:6;10887;10936:2;10924:9;10915:7;10911:23;10907:32;10904:119;;;10942:79;;:::i;:::-;10904:119;11062:1;11087:53;11132:7;11123:6;11112:9;11108:22;11087:53;:::i;:::-;11077:63;;11033:117;11189:2;11215:50;11257:7;11248:6;11237:9;11233:22;11215:50;:::i;:::-;11205:60;;11160:115;10814:468;;;;;:::o;11288:117::-;11397:1;11394;11387:12;11411:180;11459:77;11456:1;11449:88;11556:4;11553:1;11546:15;11580:4;11577:1;11570:15;11597:281;11680:27;11702:4;11680:27;:::i;:::-;11672:6;11668:40;11810:6;11798:10;11795:22;11774:18;11762:10;11759:34;11756:62;11753:88;;;11821:18;;:::i;:::-;11753:88;11861:10;11857:2;11850:22;11640:238;11597:281;;:::o;11884:129::-;11918:6;11945:20;;:::i;:::-;11935:30;;11974:33;12002:4;11994:6;11974:33;:::i;:::-;11884:129;;;:::o;12019:307::-;12080:4;12170:18;12162:6;12159:30;12156:56;;;12192:18;;:::i;:::-;12156:56;12230:29;12252:6;12230:29;:::i;:::-;12222:37;;12314:4;12308;12304:15;12296:23;;12019:307;;;:::o;12332:154::-;12416:6;12411:3;12406;12393:30;12478:1;12469:6;12464:3;12460:16;12453:27;12332:154;;;:::o;12492:410::-;12569:5;12594:65;12610:48;12651:6;12610:48;:::i;:::-;12594:65;:::i;:::-;12585:74;;12682:6;12675:5;12668:21;12720:4;12713:5;12709:16;12758:3;12749:6;12744:3;12740:16;12737:25;12734:112;;;12765:79;;:::i;:::-;12734:112;12855:41;12889:6;12884:3;12879;12855:41;:::i;:::-;12575:327;12492:410;;;;;:::o;12921:338::-;12976:5;13025:3;13018:4;13010:6;13006:17;13002:27;12992:122;;13033:79;;:::i;:::-;12992:122;13150:6;13137:20;13175:78;13249:3;13241:6;13234:4;13226:6;13222:17;13175:78;:::i;:::-;13166:87;;12982:277;12921:338;;;;:::o;13265:943::-;13360:6;13368;13376;13384;13433:3;13421:9;13412:7;13408:23;13404:33;13401:120;;;13440:79;;:::i;:::-;13401:120;13560:1;13585:53;13630:7;13621:6;13610:9;13606:22;13585:53;:::i;:::-;13575:63;;13531:117;13687:2;13713:53;13758:7;13749:6;13738:9;13734:22;13713:53;:::i;:::-;13703:63;;13658:118;13815:2;13841:53;13886:7;13877:6;13866:9;13862:22;13841:53;:::i;:::-;13831:63;;13786:118;13971:2;13960:9;13956:18;13943:32;14002:18;13994:6;13991:30;13988:117;;;14024:79;;:::i;:::-;13988:117;14129:62;14183:7;14174:6;14163:9;14159:22;14129:62;:::i;:::-;14119:72;;13914:287;13265:943;;;;;;;:::o;14214:559::-;14300:6;14308;14357:2;14345:9;14336:7;14332:23;14328:32;14325:119;;;14363:79;;:::i;:::-;14325:119;14511:1;14500:9;14496:17;14483:31;14541:18;14533:6;14530:30;14527:117;;;14563:79;;:::i;:::-;14527:117;14676:80;14748:7;14739:6;14728:9;14724:22;14676:80;:::i;:::-;14658:98;;;;14454:312;14214:559;;;;;:::o;14779:474::-;14847:6;14855;14904:2;14892:9;14883:7;14879:23;14875:32;14872:119;;;14910:79;;:::i;:::-;14872:119;15030:1;15055:53;15100:7;15091:6;15080:9;15076:22;15055:53;:::i;:::-;15045:63;;15001:117;15157:2;15183:53;15228:7;15219:6;15208:9;15204:22;15183:53;:::i;:::-;15173:63;;15128:118;14779:474;;;;;:::o;15259:182::-;15399:34;15395:1;15387:6;15383:14;15376:58;15259:182;:::o;15447:366::-;15589:3;15610:67;15674:2;15669:3;15610:67;:::i;:::-;15603:74;;15686:93;15775:3;15686:93;:::i;:::-;15804:2;15799:3;15795:12;15788:19;;15447:366;;;:::o;15819:419::-;15985:4;16023:2;16012:9;16008:18;16000:26;;16072:9;16066:4;16062:20;16058:1;16047:9;16043:17;16036:47;16100:131;16226:4;16100:131;:::i;:::-;16092:139;;15819:419;;;:::o;16244:180::-;16292:77;16289:1;16282:88;16389:4;16386:1;16379:15;16413:4;16410:1;16403:15;16430:320;16474:6;16511:1;16505:4;16501:12;16491:22;;16558:1;16552:4;16548:12;16579:18;16569:81;;16635:4;16627:6;16623:17;16613:27;;16569:81;16697:2;16689:6;16686:14;16666:18;16663:38;16660:84;;16716:18;;:::i;:::-;16660:84;16481:269;16430:320;;;:::o;16756:231::-;16896:34;16892:1;16884:6;16880:14;16873:58;16965:14;16960:2;16952:6;16948:15;16941:39;16756:231;:::o;16993:366::-;17135:3;17156:67;17220:2;17215:3;17156:67;:::i;:::-;17149:74;;17232:93;17321:3;17232:93;:::i;:::-;17350:2;17345:3;17341:12;17334:19;;16993:366;;;:::o;17365:419::-;17531:4;17569:2;17558:9;17554:18;17546:26;;17618:9;17612:4;17608:20;17604:1;17593:9;17589:17;17582:47;17646:131;17772:4;17646:131;:::i;:::-;17638:139;;17365:419;;;:::o;17790:220::-;17930:34;17926:1;17918:6;17914:14;17907:58;17999:3;17994:2;17986:6;17982:15;17975:28;17790:220;:::o;18016:366::-;18158:3;18179:67;18243:2;18238:3;18179:67;:::i;:::-;18172:74;;18255:93;18344:3;18255:93;:::i;:::-;18373:2;18368:3;18364:12;18357:19;;18016:366;;;:::o;18388:419::-;18554:4;18592:2;18581:9;18577:18;18569:26;;18641:9;18635:4;18631:20;18627:1;18616:9;18612:17;18605:47;18669:131;18795:4;18669:131;:::i;:::-;18661:139;;18388:419;;;:::o;18813:243::-;18953:34;18949:1;18941:6;18937:14;18930:58;19022:26;19017:2;19009:6;19005:15;18998:51;18813:243;:::o;19062:366::-;19204:3;19225:67;19289:2;19284:3;19225:67;:::i;:::-;19218:74;;19301:93;19390:3;19301:93;:::i;:::-;19419:2;19414:3;19410:12;19403:19;;19062:366;;;:::o;19434:419::-;19600:4;19638:2;19627:9;19623:18;19615:26;;19687:9;19681:4;19677:20;19673:1;19662:9;19658:17;19651:47;19715:131;19841:4;19715:131;:::i;:::-;19707:139;;19434:419;;;:::o;19859:236::-;19999:34;19995:1;19987:6;19983:14;19976:58;20068:19;20063:2;20055:6;20051:15;20044:44;19859:236;:::o;20101:366::-;20243:3;20264:67;20328:2;20323:3;20264:67;:::i;:::-;20257:74;;20340:93;20429:3;20340:93;:::i;:::-;20458:2;20453:3;20449:12;20442:19;;20101:366;;;:::o;20473:419::-;20639:4;20677:2;20666:9;20662:18;20654:26;;20726:9;20720:4;20716:20;20712:1;20701:9;20697:17;20690:47;20754:131;20880:4;20754:131;:::i;:::-;20746:139;;20473:419;;;:::o;20898:170::-;21038:22;21034:1;21026:6;21022:14;21015:46;20898:170;:::o;21074:366::-;21216:3;21237:67;21301:2;21296:3;21237:67;:::i;:::-;21230:74;;21313:93;21402:3;21313:93;:::i;:::-;21431:2;21426:3;21422:12;21415:19;;21074:366;;;:::o;21446:419::-;21612:4;21650:2;21639:9;21635:18;21627:26;;21699:9;21693:4;21689:20;21685:1;21674:9;21670:17;21663:47;21727:131;21853:4;21727:131;:::i;:::-;21719:139;;21446:419;;;:::o;21871:180::-;21919:77;21916:1;21909:88;22016:4;22013:1;22006:15;22040:4;22037:1;22030:15;22057:180;22105:77;22102:1;22095:88;22202:4;22199:1;22192:15;22226:4;22223:1;22216:15;22243:233;22282:3;22305:24;22323:5;22305:24;:::i;:::-;22296:33;;22351:66;22344:5;22341:77;22338:103;;22421:18;;:::i;:::-;22338:103;22468:1;22461:5;22457:13;22450:20;;22243:233;;;:::o;22482:228::-;22622:34;22618:1;22610:6;22606:14;22599:58;22691:11;22686:2;22678:6;22674:15;22667:36;22482:228;:::o;22716:366::-;22858:3;22879:67;22943:2;22938:3;22879:67;:::i;:::-;22872:74;;22955:93;23044:3;22955:93;:::i;:::-;23073:2;23068:3;23064:12;23057:19;;22716:366;;;:::o;23088:419::-;23254:4;23292:2;23281:9;23277:18;23269:26;;23341:9;23335:4;23331:20;23327:1;23316:9;23312:17;23305:47;23369:131;23495:4;23369:131;:::i;:::-;23361:139;;23088:419;;;:::o;23513:229::-;23653:34;23649:1;23641:6;23637:14;23630:58;23722:12;23717:2;23709:6;23705:15;23698:37;23513:229;:::o;23748:366::-;23890:3;23911:67;23975:2;23970:3;23911:67;:::i;:::-;23904:74;;23987:93;24076:3;23987:93;:::i;:::-;24105:2;24100:3;24096:12;24089:19;;23748:366;;;:::o;24120:419::-;24286:4;24324:2;24313:9;24309:18;24301:26;;24373:9;24367:4;24363:20;24359:1;24348:9;24344:17;24337:47;24401:131;24527:4;24401:131;:::i;:::-;24393:139;;24120:419;;;:::o;24545:234::-;24685:34;24681:1;24673:6;24669:14;24662:58;24754:17;24749:2;24741:6;24737:15;24730:42;24545:234;:::o;24785:366::-;24927:3;24948:67;25012:2;25007:3;24948:67;:::i;:::-;24941:74;;25024:93;25113:3;25024:93;:::i;:::-;25142:2;25137:3;25133:12;25126:19;;24785:366;;;:::o;25157:419::-;25323:4;25361:2;25350:9;25346:18;25338:26;;25410:9;25404:4;25400:20;25396:1;25385:9;25381:17;25374:47;25438:131;25564:4;25438:131;:::i;:::-;25430:139;;25157:419;;;:::o;25582:305::-;25622:3;25641:20;25659:1;25641:20;:::i;:::-;25636:25;;25675:20;25693:1;25675:20;:::i;:::-;25670:25;;25829:1;25761:66;25757:74;25754:1;25751:81;25748:107;;;25835:18;;:::i;:::-;25748:107;25879:1;25876;25872:9;25865:16;;25582:305;;;;:::o;25893:191::-;25933:4;25953:20;25971:1;25953:20;:::i;:::-;25948:25;;25987:20;26005:1;25987:20;:::i;:::-;25982:25;;26026:1;26023;26020:8;26017:34;;;26031:18;;:::i;:::-;26017:34;26076:1;26073;26069:9;26061:17;;25893:191;;;;:::o;26090:178::-;26230:30;26226:1;26218:6;26214:14;26207:54;26090:178;:::o;26274:366::-;26416:3;26437:67;26501:2;26496:3;26437:67;:::i;:::-;26430:74;;26513:93;26602:3;26513:93;:::i;:::-;26631:2;26626:3;26622:12;26615:19;;26274:366;;;:::o;26646:419::-;26812:4;26850:2;26839:9;26835:18;26827:26;;26899:9;26893:4;26889:20;26885:1;26874:9;26870:17;26863:47;26927:131;27053:4;26927:131;:::i;:::-;26919:139;;26646:419;;;:::o;27071:225::-;27211:34;27207:1;27199:6;27195:14;27188:58;27280:8;27275:2;27267:6;27263:15;27256:33;27071:225;:::o;27302:366::-;27444:3;27465:67;27529:2;27524:3;27465:67;:::i;:::-;27458:74;;27541:93;27630:3;27541:93;:::i;:::-;27659:2;27654:3;27650:12;27643:19;;27302:366;;;:::o;27674:419::-;27840:4;27878:2;27867:9;27863:18;27855:26;;27927:9;27921:4;27917:20;27913:1;27902:9;27898:17;27891:47;27955:131;28081:4;27955:131;:::i;:::-;27947:139;;27674:419;;;:::o;28099:143::-;28156:5;28187:6;28181:13;28172:22;;28203:33;28230:5;28203:33;:::i;:::-;28099:143;;;;:::o;28248:351::-;28318:6;28367:2;28355:9;28346:7;28342:23;28338:32;28335:119;;;28373:79;;:::i;:::-;28335:119;28493:1;28518:64;28574:7;28565:6;28554:9;28550:22;28518:64;:::i;:::-;28508:74;;28464:128;28248:351;;;;:::o;28605:231::-;28745:34;28741:1;28733:6;28729:14;28722:58;28814:14;28809:2;28801:6;28797:15;28790:39;28605:231;:::o;28842:366::-;28984:3;29005:67;29069:2;29064:3;29005:67;:::i;:::-;28998:74;;29081:93;29170:3;29081:93;:::i;:::-;29199:2;29194:3;29190:12;29183:19;;28842:366;;;:::o;29214:419::-;29380:4;29418:2;29407:9;29403:18;29395:26;;29467:9;29461:4;29457:20;29453:1;29442:9;29438:17;29431:47;29495:131;29621:4;29495:131;:::i;:::-;29487:139;;29214:419;;;:::o;29639:228::-;29779:34;29775:1;29767:6;29763:14;29756:58;29848:11;29843:2;29835:6;29831:15;29824:36;29639:228;:::o;29873:366::-;30015:3;30036:67;30100:2;30095:3;30036:67;:::i;:::-;30029:74;;30112:93;30201:3;30112:93;:::i;:::-;30230:2;30225:3;30221:12;30214:19;;29873:366;;;:::o;30245:419::-;30411:4;30449:2;30438:9;30434:18;30426:26;;30498:9;30492:4;30488:20;30484:1;30473:9;30469:17;30462:47;30526:131;30652:4;30526:131;:::i;:::-;30518:139;;30245:419;;;:::o;30670:223::-;30810:34;30806:1;30798:6;30794:14;30787:58;30879:6;30874:2;30866:6;30862:15;30855:31;30670:223;:::o;30899:366::-;31041:3;31062:67;31126:2;31121:3;31062:67;:::i;:::-;31055:74;;31138:93;31227:3;31138:93;:::i;:::-;31256:2;31251:3;31247:12;31240:19;;30899:366;;;:::o;31271:419::-;31437:4;31475:2;31464:9;31460:18;31452:26;;31524:9;31518:4;31514:20;31510:1;31499:9;31495:17;31488:47;31552:131;31678:4;31552:131;:::i;:::-;31544:139;;31271:419;;;:::o;31696:173::-;31836:25;31832:1;31824:6;31820:14;31813:49;31696:173;:::o;31875:366::-;32017:3;32038:67;32102:2;32097:3;32038:67;:::i;:::-;32031:74;;32114:93;32203:3;32114:93;:::i;:::-;32232:2;32227:3;32223:12;32216:19;;31875:366;;;:::o;32247:419::-;32413:4;32451:2;32440:9;32436:18;32428:26;;32500:9;32494:4;32490:20;32486:1;32475:9;32471:17;32464:47;32528:131;32654:4;32528:131;:::i;:::-;32520:139;;32247:419;;;:::o;32672:175::-;32812:27;32808:1;32800:6;32796:14;32789:51;32672:175;:::o;32853:366::-;32995:3;33016:67;33080:2;33075:3;33016:67;:::i;:::-;33009:74;;33092:93;33181:3;33092:93;:::i;:::-;33210:2;33205:3;33201:12;33194:19;;32853:366;;;:::o;33225:419::-;33391:4;33429:2;33418:9;33414:18;33406:26;;33478:9;33472:4;33468:20;33464:1;33453:9;33449:17;33442:47;33506:131;33632:4;33506:131;:::i;:::-;33498:139;;33225:419;;;:::o;33650:237::-;33790:34;33786:1;33778:6;33774:14;33767:58;33859:20;33854:2;33846:6;33842:15;33835:45;33650:237;:::o;33893:366::-;34035:3;34056:67;34120:2;34115:3;34056:67;:::i;:::-;34049:74;;34132:93;34221:3;34132:93;:::i;:::-;34250:2;34245:3;34241:12;34234:19;;33893:366;;;:::o;34265:419::-;34431:4;34469:2;34458:9;34454:18;34446:26;;34518:9;34512:4;34508:20;34504:1;34493:9;34489:17;34482:47;34546:131;34672:4;34546:131;:::i;:::-;34538:139;;34265:419;;;:::o;34690:98::-;34741:6;34775:5;34769:12;34759:22;;34690:98;;;:::o;34794:168::-;34877:11;34911:6;34906:3;34899:19;34951:4;34946:3;34942:14;34927:29;;34794:168;;;;:::o;34968:360::-;35054:3;35082:38;35114:5;35082:38;:::i;:::-;35136:70;35199:6;35194:3;35136:70;:::i;:::-;35129:77;;35215:52;35260:6;35255:3;35248:4;35241:5;35237:16;35215:52;:::i;:::-;35292:29;35314:6;35292:29;:::i;:::-;35287:3;35283:39;35276:46;;35058:270;34968:360;;;;:::o;35334:640::-;35529:4;35567:3;35556:9;35552:19;35544:27;;35581:71;35649:1;35638:9;35634:17;35625:6;35581:71;:::i;:::-;35662:72;35730:2;35719:9;35715:18;35706:6;35662:72;:::i;:::-;35744;35812:2;35801:9;35797:18;35788:6;35744:72;:::i;:::-;35863:9;35857:4;35853:20;35848:2;35837:9;35833:18;35826:48;35891:76;35962:4;35953:6;35891:76;:::i;:::-;35883:84;;35334:640;;;;;;;:::o;35980:141::-;36036:5;36067:6;36061:13;36052:22;;36083:32;36109:5;36083:32;:::i;:::-;35980:141;;;;:::o;36127:349::-;36196:6;36245:2;36233:9;36224:7;36220:23;36216:32;36213:119;;;36251:79;;:::i;:::-;36213:119;36371:1;36396:63;36451:7;36442:6;36431:9;36427:22;36396:63;:::i;:::-;36386:73;;36342:127;36127:349;;;;:::o

Swarm Source

ipfs://eb80bbfe6701c93af666e89eab3779c2be2f2f77cc4e61541842c4311cb0e64c
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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