ETH Price: $2,970.22 (+3.67%)
Gas: 2 Gwei

Token

Tavi (TAVI)
 

Overview

Max Total Supply

13 TAVI

Holders

6

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
6 TAVI
0x72bf16640e440d3ed2bf6b4abc4f47ee1e66b0a6
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:
Tavi

Compiler Version
v0.8.15+commit.e14f2714

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 17 of 17: Tavi.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.15;

// This is an NFT for Tavi https://twitter.com/
// Smart contract developed by Ian Cherkowski https://twitter.com/IanCherkowski
//

import "./ERC721A.sol";
import "./Ownable.sol";
import "./IERC20.sol";
import "./ReentrancyGuard.sol";
import "./PaymentSplitter.sol";
import "./ERC2981.sol";

contract Tavi is
    ERC721A,
    ReentrancyGuard,
    PaymentSplitter,
    Ownable,
    ERC2981
{
    string private constant _name = "Tavi";
    string private constant _symbol = "TAVI";
    string public baseURI = "https://ipfs.io/ipfs/QmPnbNRjn4bSL7rsuiX8hAvkwd8CKjB7jZYzcvRXNuDTWk/";
    uint256 public maxMint = 20;
    uint256 public cost = 0.09 ether;
    uint256 public maxSupply = 5000;
    bool public freezeURI = false;
    bool public freezeSupply = false;
	bool public paused = true;
    mapping(uint256 => bool) private tokenToIsStaked;

    address[] private firstPayees = [0xC740B55610D064F74FE16dbD60DE25da0858D973, 0x8451675BBb43B7a9eA9FC5436AD5fe6474222511, 0x28C2F904BA8e26f8D1638d71455FC0a114d72047];
    uint16[] private firstShares = [50, 40, 10];

    constructor() ERC721A(_name, _symbol) PaymentSplitter(firstPayees, firstShares) payable {
        _setDefaultRoyalty(address(this), 500);
    }

    //added so that code support royalties
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

	// @dev owner can mint to a list of addresses with the quantity entered
	function gift(address[] calldata recipients, uint256[] calldata amounts) external onlyOwner {
        uint256 numTokens = 0;
        uint256 i;
        
        require(recipients.length == amounts.length, "Color: The number of addresses is not matching the number of amounts");

        unchecked{
            //find total to be minted
            for (i = 0; i < recipients.length; i++) {
                require(Address.isContract(recipients[i]) == false, "Color: no contracts");
                numTokens += amounts[i];
            }

            require(totalSupply() + numTokens <= maxSupply, "Color: Can't mint more than the max supply");

            //mint to the list
            for (i = 0; i < amounts.length; i++) {
                _safeMint(recipients[i], amounts[i]);
            }
        }
	}

    // @dev public minting
	function mint(address _to, uint256 _mintAmount) external payable nonReentrant {
        uint256 supply = totalSupply();

        require(Address.isContract(msg.sender) == false, "Color: no contracts");
        require(Address.isContract(_to) == false, "Color: no contracts");
        require(paused == false, "Color: Minting not started yet");
        require(_mintAmount > 0, "Color: Cant mint 0");
        require(_mintAmount <= maxMint, "Color: Must mint less than the max");
        require(supply + _mintAmount <= maxSupply, "Color: Cant mint more than max supply");
        require(msg.value >= cost * _mintAmount, "Color: Must send eth of cost per nft");
        
        _safeMint(_to, _mintAmount);
	}

    //@dev prevent transfer of staked id
    function _beforeTokenTransfers(address /*from*/, address /*to*/, uint256 startTokenId, uint256 /*quantity*/) internal virtual override {
        require(tokenToIsStaked[startTokenId] == false, "Color: Cannot transfer - currently locked");
    }

    /**
     *  @dev returns whether a token is currently staked
     */
    function isStaked(uint256 tokenId) public view returns (bool) {
        return tokenToIsStaked[tokenId];
    }

    /**
     *  @dev marks a token as staked, calling this function
     *  you disable the ability to transfer the token.
     */
    function stake(uint256 tokenId) external nonReentrant {
        require(msg.sender == ownerOf(tokenId), "Color: caller is not the owner");
        tokenToIsStaked[tokenId] = true;
    }

    /**
     *  @dev marks a token as unstaked. By calling this function
     *  you re-enable the ability to transfer the token.
     */
    function unstake(uint256 tokenId) external nonReentrant {
        require(msg.sender == ownerOf(tokenId), "Color: caller is not the owner");
        tokenToIsStaked[tokenId] = false;
    }

    // @dev set cost of minting
	function setCost(uint256 _newCost) external onlyOwner {
    	cost = _newCost;
	}
		
    // @dev max mint amount per transaction
    function setMaxMint(uint256 _newMaxMintAmount) external onlyOwner {
	    maxMint = _newMaxMintAmount;
	}

    // @dev unpause main minting stage
	function setPaused(bool _status) external onlyOwner {
    	paused = _status;
	}
	
    // @dev Set the base url path to the metadata used by opensea
    function setBaseURI(string memory _baseTokenURI) external onlyOwner {
        require(freezeURI == false, "Color: uri is frozen");
        baseURI = _baseTokenURI;
    }

    // @dev freeze the URI
    function setFreezeURI() external onlyOwner {
        freezeURI = true;
    }

    // @dev show the baseuri
    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }

    // @dev freeze the total supply to be done at some point in the future
    function FreezeSupply() external onlyOwner {
        freezeSupply = true;
    }

    // @dev can be used to reduce the max supply if needed
    function reduceMaxSupply(uint16 newMax) external onlyOwner {
        require(freezeSupply == false, "Color: Max supply is frozen");
        require(newMax < maxSupply, "Color: New maximum must be less than existing maximum");
        require(newMax >= totalSupply(), "Color: New maximum can't be less than minted count");
        maxSupply = newMax;
    }

    // @dev Add payee for payment splitter
    function addPayee(address account, uint16 shares_) external onlyOwner {
        _addPayee(account, shares_);
    }

    // @dev Set the number of shares for payment splitter
    function setShares(address account, uint16 shares_) external onlyOwner {
        _setShares(account, shares_);
    }

    // @dev add tokens that are used by payment splitter
    function addToken(address account) external onlyOwner {
        _addToken(account);
    }

    // @dev release payments to one payee
    function release(address payable account) external nonReentrant {
        require(Address.isContract(account) == false, "Color: no contracts");
        _release(account);
    }

    // @dev release ERC20 tokens due to a payee
    function releaseToken(IERC20 token, address payable account) external nonReentrant {
        require(Address.isContract(account) == false, "Color: no contracts");
        _releaseToken(token, account);
    }

    // @dev anyone can run withdraw which will send all payments
    function withdraw() external nonReentrant {
        _withdraw();
    }

    /**
     * @dev External onlyOwner version of {ERC2981-_setDefaultRoyalty}.
     * sets the receiver of royalties and the fee
     */
    function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyOwner {
        _setDefaultRoyalty(receiver, feeNumerator);
    }
}

File 1 of 17: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity 0.8.15;

/**
 * @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);
            }
        }
    }
}

File 2 of 17: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity 0.8.15;

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

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

File 3 of 17: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity 0.8.15;

import "./IERC165.sol";

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

File 4 of 17: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)

pragma solidity 0.8.15;

import "./IERC2981.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 5 of 17: ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs
//https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol

pragma solidity 0.8.15;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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 of tokenId storing its staked status
    //mapping(uint256 => bool) public tokenToIsStaked;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 1;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {
        //only check the 1st id because transfer and burn use quantity 1
        //require(tokenToIsStaked[startTokenId] == false, "Cannot transfer - currently locked");
    }

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 6 of 17: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity 0.8.15;

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

File 7 of 17: IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity 0.8.15;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

File 8 of 17: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)

pragma solidity 0.8.15;

import "./IERC165.sol";

/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 9 of 17: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity 0.8.15;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 17: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity 0.8.15;

import "./IERC721.sol";

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

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

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

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

pragma solidity 0.8.15;

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

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

pragma solidity 0.8.15;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 13 of 17: PaymentSplitter.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (finance/PaymentSplitter.sol)

pragma solidity 0.8.15;

import "./SafeERC20.sol";
import "./Address.sol";
import "./Context.sol";

/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 *
 * NOTE: This contract assumes that ERC20 tokens will behave similarly to native tokens (Ether). Rebasing tokens, and
 * tokens that apply fees during transfers, are likely to not be supported as expected. If in doubt, we encourage you
 * to run tests before sending real value to this contract.
 * 
 * Changes were made to code as client needs to change shares in the future. Also made it easier to manage withdrawls.
 */

contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint16 shares);
    event PaymentReleased(address to, uint256 amount);
    event ERC20PaymentReleased(IERC20 indexed token, address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;
    address[] private _payees;
    IERC20[] private _tokenList;
    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    mapping(IERC20 => uint256) private _erc20TotalReleased;
    mapping(IERC20 => mapping(address => uint256)) private _erc20Released;


    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint16[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint16 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
        //Can add tokens eg wrapped ETH
        //_addToken(0x7ceB23fD6bC0adD59E62ac25578270cFf1b9f619);
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the total amount of `token` already released. `token` should be the address of an IERC20
     * contract.
     */
    function totalReleasedToken(IERC20 token) public view returns (uint256) {
        return _erc20TotalReleased[token];
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the amount of `token` tokens already released to a payee. `token` should be the address of an
     * IERC20 contract.
     */
    function releasedToken(IERC20 token, address account) public view returns (uint256) {
        return _erc20Released[token][account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function _release(address payable account) internal virtual {
        uint256 totalReceived = address(this).balance + totalReleased();
        uint256 payment = _pendingPayment(account, totalReceived, released(account));
 
        //in case calculation is wrong then give remaining balance
        if (payment > address(this).balance) {
            payment = address(this).balance;
        }

        if (payment > 0) {
            _released[account] += payment;
            _totalReleased += payment;

            Address.sendValue(account, payment);
            emit PaymentReleased(account, payment);
        }
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of `token` tokens they are owed, according to their
     * percentage of the total shares and their previous withdrawals. `token` must be the address of an IERC20
     * contract.
     */
    function _releaseToken(IERC20 token, address payable account) internal virtual {
        uint256 totalReceived = token.balanceOf(address(this)) + totalReleasedToken(token);
        uint256 payment = _pendingPayment(account, totalReceived, releasedToken(token, account));

        //in case calculation is wrong then give remaining balance
        if (payment > token.balanceOf(address(this))) {
            payment = token.balanceOf(address(this));
        }

        if (payment > 0) {
            _erc20Released[token][account] += payment;
            _erc20TotalReleased[token] += payment;

            SafeERC20.safeTransfer(token, account, payment);
            emit ERC20PaymentReleased(token, account, payment);
        }
    }

    /**
     * @dev internal logic for computing the pending payment of an `account` given the token historical balances and
     * already released amounts.
     */
    function _pendingPayment(
        address account,
        uint256 totalReceived,
        uint256 alreadyReleased
    ) private view returns (uint256) {
        uint256 _pending;
        if (_totalShares == 0) {
            _pending = 0;
        } else {
            _pending = (totalReceived * _shares[account]) / _totalShares - alreadyReleased;
        }
        return _pending;
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint16 shares_) internal virtual {
        uint256 i;
        uint256 j;

        require(Address.isContract(account) == false, "PaymentSplitter: no contracts");

        //prevent duplicates as can be run after contract deployed
        uint payeeExists;
        for (i = 0; i < _payees.length; i++) {
            if (_payees[i] == account) {
                payeeExists = 1;
            }
        }

        //if new payee then add
        if (payeeExists == 0) {
            //make pay outs and reset values so next payout is correct
            if (shares_ > 0) {
                _withdraw();
                _totalReleased = 0;
                for (i = 0; i < _payees.length; i++) {
                    _released[_payees[i]] = 0;
                }

                //for each token
                for (j = 0; j < _tokenList.length; j++) {
                    IERC20 token = _tokenList[j];
                    _erc20TotalReleased[token] = 0;            
                    for (i = 0; i < _payees.length; i++) {
                        _erc20Released[token][_payees[i]] = 0;
                    }
                }
            }

            _payees.push(account);
            _shares[account] = shares_;
            _totalShares = _totalShares + shares_;
            emit PayeeAdded(account, shares_);
        }
    }

    // @dev set shares of payout account
    function _setShares(address account, uint256 shares_) internal virtual {
        uint256 i;
        uint256 j;
        uint256 pendingTotal;

        //make sure payee exists
        uint payeeExists = 0;
        for (i = 0; i < _payees.length; i++) {
            if (_payees[i] == account) {
                payeeExists = 1;
            }
        }
        require(payeeExists == 1, "PaymentSplitter: payee does not exist, add payee first");

        pendingTotal = _totalShares - _shares[account] + shares_;
        require(pendingTotal > 0, "PaymentSplitter: total shares must be greater than 0");

        //make pay outs and reset values so next payout is correct
        _withdraw();
        _totalReleased = 0;
        for (i = 0; i < _payees.length; i++) {
            _released[_payees[i]] = 0;
        }

        //for each token
        for (j = 0; j < _tokenList.length; j++) {
            IERC20 token = _tokenList[j];
            _erc20TotalReleased[token] = 0;            
            for (i = 0; i < _payees.length; i++) {
                _erc20Released[token][_payees[i]] = 0;
            }
        }

        _totalShares = pendingTotal;
        _shares[account] = shares_;
    }

    // @dev add erc20 token address to the list
    function _addToken(address token) internal virtual {
        require(Address.isContract(token) == true, "PaymentSplitter: must be a contract");

        //test if token exists
        IERC20(token).balanceOf(address(this));

        //prevent duplicates as can be run after contract deployed
        uint tokenExists = 0;
        for (uint256 i = 0; i < _tokenList.length; i++) {
            if (_tokenList[i] == IERC20(token)) {
                tokenExists = 1;
            }
        }
        require(tokenExists == 0, "PaymentSplitter: token already added");

        _tokenList.push(IERC20(token));
    }

    // @dev show list of erc20 tokens added in payment splitter
    function showTokens() public view returns (IERC20[] memory) {
        return _tokenList;
    }

    // @dev show list of payees added in payment splitter
    function showPayees() public view returns (address[] memory) {
        return _payees;
    }

    // @dev releases payments for all payees for ETH and all tokens
    function _withdraw() internal virtual {
        //for each payee
        for (uint256 i = 0; i < _payees.length; i++) {

            //for each token
            for (uint256 j = 0; j < _tokenList.length; j++) {
                IERC20 token = _tokenList[j];
                _releaseToken(token, payable(_payees[i]));
            }

            _release(payable(_payees[i]));
        }
    }
}

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

pragma solidity 0.8.15;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 15 of 17: SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity 0.8.15;

import "./IERC20.sol";
import "./Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

File 16 of 17: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity 0.8.15;

/**
 * @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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":"contract IERC20","name":"token","type":"address"},{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint16","name":"shares","type":"uint16"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","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":[],"name":"FreezeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16","name":"shares_","type":"uint16"}],"name":"addPayee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeSupply","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeURI","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"gift","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"isStaked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMax","type":"uint16"}],"name":"reduceMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address payable","name":"account","type":"address"}],"name":"releaseToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"address","name":"account","type":"address"}],"name":"releasedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setFreezeURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMintAmount","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint16","name":"shares_","type":"uint16"}],"name":"setShares","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"showPayees","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"showTokens","outputs":[{"internalType":"contract IERC20[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"stake","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":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"totalReleasedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610100604052604460808181529062005ab560a03960149062000023908262001203565b50601460155567013fbe85edc900006016556113886017556018805462ffffff1916620100001790556040805160608101825273c740b55610d064f74fe16dbd60de25da0858d9738152738451675bbb43b7a9ea9fc5436ad5fe647422251160208201527328c2f904ba8e26f8d1638d71455fc0a114d7204791810191909152620000b390601a90600362001039565b50604080516060810182526032815260286020820152600a91810191909152620000e290601b906003620010a3565b50601a8054806020026020016040519081016040528092919081815260200182805480156200013b57602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116200011c575b5050505050601b805480602002602001604051908101604052809291908181526020018280548015620001b657602002820191906000526020600020906000905b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116200017c5790505b5050505050604051806040016040528060048152602001635461766960e01b815250604051806040016040528060048152602001635441564960e01b815250816002908162000206919062001203565b50600362000215828262001203565b506001600055505060016008558051825114620002945760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b6000825111620002e75760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f2070617965657300000000000060448201526064016200028b565b60005b82518161ffff1610156200035f576200034a838261ffff1681518110620003155762000315620012cf565b6020026020010151838361ffff1681518110620003365762000336620012cf565b60200260200101516200039060201b60201c565b806200035681620012fb565b915050620002ea565b5050506200037c620003766200068660201b60201c565b6200068a565b6200038a306101f4620006dc565b62001475565b600080620003a984620007dd60201b620018c81760201c565b15620003f85760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a206e6f20636f6e74726163747300000060448201526064016200028b565b60008092505b600b548310156200045d57846001600160a01b0316600b8481548110620004295762000429620012cf565b6000918252602090912001546001600160a01b03160362000448575060015b8262000454816200131f565b935050620003fe565b806000036200067f5761ffff841615620005c7576200047b620007e3565b6000600a81905592505b600b54831015620004e6576000600e6000600b8681548110620004ac57620004ac620012cf565b60009182526020808320909101546001600160a01b0316835282019290925260400190205582620004dd816200131f565b93505062000485565b600091505b600c54821015620005c7576000600c83815481106200050e576200050e620012cf565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590945090505b600b54841015620005b1576001600160a01b0381166000908152601060205260408120600b805483919088908110620005775762000577620012cf565b60009182526020808320909101546001600160a01b0316835282019290925260400190205583620005a8816200131f565b9450506200053a565b5081620005be816200131f565b925050620004eb565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db90180546001600160a01b0319166001600160a01b0387169081179091556000908152600d6020526040902061ffff8516908190556009546200063691906200133b565b600955604080516001600160a01b038716815261ffff861660208201527fefb20bd7b432b3f89ef344f5dd4dbc10c62729e41df4363592a810661c8c7ae4910160405180910390a15b5050505050565b3390565b601180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6127106001600160601b03821611156200074c5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016200028b565b6001600160a01b038216620007a45760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016200028b565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217601255565b3b151590565b60005b600b54811015620008ce5760005b600c5481101562000883576000600c8281548110620008175762000817620012cf565b9060005260206000200160009054906101000a90046001600160a01b031690506200086d81600b8581548110620008525762000852620012cf565b6000918252602090912001546001600160a01b0316620008d1565b50806200087a816200131f565b915050620007f4565b50620008b9600b82815481106200089e576200089e620012cf565b6000918252602090912001546001600160a01b031662000b61565b80620008c5816200131f565b915050620007e6565b50565b6001600160a01b0382166000908152600f60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa1580156200092f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000955919062001356565b6200096191906200133b565b90506000620009a283836200099c87836001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b62000c63565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a0823190602401602060405180830381865afa158015620009ea573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a10919062001356565b81111562000a86576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa15801562000a5d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000a83919062001356565b90505b801562000b5b576001600160a01b0380851660009081526010602090815260408083209387168352929052908120805483929062000ac69084906200133b565b90915550506001600160a01b0384166000908152600f60205260408120805483929062000af59084906200133b565b9250508190555062000b1484848362000cca60201b620021eb1760201c565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a25b50505050565b600062000b6d600a5490565b62000b7990476200133b565b9050600062000ba383836200099c826001600160a01b03166000908152600e602052604090205490565b90504781111562000bb15750475b801562000c5e576001600160a01b0383166000908152600e60205260408120805483929062000be29084906200133b565b9250508190555080600a600082825462000bfd91906200133b565b9250508190555062000c1b838262000d2260201b6200226b1760201c565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a15b505050565b60008060095460000362000c7a5750600062000cc0565b6009546001600160a01b0386166000908152600d602052604090205484919062000ca5908762001370565b62000cb1919062001392565b62000cbd9190620013b5565b90505b90505b9392505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b0390811663a9059cbb60e01b1790915262000c5e91859162000e4116565b8047101562000d745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016200028b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d806000811462000dc3576040519150601f19603f3d011682016040523d82523d6000602084013e62000dc8565b606091505b505090508062000c5e5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d6179206861766520726576657274656400000000000060648201526084016200028b565b600062000e9d826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031662000f1f60201b62002384179092919060201c565b80519091501562000c5e578080602001905181019062000ebe9190620013cf565b62000c5e5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016200028b565b606062000cc0848460008585843b62000f7b5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016200028b565b600080866001600160a01b0316858760405162000f99919062001422565b60006040518083038185875af1925050503d806000811462000fd8576040519150601f19603f3d011682016040523d82523d6000602084013e62000fdd565b606091505b50909250905062000ff082828662000ffb565b979650505050505050565b606083156200100c57508162000cc3565b8251156200101d5782518084602001fd5b8160405162461bcd60e51b81526004016200028b919062001440565b82805482825590600052602060002090810192821562001091579160200282015b828111156200109157825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906200105a565b506200109f92915062001148565b5090565b82805482825590600052602060002090600f01601090048101928215620010915791602002820160005b838211156200110e57835183826101000a81548161ffff021916908360ff1602179055509260200192600201602081600101049283019260010302620010cd565b80156200113e5782816101000a81549061ffff02191690556002016020816001010492830192600103026200110e565b50506200109f9291505b5b808211156200109f576000815560010162001149565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200118a57607f821691505b602082108103620011ab57634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000c5e57600081815260208120601f850160051c81016020861015620011da5750805b601f850160051c820191505b81811015620011fb57828155600101620011e6565b505050505050565b81516001600160401b038111156200121f576200121f6200115f565b620012378162001230845462001175565b84620011b1565b602080601f8311600181146200126f5760008415620012565750858301515b600019600386901b1c1916600185901b178555620011fb565b600085815260208120601f198616915b82811015620012a0578886015182559484019460019091019084016200127f565b5085821015620012bf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600061ffff808316818103620013155762001315620012e5565b6001019392505050565b600060018201620013345762001334620012e5565b5060010190565b60008219821115620013515762001351620012e5565b500190565b6000602082840312156200136957600080fd5b5051919050565b60008160001904831182151516156200138d576200138d620012e5565b500290565b600082620013b057634e487b7160e01b600052601260045260246000fd5b500490565b600082821015620013ca57620013ca620012e5565b500390565b600060208284031215620013e257600080fd5b8151801515811462000cc357600080fd5b60005b8381101562001410578181015183820152602001620013f6565b8381111562000b5b5750506000910152565b6000825162001436818460208701620013f3565b9190910192915050565b602081526000825180602084015262001461816040850160208701620013f3565b601f01601f19169190910160400192915050565b61463080620014856000396000f3fe60806040526004361061034e5760003560e01c80636c0360eb116101bb5780639ce8a55b116100f7578063c87b56dd11610095578063d5abeb011161006f578063d5abeb0114610a0f578063e33b7de314610a25578063e985e9c514610a3a578063f2fde38b14610a8357600080fd5b8063c87b56dd14610999578063ce7c2ac2146109b9578063d48bfca7146109ef57600080fd5b8063b440ff7a116100d1578063b440ff7a1461091a578063b88d4fde1461092f578063baa51f861461094f578063c793803c1461097f57600080fd5b80639ce8a55b146108ba578063a22cb465146108da578063a694fc3a146108fa57600080fd5b80637ec2402f1161016457806394ea82cd1161013e57806394ea82cd1461083a57806395d89b411461084f5780639852595c1461086457806398fa6c451461089a57600080fd5b80637ec2402f146107dd5780638b83209b146107fc5780638da5cb5b1461081c57600080fd5b80637501f741116101955780637501f741146107875780637705f9b51461079d578063796a6996146107bd57600080fd5b80636c0360eb1461073d57806370a0823114610752578063715018a61461077257600080fd5b80632a55205a1161028a57806344a0d68a11610233578063547520fe1161020d578063547520fe146106bd57806355f804b3146106dd5780635c975abb146106fd5780636352211e1461071d57600080fd5b806344a0d68a146106375780634ac7ef12146106575780634f37cad81461067757600080fd5b80633ccfd60b116102645780633ccfd60b146105ef57806340c10f191461060457806342842e0e1461061757600080fd5b80632a55205a1461057b5780632e17de78146105ba5780633a98ef39146105da57600080fd5b806311d4bc9a116102f757806318160ddd116102d157806318160ddd146104e8578063191655871461050557806323b872dd1461052557806324180d741461054557600080fd5b806311d4bc9a1461048f57806313faede6146104a457806316c38b3c146104c857600080fd5b8063081812fc11610328578063081812fc14610415578063095ea7b31461044d57806311164f541461046d57600080fd5b806301ffc9a71461039c57806304634d8d146103d157806306fdde03146103f357600080fd5b36610397577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103a857600080fd5b506103bc6103b7366004613df9565b610aa3565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613e2b565b610ab4565b005b3480156103ff57600080fd5b50610408610b21565b6040516103c89190613ecd565b34801561042157600080fd5b50610435610430366004613ee0565b610bb3565b6040516001600160a01b0390911681526020016103c8565b34801561045957600080fd5b506103f1610468366004613ef9565b610c10565b34801561047957600080fd5b50610482610ccf565b6040516103c89190613f25565b34801561049b57600080fd5b506103f1610d30565b3480156104b057600080fd5b506104ba60165481565b6040519081526020016103c8565b3480156104d457600080fd5b506103f16104e3366004613f80565b610d99565b3480156104f457600080fd5b5060015460005403600019016104ba565b34801561051157600080fd5b506103f1610520366004613f9d565b610e2b565b34801561053157600080fd5b506103f1610540366004613fba565b610ee2565b34801561055157600080fd5b506104ba610560366004613f9d565b6001600160a01b03166000908152600f602052604090205490565b34801561058757600080fd5b5061059b610596366004613ffb565b610eed565b604080516001600160a01b0390931683526020830191909152016103c8565b3480156105c657600080fd5b506103f16105d5366004613ee0565b610faa565b3480156105e657600080fd5b506009546104ba565b3480156105fb57600080fd5b506103f1611087565b6103f1610612366004613ef9565b6110ed565b34801561062357600080fd5b506103f1610632366004613fba565b611431565b34801561064357600080fd5b506103f1610652366004613ee0565b61144c565b34801561066357600080fd5b506103f1610672366004614034565b6114ab565b34801561068357600080fd5b506104ba610692366004614069565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b3480156106c957600080fd5b506103f16106d8366004613ee0565b611513565b3480156106e957600080fd5b506103f16106f8366004614123565b611572565b34801561070957600080fd5b506018546103bc9062010000900460ff1681565b34801561072957600080fd5b50610435610738366004613ee0565b61162b565b34801561074957600080fd5b5061040861163d565b34801561075e57600080fd5b506104ba61076d366004613f9d565b6116cb565b34801561077e57600080fd5b506103f1611733565b34801561079357600080fd5b506104ba60155481565b3480156107a957600080fd5b506103f16107b83660046141b1565b611799565b3480156107c957600080fd5b506103f16107d8366004614069565b611a2b565b3480156107e957600080fd5b506018546103bc90610100900460ff1681565b34801561080857600080fd5b50610435610817366004613ee0565b611ae4565b34801561082857600080fd5b506011546001600160a01b0316610435565b34801561084657600080fd5b50610482611b14565b34801561085b57600080fd5b50610408611b74565b34801561087057600080fd5b506104ba61087f366004613f9d565b6001600160a01b03166000908152600e602052604090205490565b3480156108a657600080fd5b506103f16108b536600461421d565b611b83565b3480156108c657600080fd5b506103f16108d5366004614034565b611d3d565b3480156108e657600080fd5b506103f16108f5366004614238565b611da1565b34801561090657600080fd5b506103f1610915366004613ee0565b611e4f565b34801561092657600080fd5b506103f1611f30565b34801561093b57600080fd5b506103f161094a366004614266565b611fb8565b34801561095b57600080fd5b506103bc61096a366004613ee0565b60009081526019602052604090205460ff1690565b34801561098b57600080fd5b506018546103bc9060ff1681565b3480156109a557600080fd5b506104086109b4366004613ee0565b612009565b3480156109c557600080fd5b506104ba6109d4366004613f9d565b6001600160a01b03166000908152600d602052604090205490565b3480156109fb57600080fd5b506103f1610a0a366004613f9d565b6120a6565b348015610a1b57600080fd5b506104ba60175481565b348015610a3157600080fd5b50600a546104ba565b348015610a4657600080fd5b506103bc610a55366004614069565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a8f57600080fd5b506103f1610a9e366004613f9d565b61210c565b6000610aae8261239b565b92915050565b6011546001600160a01b03163314610b135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610b1d82826123d9565b5050565b606060028054610b30906142e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c906142e6565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b5050505050905090565b6000610bbe826124f3565b610bf4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c1b8261162b565b9050806001600160a01b0316836001600160a01b031603610c68576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610c885750610c868133610a55565b155b15610cbf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cca83838361252c565b505050565b6060600b805480602002602001604051908101604052809291908181526020018280548015610ba957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d09575050505050905090565b6011546001600160a01b03163314610d8a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6018805460ff19166001179055565b6011546001600160a01b03163314610df35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6018805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b600260085403610e7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b6002600855803b15610ed15760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b610eda81612595565b506001600855565b610cca838383612682565b60008281526013602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610f6c5750604080518082019091526012546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610f90906bffffffffffffffffffffffff1687614336565b610f9a919061436b565b91519350909150505b9250929050565b600260085403610ffc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b600260085561100a8161162b565b6001600160a01b0316336001600160a01b03161461106a5760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e657200006044820152606401610b0a565b6000908152601960205260409020805460ff191690556001600855565b6002600854036110d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b60026008556110e66128cb565b6001600855565b60026008540361113f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b600260085560006111596001546000546000199190030190565b9050333b156111aa5760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b823b156111f95760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b60185462010000900460ff16156112525760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a204d696e74696e67206e6f7420737461727465642079657400006044820152606401610b0a565b600082116112a25760405162461bcd60e51b815260206004820152601260248201527f436f6c6f723a2043616e74206d696e74203000000000000000000000000000006044820152606401610b0a565b60155482111561131a5760405162461bcd60e51b815260206004820152602260248201527f436f6c6f723a204d757374206d696e74206c657373207468616e20746865206d60448201527f61780000000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b601754611327838361437f565b111561139b5760405162461bcd60e51b815260206004820152602560248201527f436f6c6f723a2043616e74206d696e74206d6f7265207468616e206d6178207360448201527f7570706c790000000000000000000000000000000000000000000000000000006064820152608401610b0a565b816016546113a99190614336565b34101561141d5760405162461bcd60e51b8152602060048201526024808201527f436f6c6f723a204d7573742073656e6420657468206f6620636f73742070657260448201527f206e6674000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b61142783836129a1565b5050600160085550565b610cca83838360405180602001604052806000815250611fb8565b6011546001600160a01b031633146114a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601655565b6011546001600160a01b031633146115055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b610b1d828261ffff166129bb565b6011546001600160a01b0316331461156d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601555565b6011546001600160a01b031633146115cc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b60185460ff161561161f5760405162461bcd60e51b815260206004820152601460248201527f436f6c6f723a207572692069732066726f7a656e0000000000000000000000006044820152606401610b0a565b6014610b1d82826143dd565b600061163682612c98565b5192915050565b6014805461164a906142e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611676906142e6565b80156116c35780601f10611698576101008083540402835291602001916116c3565b820191906000526020600020905b8154815290600101906020018083116116a657829003601f168201915b505050505081565b60006001600160a01b03821661170d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6011546001600160a01b0316331461178d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6117976000612dda565b565b6011546001600160a01b031633146117f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6000808483146118925760405162461bcd60e51b8152602060048201526044602482018190527f436f6c6f723a20546865206e756d626572206f66206164647265737365732069908201527f73206e6f74206d61746368696e6720746865206e756d626572206f6620616d6f60648201527f756e747300000000000000000000000000000000000000000000000000000000608482015260a401610b0a565b5060005b84811015611943576118ce8686838181106118b3576118b361449d565b90506020020160208101906118c89190613f9d565b3b151590565b1561191b5760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b83838281811061192d5761192d61449d565b6020029190910135929092019150600101611896565b6017546001546000540383016000190111156119c75760405162461bcd60e51b815260206004820152602a60248201527f436f6c6f723a2043616e2774206d696e74206d6f7265207468616e207468652060448201527f6d617820737570706c79000000000000000000000000000000000000000000006064820152608401610b0a565b5060005b82811015611a2357611a1b8686838181106119e8576119e861449d565b90506020020160208101906119fd9190613f9d565b858584818110611a0f57611a0f61449d565b905060200201356129a1565b6001016119cb565b505050505050565b600260085403611a7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b6002600855803b15611ad15760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b611adb8282612e39565b50506001600855565b6000600b8281548110611af957611af961449d565b6000918252602090912001546001600160a01b031692915050565b6060600c805480602002602001604051908101604052809291908181526020018280548015610ba9576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d09575050505050905090565b606060038054610b30906142e6565b6011546001600160a01b03163314611bdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601854610100900460ff1615611c355760405162461bcd60e51b815260206004820152601b60248201527f436f6c6f723a204d617820737570706c792069732066726f7a656e00000000006044820152606401610b0a565b6017548161ffff1610611cb05760405162461bcd60e51b815260206004820152603560248201527f436f6c6f723a204e6577206d6178696d756d206d757374206265206c6573732060448201527f7468616e206578697374696e67206d6178696d756d00000000000000000000006064820152608401610b0a565b60015460005403600019018161ffff161015611d345760405162461bcd60e51b815260206004820152603260248201527f436f6c6f723a204e6577206d6178696d756d2063616e2774206265206c65737360448201527f207468616e206d696e74656420636f756e7400000000000000000000000000006064820152608401610b0a565b61ffff16601755565b6011546001600160a01b03163314611d975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b610b1d82826130a1565b336001600160a01b03831603611de3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600260085403611ea15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b6002600855611eaf8161162b565b6001600160a01b0316336001600160a01b031614611f0f5760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e657200006044820152606401610b0a565b6000908152601960205260409020805460ff19166001908117909155600855565b6011546001600160a01b03163314611f8a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b611fc3848484612682565b6001600160a01b0383163b15158015611fe55750611fe38484848461336a565b155b15612003576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060612014826124f3565b61204a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612054613487565b90508051600003612074576040518060200160405280600081525061209f565b8061207e84613496565b60405160200161208f9291906144b3565b6040516020818303038152906040525b9392505050565b6011546001600160a01b031633146121005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b612109816135cb565b50565b6011546001600160a01b031633146121665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6001600160a01b0381166121e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b0a565b61210981612dda565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610cca9084906137dd565b804710156122bb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b0a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612308576040519150601f19603f3d011682016040523d82523d6000602084013e61230d565b606091505b5050905080610cca5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b0a565b606061239384846000856138c2565b949350505050565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610aae5750610aae82613a01565b6127106bffffffffffffffffffffffff8216111561245f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610b0a565b6001600160a01b0382166124b55760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b0a565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217601255565b600081600111158015612507575060005482105b8015610aae575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006125a0600a5490565b6125aa904761437f565b905060006125d783836125d2866001600160a01b03166000908152600e602052604090205490565b613a9c565b9050478111156125e45750475b8015610cca576001600160a01b0383166000908152600e60205260408120805483929061261290849061437f565b9250508190555080600a600082825461262b919061437f565b9091555061263b9050838261226b565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b600061268d82612c98565b9050836001600160a01b031681600001516001600160a01b0316146126de576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b03861614806126fc57506126fc8533610a55565b8061271757503361270c84610bb3565b6001600160a01b0316145b905080612750576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612790576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61279d8585856001613af7565b6127a96000848761252c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661287f57600054821461287f578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60005b600b548110156121095760005b600c5481101561295e576000600c82815481106128fa576128fa61449d565b9060005260206000200160009054906101000a90046001600160a01b0316905061294b81600b85815481106129315761293161449d565b6000918252602090912001546001600160a01b0316612e39565b50806129568161450a565b9150506128db565b5061298f600b82815481106129755761297561449d565b6000918252602090912001546001600160a01b0316612595565b806129998161450a565b9150506128ce565b610b1d828260405180602001604052806000815250613b7c565b60008080805b600b54841015612a1857856001600160a01b0316600b85815481106129e8576129e861449d565b6000918252602090912001546001600160a01b031603612a06575060015b83612a108161450a565b9450506129c1565b80600114612a8e5760405162461bcd60e51b815260206004820152603660248201527f5061796d656e7453706c69747465723a20706179656520646f6573206e6f742060448201527f65786973742c20616464207061796565206669727374000000000000000000006064820152608401610b0a565b6001600160a01b0386166000908152600d60205260409020546009548691612ab591614524565b612abf919061437f565b915060008211612b375760405162461bcd60e51b815260206004820152603460248201527f5061796d656e7453706c69747465723a20746f74616c20736861726573206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401610b0a565b612b3f6128cb565b6000600a81905593505b600b54841015612ba3576000600e6000600b8781548110612b6c57612b6c61449d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205583612b9b8161450a565b945050612b49565b600092505b600c54831015612c76576000600c8481548110612bc757612bc761449d565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590955090505b600b54851015612c63576001600160a01b0381166000908152601060205260408120600b805483919089908110612c2c57612c2c61449d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205584612c5b8161450a565b955050612bf3565b5082612c6e8161450a565b935050612ba8565b5060095550506001600160a01b039091166000908152600d6020526040902055565b60408051606081018252600080825260208201819052918101919091528180600111158015612cc8575060005481105b15612da857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290612da65780516001600160a01b031615612d3c579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215612da1579392505050565b612d3c565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601180546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152600f60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eba919061453b565b612ec4919061437f565b90506000612efd83836125d287876001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a0823190602401602060405180830381865afa158015612f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f68919061453b565b811115612fda576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd7919061453b565b90505b8015612003576001600160a01b0380851660009081526010602090815260408083209387168352929052908120805483929061301790849061437f565b90915550506001600160a01b0384166000908152600f60205260408120805483929061304490849061437f565b9091555061305590508484836121eb565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600080833b156130f35760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a206e6f20636f6e7472616374730000006044820152606401610b0a565b60008092505b600b5483101561315057846001600160a01b0316600b84815481106131205761312061449d565b6000918252602090912001546001600160a01b03160361313e575060015b826131488161450a565b9350506130f9565b806000036128c45761ffff8416156132a15761316a6128cb565b6000600a81905592505b600b548310156131ce576000600e6000600b86815481106131975761319761449d565b60009182526020808320909101546001600160a01b03168352820192909252604001902055826131c68161450a565b935050613174565b600091505b600c548210156132a1576000600c83815481106131f2576131f261449d565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590945090505b600b5484101561328e576001600160a01b0381166000908152601060205260408120600b8054839190889081106132575761325761449d565b60009182526020808320909101546001600160a01b03168352820192909252604001902055836132868161450a565b94505061321e565b50816132998161450a565b9250506131d3565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091556000908152600d6020526040902061ffff85169081905560095461331b919061437f565b600955604080516001600160a01b038716815261ffff861660208201527fefb20bd7b432b3f89ef344f5dd4dbc10c62729e41df4363592a810661c8c7ae4910160405180910390a15050505050565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a02906133b8903390899088908890600401614554565b6020604051808303816000875af19250505080156133f3575060408051601f3d908101601f191682019092526133f091810190614590565b60015b613451573d808015613421576040519150601f19603f3d011682016040523d82523d6000602084013e613426565b606091505b508051600003613449576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050949350505050565b606060148054610b30906142e6565b6060816000036134d957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561350357806134ed8161450a565b91506134fc9050600a8361436b565b91506134dd565b60008167ffffffffffffffff81111561351e5761351e614097565b6040519080825280601f01601f191660200182016040528015613548576020820181803683370190505b5090505b84156123935761355d600183614524565b915061356a600a866145ad565b61357590603061437f565b60f81b81838151811061358a5761358a61449d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c4600a8661436b565b945061354c565b6001813b1515146136445760405162461bcd60e51b815260206004820152602360248201527f5061796d656e7453706c69747465723a206d757374206265206120636f6e747260448201527f61637400000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015613688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ac919061453b565b506000805b600c5481101561370957826001600160a01b0316600c82815481106136d8576136d861449d565b6000918252602090912001546001600160a01b0316036136f757600191505b806137018161450a565b9150506136b1565b50801561377d5760405162461bcd60e51b8152602060048201526024808201527f5061796d656e7453706c69747465723a20746f6b656e20616c7265616479206160448201527f64646564000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b50600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000613832826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123849092919063ffffffff16565b805190915015610cca578080602001905181019061385091906145c1565b610cca5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b0a565b60608247101561393a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b0a565b843b6139885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b0a565b600080866001600160a01b031685876040516139a491906145de565b60006040518083038185875af1925050503d80600081146139e1576040519150601f19603f3d011682016040523d82523d6000602084013e6139e6565b606091505b50915091506139f6828286613b89565b979650505050505050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480613a6457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aae57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aae565b600080600954600003613ab157506000612393565b6009546001600160a01b0386166000908152600d6020526040902054849190613ada9087614336565b613ae4919061436b565b613aee9190614524565b95945050505050565b60008281526019602052604090205460ff16156120035760405162461bcd60e51b815260206004820152602960248201527f436f6c6f723a2043616e6e6f74207472616e73666572202d2063757272656e7460448201527f6c79206c6f636b656400000000000000000000000000000000000000000000006064820152608401610b0a565b610cca8383836001613bc2565b60608315613b9857508161209f565b825115613ba85782518084602001fd5b8160405162461bcd60e51b8152600401610b0a9190613ecd565b6000546001600160a01b038516613c05576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003613c3f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c4c6000868387613af7565b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015613d0d57506001600160a01b0387163b15155b15613d95575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613d5e600088848060010195508861336a565b613d7b576040516368d2bf6b60e11b815260040160405180910390fd5b808203613d13578260005414613d9057600080fd5b613dda565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613d96575b506000556128c4565b6001600160e01b03198116811461210957600080fd5b600060208284031215613e0b57600080fd5b813561209f81613de3565b6001600160a01b038116811461210957600080fd5b60008060408385031215613e3e57600080fd5b8235613e4981613e16565b915060208301356bffffffffffffffffffffffff81168114613e6a57600080fd5b809150509250929050565b60005b83811015613e90578181015183820152602001613e78565b838111156120035750506000910152565b60008151808452613eb9816020860160208601613e75565b601f01601f19169290920160200192915050565b60208152600061209f6020830184613ea1565b600060208284031215613ef257600080fd5b5035919050565b60008060408385031215613f0c57600080fd5b8235613f1781613e16565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015613f665783516001600160a01b031683529284019291840191600101613f41565b50909695505050505050565b801515811461210957600080fd5b600060208284031215613f9257600080fd5b813561209f81613f72565b600060208284031215613faf57600080fd5b813561209f81613e16565b600080600060608486031215613fcf57600080fd5b8335613fda81613e16565b92506020840135613fea81613e16565b929592945050506040919091013590565b6000806040838503121561400e57600080fd5b50508035926020909101359150565b803561ffff8116811461402f57600080fd5b919050565b6000806040838503121561404757600080fd5b823561405281613e16565b91506140606020840161401d565b90509250929050565b6000806040838503121561407c57600080fd5b823561408781613e16565b91506020830135613e6a81613e16565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156140c8576140c8614097565b604051601f8501601f19908116603f011681019082821181831017156140f0576140f0614097565b8160405280935085815286868601111561410957600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561413557600080fd5b813567ffffffffffffffff81111561414c57600080fd5b8201601f8101841361415d57600080fd5b612393848235602084016140ad565b60008083601f84011261417e57600080fd5b50813567ffffffffffffffff81111561419657600080fd5b6020830191508360208260051b8501011115610fa357600080fd5b600080600080604085870312156141c757600080fd5b843567ffffffffffffffff808211156141df57600080fd5b6141eb8883890161416c565b9096509450602087013591508082111561420457600080fd5b506142118782880161416c565b95989497509550505050565b60006020828403121561422f57600080fd5b61209f8261401d565b6000806040838503121561424b57600080fd5b823561425681613e16565b91506020830135613e6a81613f72565b6000806000806080858703121561427c57600080fd5b843561428781613e16565b9350602085013561429781613e16565b925060408501359150606085013567ffffffffffffffff8111156142ba57600080fd5b8501601f810187136142cb57600080fd5b6142da878235602084016140ad565b91505092959194509250565b600181811c908216806142fa57607f821691505b60208210810361431a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561435057614350614320565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261437a5761437a614355565b500490565b6000821982111561439257614392614320565b500190565b601f821115610cca57600081815260208120601f850160051c810160208610156143be5750805b601f850160051c820191505b81811015611a23578281556001016143ca565b815167ffffffffffffffff8111156143f7576143f7614097565b61440b8161440584546142e6565b84614397565b602080601f83116001811461444057600084156144285750858301515b600019600386901b1c1916600185901b178555611a23565b600085815260208120601f198616915b8281101561446f57888601518255948401946001909101908401614450565b508582101561448d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600083516144c5818460208801613e75565b8351908301906144d9818360208801613e75565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b6000600019820361451d5761451d614320565b5060010190565b60008282101561453657614536614320565b500390565b60006020828403121561454d57600080fd5b5051919050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526145866080830184613ea1565b9695505050505050565b6000602082840312156145a257600080fd5b815161209f81613de3565b6000826145bc576145bc614355565b500690565b6000602082840312156145d357600080fd5b815161209f81613f72565b600082516145f0818460208701613e75565b919091019291505056fea2646970667358221220084c9cdf0fe7545d5e300528d5e65959ebfb644177136177852a9128b94de9de64736f6c634300080f003368747470733a2f2f697066732e696f2f697066732f516d506e624e526a6e3462534c377273756958386841766b776438434b6a42376a5a597a637652584e754454576b2f

Deployed Bytecode

0x60806040526004361061034e5760003560e01c80636c0360eb116101bb5780639ce8a55b116100f7578063c87b56dd11610095578063d5abeb011161006f578063d5abeb0114610a0f578063e33b7de314610a25578063e985e9c514610a3a578063f2fde38b14610a8357600080fd5b8063c87b56dd14610999578063ce7c2ac2146109b9578063d48bfca7146109ef57600080fd5b8063b440ff7a116100d1578063b440ff7a1461091a578063b88d4fde1461092f578063baa51f861461094f578063c793803c1461097f57600080fd5b80639ce8a55b146108ba578063a22cb465146108da578063a694fc3a146108fa57600080fd5b80637ec2402f1161016457806394ea82cd1161013e57806394ea82cd1461083a57806395d89b411461084f5780639852595c1461086457806398fa6c451461089a57600080fd5b80637ec2402f146107dd5780638b83209b146107fc5780638da5cb5b1461081c57600080fd5b80637501f741116101955780637501f741146107875780637705f9b51461079d578063796a6996146107bd57600080fd5b80636c0360eb1461073d57806370a0823114610752578063715018a61461077257600080fd5b80632a55205a1161028a57806344a0d68a11610233578063547520fe1161020d578063547520fe146106bd57806355f804b3146106dd5780635c975abb146106fd5780636352211e1461071d57600080fd5b806344a0d68a146106375780634ac7ef12146106575780634f37cad81461067757600080fd5b80633ccfd60b116102645780633ccfd60b146105ef57806340c10f191461060457806342842e0e1461061757600080fd5b80632a55205a1461057b5780632e17de78146105ba5780633a98ef39146105da57600080fd5b806311d4bc9a116102f757806318160ddd116102d157806318160ddd146104e8578063191655871461050557806323b872dd1461052557806324180d741461054557600080fd5b806311d4bc9a1461048f57806313faede6146104a457806316c38b3c146104c857600080fd5b8063081812fc11610328578063081812fc14610415578063095ea7b31461044d57806311164f541461046d57600080fd5b806301ffc9a71461039c57806304634d8d146103d157806306fdde03146103f357600080fd5b36610397577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103a857600080fd5b506103bc6103b7366004613df9565b610aa3565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec366004613e2b565b610ab4565b005b3480156103ff57600080fd5b50610408610b21565b6040516103c89190613ecd565b34801561042157600080fd5b50610435610430366004613ee0565b610bb3565b6040516001600160a01b0390911681526020016103c8565b34801561045957600080fd5b506103f1610468366004613ef9565b610c10565b34801561047957600080fd5b50610482610ccf565b6040516103c89190613f25565b34801561049b57600080fd5b506103f1610d30565b3480156104b057600080fd5b506104ba60165481565b6040519081526020016103c8565b3480156104d457600080fd5b506103f16104e3366004613f80565b610d99565b3480156104f457600080fd5b5060015460005403600019016104ba565b34801561051157600080fd5b506103f1610520366004613f9d565b610e2b565b34801561053157600080fd5b506103f1610540366004613fba565b610ee2565b34801561055157600080fd5b506104ba610560366004613f9d565b6001600160a01b03166000908152600f602052604090205490565b34801561058757600080fd5b5061059b610596366004613ffb565b610eed565b604080516001600160a01b0390931683526020830191909152016103c8565b3480156105c657600080fd5b506103f16105d5366004613ee0565b610faa565b3480156105e657600080fd5b506009546104ba565b3480156105fb57600080fd5b506103f1611087565b6103f1610612366004613ef9565b6110ed565b34801561062357600080fd5b506103f1610632366004613fba565b611431565b34801561064357600080fd5b506103f1610652366004613ee0565b61144c565b34801561066357600080fd5b506103f1610672366004614034565b6114ab565b34801561068357600080fd5b506104ba610692366004614069565b6001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b3480156106c957600080fd5b506103f16106d8366004613ee0565b611513565b3480156106e957600080fd5b506103f16106f8366004614123565b611572565b34801561070957600080fd5b506018546103bc9062010000900460ff1681565b34801561072957600080fd5b50610435610738366004613ee0565b61162b565b34801561074957600080fd5b5061040861163d565b34801561075e57600080fd5b506104ba61076d366004613f9d565b6116cb565b34801561077e57600080fd5b506103f1611733565b34801561079357600080fd5b506104ba60155481565b3480156107a957600080fd5b506103f16107b83660046141b1565b611799565b3480156107c957600080fd5b506103f16107d8366004614069565b611a2b565b3480156107e957600080fd5b506018546103bc90610100900460ff1681565b34801561080857600080fd5b50610435610817366004613ee0565b611ae4565b34801561082857600080fd5b506011546001600160a01b0316610435565b34801561084657600080fd5b50610482611b14565b34801561085b57600080fd5b50610408611b74565b34801561087057600080fd5b506104ba61087f366004613f9d565b6001600160a01b03166000908152600e602052604090205490565b3480156108a657600080fd5b506103f16108b536600461421d565b611b83565b3480156108c657600080fd5b506103f16108d5366004614034565b611d3d565b3480156108e657600080fd5b506103f16108f5366004614238565b611da1565b34801561090657600080fd5b506103f1610915366004613ee0565b611e4f565b34801561092657600080fd5b506103f1611f30565b34801561093b57600080fd5b506103f161094a366004614266565b611fb8565b34801561095b57600080fd5b506103bc61096a366004613ee0565b60009081526019602052604090205460ff1690565b34801561098b57600080fd5b506018546103bc9060ff1681565b3480156109a557600080fd5b506104086109b4366004613ee0565b612009565b3480156109c557600080fd5b506104ba6109d4366004613f9d565b6001600160a01b03166000908152600d602052604090205490565b3480156109fb57600080fd5b506103f1610a0a366004613f9d565b6120a6565b348015610a1b57600080fd5b506104ba60175481565b348015610a3157600080fd5b50600a546104ba565b348015610a4657600080fd5b506103bc610a55366004614069565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a8f57600080fd5b506103f1610a9e366004613f9d565b61210c565b6000610aae8261239b565b92915050565b6011546001600160a01b03163314610b135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b610b1d82826123d9565b5050565b606060028054610b30906142e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5c906142e6565b8015610ba95780601f10610b7e57610100808354040283529160200191610ba9565b820191906000526020600020905b815481529060010190602001808311610b8c57829003601f168201915b5050505050905090565b6000610bbe826124f3565b610bf4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c1b8261162b565b9050806001600160a01b0316836001600160a01b031603610c68576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b336001600160a01b03821614801590610c885750610c868133610a55565b155b15610cbf576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610cca83838361252c565b505050565b6060600b805480602002602001604051908101604052809291908181526020018280548015610ba957602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610d09575050505050905090565b6011546001600160a01b03163314610d8a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6018805460ff19166001179055565b6011546001600160a01b03163314610df35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6018805491151562010000027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ffff909216919091179055565b600260085403610e7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b6002600855803b15610ed15760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b610eda81612595565b506001600855565b610cca838383612682565b60008281526013602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046bffffffffffffffffffffffff16928201929092528291610f6c5750604080518082019091526012546001600160a01b0381168252600160a01b90046bffffffffffffffffffffffff1660208201525b602081015160009061271090610f90906bffffffffffffffffffffffff1687614336565b610f9a919061436b565b91519350909150505b9250929050565b600260085403610ffc5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b600260085561100a8161162b565b6001600160a01b0316336001600160a01b03161461106a5760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e657200006044820152606401610b0a565b6000908152601960205260409020805460ff191690556001600855565b6002600854036110d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b60026008556110e66128cb565b6001600855565b60026008540361113f5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b600260085560006111596001546000546000199190030190565b9050333b156111aa5760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b823b156111f95760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b60185462010000900460ff16156112525760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a204d696e74696e67206e6f7420737461727465642079657400006044820152606401610b0a565b600082116112a25760405162461bcd60e51b815260206004820152601260248201527f436f6c6f723a2043616e74206d696e74203000000000000000000000000000006044820152606401610b0a565b60155482111561131a5760405162461bcd60e51b815260206004820152602260248201527f436f6c6f723a204d757374206d696e74206c657373207468616e20746865206d60448201527f61780000000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b601754611327838361437f565b111561139b5760405162461bcd60e51b815260206004820152602560248201527f436f6c6f723a2043616e74206d696e74206d6f7265207468616e206d6178207360448201527f7570706c790000000000000000000000000000000000000000000000000000006064820152608401610b0a565b816016546113a99190614336565b34101561141d5760405162461bcd60e51b8152602060048201526024808201527f436f6c6f723a204d7573742073656e6420657468206f6620636f73742070657260448201527f206e6674000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b61142783836129a1565b5050600160085550565b610cca83838360405180602001604052806000815250611fb8565b6011546001600160a01b031633146114a65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601655565b6011546001600160a01b031633146115055760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b610b1d828261ffff166129bb565b6011546001600160a01b0316331461156d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601555565b6011546001600160a01b031633146115cc5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b60185460ff161561161f5760405162461bcd60e51b815260206004820152601460248201527f436f6c6f723a207572692069732066726f7a656e0000000000000000000000006044820152606401610b0a565b6014610b1d82826143dd565b600061163682612c98565b5192915050565b6014805461164a906142e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611676906142e6565b80156116c35780601f10611698576101008083540402835291602001916116c3565b820191906000526020600020905b8154815290600101906020018083116116a657829003601f168201915b505050505081565b60006001600160a01b03821661170d576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b6011546001600160a01b0316331461178d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6117976000612dda565b565b6011546001600160a01b031633146117f35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6000808483146118925760405162461bcd60e51b8152602060048201526044602482018190527f436f6c6f723a20546865206e756d626572206f66206164647265737365732069908201527f73206e6f74206d61746368696e6720746865206e756d626572206f6620616d6f60648201527f756e747300000000000000000000000000000000000000000000000000000000608482015260a401610b0a565b5060005b84811015611943576118ce8686838181106118b3576118b361449d565b90506020020160208101906118c89190613f9d565b3b151590565b1561191b5760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b83838281811061192d5761192d61449d565b6020029190910135929092019150600101611896565b6017546001546000540383016000190111156119c75760405162461bcd60e51b815260206004820152602a60248201527f436f6c6f723a2043616e2774206d696e74206d6f7265207468616e207468652060448201527f6d617820737570706c79000000000000000000000000000000000000000000006064820152608401610b0a565b5060005b82811015611a2357611a1b8686838181106119e8576119e861449d565b90506020020160208101906119fd9190613f9d565b858584818110611a0f57611a0f61449d565b905060200201356129a1565b6001016119cb565b505050505050565b600260085403611a7d5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b6002600855803b15611ad15760405162461bcd60e51b815260206004820152601360248201527f436f6c6f723a206e6f20636f6e747261637473000000000000000000000000006044820152606401610b0a565b611adb8282612e39565b50506001600855565b6000600b8281548110611af957611af961449d565b6000918252602090912001546001600160a01b031692915050565b6060600c805480602002602001604051908101604052809291908181526020018280548015610ba9576020028201919060005260206000209081546001600160a01b03168152600190910190602001808311610d09575050505050905090565b606060038054610b30906142e6565b6011546001600160a01b03163314611bdd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601854610100900460ff1615611c355760405162461bcd60e51b815260206004820152601b60248201527f436f6c6f723a204d617820737570706c792069732066726f7a656e00000000006044820152606401610b0a565b6017548161ffff1610611cb05760405162461bcd60e51b815260206004820152603560248201527f436f6c6f723a204e6577206d6178696d756d206d757374206265206c6573732060448201527f7468616e206578697374696e67206d6178696d756d00000000000000000000006064820152608401610b0a565b60015460005403600019018161ffff161015611d345760405162461bcd60e51b815260206004820152603260248201527f436f6c6f723a204e6577206d6178696d756d2063616e2774206265206c65737360448201527f207468616e206d696e74656420636f756e7400000000000000000000000000006064820152608401610b0a565b61ffff16601755565b6011546001600160a01b03163314611d975760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b610b1d82826130a1565b336001600160a01b03831603611de3576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600260085403611ea15760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b0a565b6002600855611eaf8161162b565b6001600160a01b0316336001600160a01b031614611f0f5760405162461bcd60e51b815260206004820152601e60248201527f436f6c6f723a2063616c6c6572206973206e6f7420746865206f776e657200006044820152606401610b0a565b6000908152601960205260409020805460ff19166001908117909155600855565b6011546001600160a01b03163314611f8a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b601880547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16610100179055565b611fc3848484612682565b6001600160a01b0383163b15158015611fe55750611fe38484848461336a565b155b15612003576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6060612014826124f3565b61204a576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612054613487565b90508051600003612074576040518060200160405280600081525061209f565b8061207e84613496565b60405160200161208f9291906144b3565b6040516020818303038152906040525b9392505050565b6011546001600160a01b031633146121005760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b612109816135cb565b50565b6011546001600160a01b031633146121665760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0a565b6001600160a01b0381166121e25760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b0a565b61210981612dda565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610cca9084906137dd565b804710156122bb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b0a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612308576040519150601f19603f3d011682016040523d82523d6000602084013e61230d565b606091505b5050905080610cca5760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b0a565b606061239384846000856138c2565b949350505050565b60006001600160e01b031982167f2a55205a000000000000000000000000000000000000000000000000000000001480610aae5750610aae82613a01565b6127106bffffffffffffffffffffffff8216111561245f5760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c2065786365656460448201527f2073616c655072696365000000000000000000000000000000000000000000006064820152608401610b0a565b6001600160a01b0382166124b55760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c6964207265636569766572000000000000006044820152606401610b0a565b604080518082019091526001600160a01b039092168083526bffffffffffffffffffffffff9091166020909201829052600160a01b90910217601255565b600081600111158015612507575060005482105b8015610aae575050600090815260046020526040902054600160e01b900460ff161590565b600082815260066020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006125a0600a5490565b6125aa904761437f565b905060006125d783836125d2866001600160a01b03166000908152600e602052604090205490565b613a9c565b9050478111156125e45750475b8015610cca576001600160a01b0383166000908152600e60205260408120805483929061261290849061437f565b9250508190555080600a600082825461262b919061437f565b9091555061263b9050838261226b565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056910160405180910390a1505050565b600061268d82612c98565b9050836001600160a01b031681600001516001600160a01b0316146126de576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000336001600160a01b03861614806126fc57506126fc8533610a55565b8061271757503361270c84610bb3565b6001600160a01b0316145b905080612750576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038416612790576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61279d8585856001613af7565b6127a96000848761252c565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff1980821667ffffffffffffffff92831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102178355870180845292208054919390911661287f57600054821461287f578054602086015167ffffffffffffffff16600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b60005b600b548110156121095760005b600c5481101561295e576000600c82815481106128fa576128fa61449d565b9060005260206000200160009054906101000a90046001600160a01b0316905061294b81600b85815481106129315761293161449d565b6000918252602090912001546001600160a01b0316612e39565b50806129568161450a565b9150506128db565b5061298f600b82815481106129755761297561449d565b6000918252602090912001546001600160a01b0316612595565b806129998161450a565b9150506128ce565b610b1d828260405180602001604052806000815250613b7c565b60008080805b600b54841015612a1857856001600160a01b0316600b85815481106129e8576129e861449d565b6000918252602090912001546001600160a01b031603612a06575060015b83612a108161450a565b9450506129c1565b80600114612a8e5760405162461bcd60e51b815260206004820152603660248201527f5061796d656e7453706c69747465723a20706179656520646f6573206e6f742060448201527f65786973742c20616464207061796565206669727374000000000000000000006064820152608401610b0a565b6001600160a01b0386166000908152600d60205260409020546009548691612ab591614524565b612abf919061437f565b915060008211612b375760405162461bcd60e51b815260206004820152603460248201527f5061796d656e7453706c69747465723a20746f74616c20736861726573206d7560448201527f73742062652067726561746572207468616e20300000000000000000000000006064820152608401610b0a565b612b3f6128cb565b6000600a81905593505b600b54841015612ba3576000600e6000600b8781548110612b6c57612b6c61449d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205583612b9b8161450a565b945050612b49565b600092505b600c54831015612c76576000600c8481548110612bc757612bc761449d565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590955090505b600b54851015612c63576001600160a01b0381166000908152601060205260408120600b805483919089908110612c2c57612c2c61449d565b60009182526020808320909101546001600160a01b0316835282019290925260400190205584612c5b8161450a565b955050612bf3565b5082612c6e8161450a565b935050612ba8565b5060095550506001600160a01b039091166000908152600d6020526040902055565b60408051606081018252600080825260208201819052918101919091528180600111158015612cc8575060005481105b15612da857600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b810467ffffffffffffffff1692820192909252600160e01b90910460ff16151591810182905290612da65780516001600160a01b031615612d3c579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b820467ffffffffffffffff1693830193909352600160e01b900460ff1615159281019290925215612da1579392505050565b612d3c565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601180546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166000908152600f60205260408120546040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612e96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612eba919061453b565b612ec4919061437f565b90506000612efd83836125d287876001600160a01b03918216600090815260106020908152604080832093909416825291909152205490565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a0823190602401602060405180830381865afa158015612f44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f68919061453b565b811115612fda576040516370a0823160e01b81523060048201526001600160a01b038516906370a0823190602401602060405180830381865afa158015612fb3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fd7919061453b565b90505b8015612003576001600160a01b0380851660009081526010602090815260408083209387168352929052908120805483929061301790849061437f565b90915550506001600160a01b0384166000908152600f60205260408120805483929061304490849061437f565b9091555061305590508484836121eb565b604080516001600160a01b038581168252602082018490528616917f3be5b7a71e84ed12875d241991c70855ac5817d847039e17a9d895c1ceb0f18a910160405180910390a250505050565b600080833b156130f35760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a206e6f20636f6e7472616374730000006044820152606401610b0a565b60008092505b600b5483101561315057846001600160a01b0316600b84815481106131205761312061449d565b6000918252602090912001546001600160a01b03160361313e575060015b826131488161450a565b9350506130f9565b806000036128c45761ffff8416156132a15761316a6128cb565b6000600a81905592505b600b548310156131ce576000600e6000600b86815481106131975761319761449d565b60009182526020808320909101546001600160a01b03168352820192909252604001902055826131c68161450a565b935050613174565b600091505b600c548210156132a1576000600c83815481106131f2576131f261449d565b60009182526020808320909101546001600160a01b0316808352600f9091526040822082905590945090505b600b5484101561328e576001600160a01b0381166000908152601060205260408120600b8054839190889081106132575761325761449d565b60009182526020808320909101546001600160a01b03168352820192909252604001902055836132868161450a565b94505061321e565b50816132998161450a565b9250506131d3565b600b8054600181019091557f0175b7a638427703f0dbe7bb9bbf987a2551717b34e79f33b5b1008d1fa01db901805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0387169081179091556000908152600d6020526040902061ffff85169081905560095461331b919061437f565b600955604080516001600160a01b038716815261ffff861660208201527fefb20bd7b432b3f89ef344f5dd4dbc10c62729e41df4363592a810661c8c7ae4910160405180910390a15050505050565b6040517f150b7a020000000000000000000000000000000000000000000000000000000081526000906001600160a01b0385169063150b7a02906133b8903390899088908890600401614554565b6020604051808303816000875af19250505080156133f3575060408051601f3d908101601f191682019092526133f091810190614590565b60015b613451573d808015613421576040519150601f19603f3d011682016040523d82523d6000602084013e613426565b606091505b508051600003613449576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b0319167f150b7a0200000000000000000000000000000000000000000000000000000000149050949350505050565b606060148054610b30906142e6565b6060816000036134d957505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561350357806134ed8161450a565b91506134fc9050600a8361436b565b91506134dd565b60008167ffffffffffffffff81111561351e5761351e614097565b6040519080825280601f01601f191660200182016040528015613548576020820181803683370190505b5090505b84156123935761355d600183614524565b915061356a600a866145ad565b61357590603061437f565b60f81b81838151811061358a5761358a61449d565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135c4600a8661436b565b945061354c565b6001813b1515146136445760405162461bcd60e51b815260206004820152602360248201527f5061796d656e7453706c69747465723a206d757374206265206120636f6e747260448201527f61637400000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b6040516370a0823160e01b81523060048201526001600160a01b038216906370a0823190602401602060405180830381865afa158015613688573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906136ac919061453b565b506000805b600c5481101561370957826001600160a01b0316600c82815481106136d8576136d861449d565b6000918252602090912001546001600160a01b0316036136f757600191505b806137018161450a565b9150506136b1565b50801561377d5760405162461bcd60e51b8152602060048201526024808201527f5061796d656e7453706c69747465723a20746f6b656e20616c7265616479206160448201527f64646564000000000000000000000000000000000000000000000000000000006064820152608401610b0a565b50600c80546001810182556000919091527fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c701805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000613832826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123849092919063ffffffff16565b805190915015610cca578080602001905181019061385091906145c1565b610cca5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f742073756363656564000000000000000000000000000000000000000000006064820152608401610b0a565b60608247101561393a5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c00000000000000000000000000000000000000000000000000006064820152608401610b0a565b843b6139885760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610b0a565b600080866001600160a01b031685876040516139a491906145de565b60006040518083038185875af1925050503d80600081146139e1576040519150601f19603f3d011682016040523d82523d6000602084013e6139e6565b606091505b50915091506139f6828286613b89565b979650505050505050565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480613a6457506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610aae57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b0319831614610aae565b600080600954600003613ab157506000612393565b6009546001600160a01b0386166000908152600d6020526040902054849190613ada9087614336565b613ae4919061436b565b613aee9190614524565b95945050505050565b60008281526019602052604090205460ff16156120035760405162461bcd60e51b815260206004820152602960248201527f436f6c6f723a2043616e6e6f74207472616e73666572202d2063757272656e7460448201527f6c79206c6f636b656400000000000000000000000000000000000000000000006064820152608401610b0a565b610cca8383836001613bc2565b60608315613b9857508161209f565b825115613ba85782518084602001fd5b8160405162461bcd60e51b8152600401610b0a9190613ecd565b6000546001600160a01b038516613c05576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600003613c3f576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613c4c6000868387613af7565b6001600160a01b038516600081815260056020908152604080832080547fffffffffffffffffffffffffffffffff00000000000000000000000000000000811667ffffffffffffffff8083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452600490925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015613d0d57506001600160a01b0387163b15155b15613d95575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4613d5e600088848060010195508861336a565b613d7b576040516368d2bf6b60e11b815260040160405180910390fd5b808203613d13578260005414613d9057600080fd5b613dda565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613d96575b506000556128c4565b6001600160e01b03198116811461210957600080fd5b600060208284031215613e0b57600080fd5b813561209f81613de3565b6001600160a01b038116811461210957600080fd5b60008060408385031215613e3e57600080fd5b8235613e4981613e16565b915060208301356bffffffffffffffffffffffff81168114613e6a57600080fd5b809150509250929050565b60005b83811015613e90578181015183820152602001613e78565b838111156120035750506000910152565b60008151808452613eb9816020860160208601613e75565b601f01601f19169290920160200192915050565b60208152600061209f6020830184613ea1565b600060208284031215613ef257600080fd5b5035919050565b60008060408385031215613f0c57600080fd5b8235613f1781613e16565b946020939093013593505050565b6020808252825182820181905260009190848201906040850190845b81811015613f665783516001600160a01b031683529284019291840191600101613f41565b50909695505050505050565b801515811461210957600080fd5b600060208284031215613f9257600080fd5b813561209f81613f72565b600060208284031215613faf57600080fd5b813561209f81613e16565b600080600060608486031215613fcf57600080fd5b8335613fda81613e16565b92506020840135613fea81613e16565b929592945050506040919091013590565b6000806040838503121561400e57600080fd5b50508035926020909101359150565b803561ffff8116811461402f57600080fd5b919050565b6000806040838503121561404757600080fd5b823561405281613e16565b91506140606020840161401d565b90509250929050565b6000806040838503121561407c57600080fd5b823561408781613e16565b91506020830135613e6a81613e16565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156140c8576140c8614097565b604051601f8501601f19908116603f011681019082821181831017156140f0576140f0614097565b8160405280935085815286868601111561410957600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561413557600080fd5b813567ffffffffffffffff81111561414c57600080fd5b8201601f8101841361415d57600080fd5b612393848235602084016140ad565b60008083601f84011261417e57600080fd5b50813567ffffffffffffffff81111561419657600080fd5b6020830191508360208260051b8501011115610fa357600080fd5b600080600080604085870312156141c757600080fd5b843567ffffffffffffffff808211156141df57600080fd5b6141eb8883890161416c565b9096509450602087013591508082111561420457600080fd5b506142118782880161416c565b95989497509550505050565b60006020828403121561422f57600080fd5b61209f8261401d565b6000806040838503121561424b57600080fd5b823561425681613e16565b91506020830135613e6a81613f72565b6000806000806080858703121561427c57600080fd5b843561428781613e16565b9350602085013561429781613e16565b925060408501359150606085013567ffffffffffffffff8111156142ba57600080fd5b8501601f810187136142cb57600080fd5b6142da878235602084016140ad565b91505092959194509250565b600181811c908216806142fa57607f821691505b60208210810361431a57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561435057614350614320565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261437a5761437a614355565b500490565b6000821982111561439257614392614320565b500190565b601f821115610cca57600081815260208120601f850160051c810160208610156143be5750805b601f850160051c820191505b81811015611a23578281556001016143ca565b815167ffffffffffffffff8111156143f7576143f7614097565b61440b8161440584546142e6565b84614397565b602080601f83116001811461444057600084156144285750858301515b600019600386901b1c1916600185901b178555611a23565b600085815260208120601f198616915b8281101561446f57888601518255948401946001909101908401614450565b508582101561448d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b600083516144c5818460208801613e75565b8351908301906144d9818360208801613e75565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000009101908152600501949350505050565b6000600019820361451d5761451d614320565b5060010190565b60008282101561453657614536614320565b500390565b60006020828403121561454d57600080fd5b5051919050565b60006001600160a01b038087168352808616602084015250836040830152608060608301526145866080830184613ea1565b9695505050505050565b6000602082840312156145a257600080fd5b815161209f81613de3565b6000826145bc576145bc614355565b500690565b6000602082840312156145d357600080fd5b815161209f81613f72565b600082516145f0818460208701613e75565b919091019291505056fea2646970667358221220084c9cdf0fe7545d5e300528d5e65959ebfb644177136177852a9128b94de9de64736f6c634300080f0033

Deployed Bytecode Sourcemap

363:6953:16:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3547:40:12;736:10:1;3547:40:12;;;-1:-1:-1;;;;;206:55:17;;;188:74;;3577:9:12;293:2:17;278:18;;271:34;161:18;3547:40:12;;;;;;;363:6953:16;;;;;1358:171;;;;;;;;;;-1:-1:-1;1358:171:16;;;;;:::i;:::-;;:::i;:::-;;;913:14:17;;906:22;888:41;;876:2;861:18;1358:171:16;;;;;;;;7167:146;;;;;;;;;;-1:-1:-1;7167:146:16;;;;;:::i;:::-;;:::i;:::-;;7734:100:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;9245:204::-;;;;;;;;;;-1:-1:-1;9245:204:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2698:55:17;;;2680:74;;2668:2;2653:18;9245:204:4;2534:226:17;8808:371:4;;;;;;;;;;-1:-1:-1;8808:371:4;;;;;:::i;:::-;;:::i;11363:94:12:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;5047:78:16:-;;;;;;;;;;;;;:::i;700:32::-;;;;;;;;;;;;;;;;;;;3917:25:17;;;3905:2;3890:18;700:32:16;3771:177:17;4682:81:16;;;;;;;;;;-1:-1:-1;4682:81:16;;;;;:::i;:::-;;:::i;3870:303:4:-;;;;;;;;;;-1:-1:-1;3727:1:4;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:4;3870:303;;6425:179:16;;;;;;;;;;-1:-1:-1;6425:179:16;;;;;:::i;:::-;;:::i;10110:170:4:-;;;;;;;;;;-1:-1:-1;10110:170:4;;;;;:::i;:::-;;:::i;4115:124:12:-;;;;;;;;;;-1:-1:-1;4115:124:12;;;;;:::i;:::-;-1:-1:-1;;;;;4205:26:12;4178:7;4205:26;;;:19;:26;;;;;;;4115:124;1674:442:3;;;;;;;;;;-1:-1:-1;1674:442:3;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;206:55:17;;;188:74;;293:2;278:18;;271:34;;;;161:18;1674:442:3;14:297:17;4165:191:16;;;;;;;;;;-1:-1:-1;4165:191:16;;;;;:::i;:::-;;:::i;3678:91:12:-;;;;;;;;;;-1:-1:-1;3749:12:12;;3678:91;;6945:72:16;;;;;;;;;;;;;:::i;2470:722::-;;;;;;:::i;:::-;;:::i;10351:185:4:-;;;;;;;;;;-1:-1:-1;10351:185:4;;;;;:::i;:::-;;:::i;4394:82:16:-;;;;;;;;;;-1:-1:-1;4394:82:16;;;;;:::i;:::-;;:::i;6099:118::-;;;;;;;;;;-1:-1:-1;6099:118:16;;;;;:::i;:::-;;:::i;4812:140:12:-;;;;;;;;;;-1:-1:-1;4812:140:12;;;;;:::i;:::-;-1:-1:-1;;;;;4914:21:12;;;4887:7;4914:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4812:140;4531:106:16;;;;;;;;;;-1:-1:-1;4531:106:16;;;;;:::i;:::-;;:::i;4839:172::-;;;;;;;;;;-1:-1:-1;4839:172:16;;;;;:::i;:::-;;:::i;849:25::-;;;;;;;;;;-1:-1:-1;849:25:16;;;;;;;;;;;7542:125:4;;;;;;;;;;-1:-1:-1;7542:125:4;;;;;:::i;:::-;;:::i;565:94:16:-;;;;;;;;;;;;;:::i;4990:206:4:-;;;;;;;;;;-1:-1:-1;4990:206:4;;;;;:::i;:::-;;:::i;1714:103:11:-;;;;;;;;;;;;;:::i;666:27:16:-;;;;;;;;;;;;;;;;1608:829;;;;;;;;;;-1:-1:-1;1608:829:16;;;;;:::i;:::-;;:::i;6661:210::-;;;;;;;;;;-1:-1:-1;6661:210:16;;;;;:::i;:::-;;:::i;813:32::-;;;;;;;;;;-1:-1:-1;813:32:16;;;;;;;;;;;5043:100:12;;;;;;;;;;-1:-1:-1;5043:100:12;;;;;:::i;:::-;;:::i;1063:87:11:-;;;;;;;;;;-1:-1:-1;1136:6:11;;-1:-1:-1;;;;;1136:6:11;1063:87;;11200:96:12;;;;;;;;;;;;;:::i;7903:104:4:-;;;;;;;;;;;;;:::i;4534:109:12:-;;;;;;;;;;-1:-1:-1;4534:109:12;;;;;:::i;:::-;-1:-1:-1;;;;;4617:18:12;4590:7;4617:18;;;:9;:18;;;;;;;4534:109;5504:360:16;;;;;;;;;;-1:-1:-1;5504:360:16;;;;;:::i;:::-;;:::i;5916:116::-;;;;;;;;;;-1:-1:-1;5916:116:16;;;;;:::i;:::-;;:::i;9521:287:4:-;;;;;;;;;;-1:-1:-1;9521:287:4;;;;;:::i;:::-;;:::i;3827:188:16:-;;;;;;;;;;-1:-1:-1;3827:188:16;;;;;:::i;:::-;;:::i;5355:81::-;;;;;;;;;;;;;:::i;10607:369:4:-;;;;;;;;;;-1:-1:-1;10607:369:4;;;;;:::i;:::-;;:::i;3572:112:16:-;;;;;;;;;;-1:-1:-1;3572:112:16;;;;;:::i;:::-;3628:4;3652:24;;;:15;:24;;;;;;;;;3572:112;777:29;;;;;;;;;;-1:-1:-1;777:29:16;;;;;;;;8078:326:4;;;;;;;;;;-1:-1:-1;8078:326:4;;;;;:::i;:::-;;:::i;4330:105:12:-;;;;;;;;;;-1:-1:-1;4330:105:12;;;;;:::i;:::-;-1:-1:-1;;;;;4411:16:12;4384:7;4411:16;;;:7;:16;;;;;;;4330:105;6283:91:16;;;;;;;;;;-1:-1:-1;6283:91:16;;;;;:::i;:::-;;:::i;739:31::-;;;;;;;;;;;;;;;;3863:95:12;;;;;;;;;;-1:-1:-1;3936:14:12;;3863:95;;9879:164:4;;;;;;;;;;-1:-1:-1;9879:164:4;;;;;:::i;:::-;-1:-1:-1;;;;;10000:25:4;;;9976:4;10000:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;9879:164;1972:201:11;;;;;;;;;;-1:-1:-1;1972:201:11;;;;;:::i;:::-;;:::i;1358:171:16:-;1461:4;1485:36;1509:11;1485:23;:36::i;:::-;1478:43;1358:171;-1:-1:-1;;1358:171:16:o;7167:146::-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;;;;;;;;;7263:42:16::1;7282:8;7292:12;7263:18;:42::i;:::-;7167:146:::0;;:::o;7734:100:4:-;7788:13;7821:5;7814:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7734:100;:::o;9245:204::-;9313:7;9338:16;9346:7;9338;:16::i;:::-;9333:64;;9363:34;;;;;;;;;;;;;;9333:64;-1:-1:-1;9417:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;9417:24:4;;9245:204::o;8808:371::-;8881:13;8897:24;8913:7;8897:15;:24::i;:::-;8881:40;;8942:5;-1:-1:-1;;;;;8936:11:4;:2;-1:-1:-1;;;;;8936:11:4;;8932:48;;8956:24;;;;;;;;;;;;;;8932:48;736:10:1;-1:-1:-1;;;;;8997:21:4;;;;;;:63;;-1:-1:-1;9023:37:4;9040:5;736:10:1;9879:164:4;:::i;9023:37::-;9022:38;8997:63;8993:138;;;9084:35;;;;;;;;;;;;;;8993:138;9143:28;9152:2;9156:7;9165:5;9143:8;:28::i;:::-;8870:309;8808:371;;:::o;11363:94:12:-;11406:16;11442:7;11435:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11435:14:12;;;;;;;;;;;;;;;;;;;;;;11363:94;:::o;5047:78:16:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;5101:9:16::1;:16:::0;;-1:-1:-1;;5101:16:16::1;5113:4;5101:16;::::0;;5047:78::o;4682:81::-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;4742:6:16::1;:16:::0;;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;4682:81::o;6425:179::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;13093:2:17;2368:63:13;;;13075:21:17;13132:2;13112:18;;;13105:30;13171:33;13151:18;;;13144:61;13222:18;;2368:63:13;12891:355:17;2368:63:13;1778:1;2509:7;:18;1120:20:0;;1168:8;6500:68:16::1;;;::::0;-1:-1:-1;;;6500:68:16;;13453:2:17;6500:68:16::1;::::0;::::1;13435:21:17::0;13492:2;13472:18;;;13465:30;13531:21;13511:18;;;13504:49;13570:18;;6500:68:16::1;13251:343:17::0;6500:68:16::1;6579:17;6588:7;6579:8;:17::i;:::-;-1:-1:-1::0;1734:1:13;2688:7;:22;6425:179:16:o;10110:170:4:-;10244:28;10254:4;10260:2;10264:7;10244:9;:28::i;1674:442:3:-;1771:7;1829:27;;;:17;:27;;;;;;;;1800:56;;;;;;;;;-1:-1:-1;;;;;1800:56:3;;;;;-1:-1:-1;;;1800:56:3;;;;;;;;;;;;1771:7;;1869:92;;-1:-1:-1;1920:29:3;;;;;;;;;1930:19;1920:29;-1:-1:-1;;;;;1920:29:3;;;;-1:-1:-1;;;1920:29:3;;;;;;;;1869:92;2011:23;;;;1973:21;;2482:5;;1998:36;;1997:58;1998:36;:10;:36;:::i;:::-;1997:58;;;;:::i;:::-;2076:16;;;-1:-1:-1;1973:82:3;;-1:-1:-1;;1674:442:3;;;;;;:::o;4165:191:16:-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;13093:2:17;2368:63:13;;;13075:21:17;13132:2;13112:18;;;13105:30;13171:33;13151:18;;;13144:61;13222:18;;2368:63:13;12891:355:17;2368:63:13;1778:1;2509:7;:18;4254:16:16::1;4262:7:::0;4254::::1;:16::i;:::-;-1:-1:-1::0;;;;;4240:30:16::1;:10;-1:-1:-1::0;;;;;4240:30:16::1;;4232:73;;;::::0;-1:-1:-1;;;4232:73:16;;14537:2:17;4232:73:16::1;::::0;::::1;14519:21:17::0;14576:2;14556:18;;;14549:30;14615:32;14595:18;;;14588:60;14665:18;;4232:73:16::1;14335:354:17::0;4232:73:16::1;4343:5;4316:24:::0;;;:15:::1;:24;::::0;;;;:32;;-1:-1:-1;;4316:32:16::1;::::0;;;2688:7:13;:22;4165:191:16:o;6945:72::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;13093:2:17;2368:63:13;;;13075:21:17;13132:2;13112:18;;;13105:30;13171:33;13151:18;;;13144:61;13222:18;;2368:63:13;12891:355:17;2368:63:13;1778:1;2509:7;:18;6998:11:16::1;:9;:11::i;:::-;1734:1:13::0;2688:7;:22;6945:72:16:o;2470:722::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;13093:2:17;2368:63:13;;;13075:21:17;13132:2;13112:18;;;13105:30;13171:33;13151:18;;;13144:61;13222:18;;2368:63:13;12891:355:17;2368:63:13;1778:1;2509:7;:18;2559:14:16::1;2576:13;3727:1:4::0;4124:12;3914:7;4108:13;-1:-1:-1;;4108:28:4;;;:46;;3870:303;2576:13:16::1;2559:30:::0;-1:-1:-1;2629:10:16::1;1120:20:0::0;1168:8;2602:71:16::1;;;::::0;-1:-1:-1;;;2602:71:16;;13453:2:17;2602:71:16::1;::::0;::::1;13435:21:17::0;13492:2;13472:18;;;13465:30;13531:21;13511:18;;;13504:49;13570:18;;2602:71:16::1;13251:343:17::0;2602:71:16::1;1120:20:0::0;;1168:8;2684:64:16::1;;;::::0;-1:-1:-1;;;2684:64:16;;13453:2:17;2684:64:16::1;::::0;::::1;13435:21:17::0;13492:2;13472:18;;;13465:30;13531:21;13511:18;;;13504:49;13570:18;;2684:64:16::1;13251:343:17::0;2684:64:16::1;2767:6;::::0;;;::::1;;;:15;2759:58;;;::::0;-1:-1:-1;;;2759:58:16;;14896:2:17;2759:58:16::1;::::0;::::1;14878:21:17::0;14935:2;14915:18;;;14908:30;14974:32;14954:18;;;14947:60;15024:18;;2759:58:16::1;14694:354:17::0;2759:58:16::1;2850:1;2836:11;:15;2828:46;;;::::0;-1:-1:-1;;;2828:46:16;;15255:2:17;2828:46:16::1;::::0;::::1;15237:21:17::0;15294:2;15274:18;;;15267:30;15333:20;15313:18;;;15306:48;15371:18;;2828:46:16::1;15053:342:17::0;2828:46:16::1;2908:7;;2893:11;:22;;2885:69;;;::::0;-1:-1:-1;;;2885:69:16;;15602:2:17;2885:69:16::1;::::0;::::1;15584:21:17::0;15641:2;15621:18;;;15614:30;15680:34;15660:18;;;15653:62;15751:4;15731:18;;;15724:32;15773:19;;2885:69:16::1;15400:398:17::0;2885:69:16::1;2997:9;::::0;2973:20:::1;2982:11:::0;2973:6;:20:::1;:::i;:::-;:33;;2965:83;;;::::0;-1:-1:-1;;;2965:83:16;;16138:2:17;2965:83:16::1;::::0;::::1;16120:21:17::0;16177:2;16157:18;;;16150:30;16216:34;16196:18;;;16189:62;16287:7;16267:18;;;16260:35;16312:19;;2965:83:16::1;15936:401:17::0;2965:83:16::1;3087:11;3080:4;;:18;;;;:::i;:::-;3067:9;:31;;3059:80;;;::::0;-1:-1:-1;;;3059:80:16;;16544:2:17;3059:80:16::1;::::0;::::1;16526:21:17::0;16583:2;16563:18;;;16556:30;16622:34;16602:18;;;16595:62;16693:6;16673:18;;;16666:34;16717:19;;3059:80:16::1;16342:400:17::0;3059:80:16::1;3160:27;3170:3;3175:11;3160:9;:27::i;:::-;-1:-1:-1::0;;1734:1:13;2688:7;:22;-1:-1:-1;2470:722:16:o;10351:185:4:-;10489:39;10506:4;10512:2;10516:7;10489:39;;;;;;;;;;;;:16;:39::i;4394:82:16:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;4456:4:16::1;:15:::0;4394:82::o;6099:118::-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;6181:28:16::1;6192:7;6201;6181:28;;:10;:28::i;4531:106::-:0;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;4605:7:16::1;:27:::0;4531:106::o;4839:172::-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;4926:9:16::1;::::0;::::1;;:18;4918:51;;;::::0;-1:-1:-1;;;4918:51:16;;16949:2:17;4918:51:16::1;::::0;::::1;16931:21:17::0;16988:2;16968:18;;;16961:30;17027:22;17007:18;;;17000:50;17067:18;;4918:51:16::1;16747:344:17::0;4918:51:16::1;4980:7;:23;4990:13:::0;4980:7;:23:::1;:::i;7542:125:4:-:0;7606:7;7633:21;7646:7;7633:12;:21::i;:::-;:26;;7542:125;-1:-1:-1;;7542:125:4:o;565:94:16:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4990:206:4:-;5054:7;-1:-1:-1;;;;;5078:19:4;;5074:60;;5106:28;;;;;;;;;;;;;;5074:60;-1:-1:-1;;;;;;5160:19:4;;;;;:12;:19;;;;;:27;;;;4990:206::o;1714:103:11:-;1136:6;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;1779:30:::1;1806:1;1779:18;:30::i;:::-;1714:103::o:0;1608:829:16:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;1711:17:16::1;::::0;1781:35;;::::1;1773:116;;;::::0;-1:-1:-1;;;1773:116:16;;19681:2:17;1773:116:16::1;::::0;::::1;19663:21:17::0;19720:2;19700:18;;;19693:30;;;19759:34;19739:18;;;19732:62;19830:34;19810:18;;;19803:62;19902:6;19881:19;;;19874:35;19926:19;;1773:116:16::1;19479:472:17::0;1773:116:16::1;-1:-1:-1::0;1974:1:16::1;1965:191;1977:21:::0;;::::1;1965:191;;;2032:33;2051:10;;2062:1;2051:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;1120:20:0::0;1168:8;;;797:387;2032:33:16::1;:42;2024:74;;;::::0;-1:-1:-1;;;2024:74:16;;13453:2:17;2024:74:16::1;::::0;::::1;13435:21:17::0;13492:2;13472:18;;;13465:30;13531:21;13511:18;;;13504:49;13570:18;;2024:74:16::1;13251:343:17::0;2024:74:16::1;2130:7;;2138:1;2130:10;;;;;;;:::i;:::-;;;::::0;;;::::1;;2117:23:::0;;;::::1;::::0;-1:-1:-1;2000:3:16::1;;1965:191;;;2209:9;::::0;3727:1:4;4124:12;3914:7;4108:13;:28;2180:25:16;;-1:-1:-1;;2180:25:16;:38:::1;;2172:93;;;::::0;-1:-1:-1;;;2172:93:16;;20347:2:17;2172:93:16::1;::::0;::::1;20329:21:17::0;20386:2;20366:18;;;20359:30;20425:34;20405:18;;;20398:62;20496:12;20476:18;;;20469:40;20526:19;;2172:93:16::1;20145:406:17::0;2172:93:16::1;-1:-1:-1::0;2323:1:16::1;2314:108;2326:18:::0;;::::1;2314:108;;;2370:36;2380:10;;2391:1;2380:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;2395:7;;2403:1;2395:10;;;;;;;:::i;:::-;;;;;;;2370:9;:36::i;:::-;2346:3;;2314:108;;;1700:737;;1608:829:::0;;;;:::o;6661:210::-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;13093:2:17;2368:63:13;;;13075:21:17;13132:2;13112:18;;;13105:30;13171:33;13151:18;;;13144:61;13222:18;;2368:63:13;12891:355:17;2368:63:13;1778:1;2509:7;:18;1120:20:0;;1168:8;6755:68:16::1;;;::::0;-1:-1:-1;;;6755:68:16;;13453:2:17;6755:68:16::1;::::0;::::1;13435:21:17::0;13492:2;13472:18;;;13465:30;13531:21;13511:18;;;13504:49;13570:18;;6755:68:16::1;13251:343:17::0;6755:68:16::1;6834:29;6848:5;6855:7;6834:13;:29::i;:::-;-1:-1:-1::0;;1734:1:13;2688:7;:22;6661:210:16:o;5043:100:12:-;5094:7;5121;5129:5;5121:14;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;5121:14:12;;5043:100;-1:-1:-1;;5043:100:12:o;11200:96::-;11243:15;11278:10;11271:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11271:17:12;;;;;;;;;;;;;;;;;;;;;;11200:96;:::o;7903:104:4:-;7959:13;7992:7;7985:14;;;;;:::i;5504:360:16:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;5582:12:16::1;::::0;::::1;::::0;::::1;;;:21;5574:61;;;::::0;-1:-1:-1;;;5574:61:16;;20758:2:17;5574:61:16::1;::::0;::::1;20740:21:17::0;20797:2;20777:18;;;20770:30;20836:29;20816:18;;;20809:57;20883:18;;5574:61:16::1;20556:351:17::0;5574:61:16::1;5663:9;;5654:6;:18;;;5646:84;;;::::0;-1:-1:-1;;;5646:84:16;;21114:2:17;5646:84:16::1;::::0;::::1;21096:21:17::0;21153:2;21133:18;;;21126:30;21192:34;21172:18;;;21165:62;21263:23;21243:18;;;21236:51;21304:19;;5646:84:16::1;20912:417:17::0;5646:84:16::1;3727:1:4::0;4124:12;3914:7;4108:13;:28;-1:-1:-1;;4108:46:4;5749:6:16::1;:23;;;;5741:86;;;::::0;-1:-1:-1;;;5741:86:16;;21536:2:17;5741:86:16::1;::::0;::::1;21518:21:17::0;21575:2;21555:18;;;21548:30;21614:34;21594:18;;;21587:62;21685:20;21665:18;;;21658:48;21723:19;;5741:86:16::1;21334:414:17::0;5741:86:16::1;5838:18;;:9;:18:::0;5504:360::o;5916:116::-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;5997:27:16::1;6007:7;6016;5997:9;:27::i;9521:287:4:-:0;736:10:1;-1:-1:-1;;;;;9620:24:4;;;9616:54;;9653:17;;;;;;;;;;;;;;9616:54;736:10:1;9683:32:4;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;9683:42:4;;;;;;;;;;;;:53;;-1:-1:-1;;9683:53:4;;;;;;;;;;9752:48;;888:41:17;;;9683:42:4;;736:10:1;9752:48:4;;861:18:17;9752:48:4;;;;;;;9521:287;;:::o;3827:188:16:-;1778:1:13;2376:7;;:19;2368:63;;;;-1:-1:-1;;;2368:63:13;;13093:2:17;2368:63:13;;;13075:21:17;13132:2;13112:18;;;13105:30;13171:33;13151:18;;;13144:61;13222:18;;2368:63:13;12891:355:17;2368:63:13;1778:1;2509:7;:18;3914:16:16::1;3922:7:::0;3914::::1;:16::i;:::-;-1:-1:-1::0;;;;;3900:30:16::1;:10;-1:-1:-1::0;;;;;3900:30:16::1;;3892:73;;;::::0;-1:-1:-1;;;3892:73:16;;14537:2:17;3892:73:16::1;::::0;::::1;14519:21:17::0;14576:2;14556:18;;;14549:30;14615:32;14595:18;;;14588:60;14665:18;;3892:73:16::1;14335:354:17::0;3892:73:16::1;3976:24;::::0;;;:15:::1;:24;::::0;;;;:31;;-1:-1:-1;;3976:31:16::1;4003:4;3976:31:::0;;::::1;::::0;;;2688:7:13;:22;3827:188:16:o;5355:81::-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;5409:12:16::1;:19:::0;;;::::1;;;::::0;;5355:81::o;10607:369:4:-;10774:28;10784:4;10790:2;10794:7;10774:9;:28::i;:::-;-1:-1:-1;;;;;10817:13:4;;1120:20:0;1168:8;;10817:76:4;;;;;10837:56;10868:4;10874:2;10878:7;10887:5;10837:30;:56::i;:::-;10836:57;10817:76;10813:156;;;10917:40;;-1:-1:-1;;;10917:40:4;;;;;;;;;;;10813:156;10607:369;;;;:::o;8078:326::-;8151:13;8182:16;8190:7;8182;:16::i;:::-;8177:59;;8207:29;;;;;;;;;;;;;;8177:59;8249:21;8273:10;:8;:10::i;:::-;8249:34;;8307:7;8301:21;8326:1;8301:26;:95;;;;;;;;;;;;;;;;;8354:7;8363:18;:7;:16;:18::i;:::-;8337:53;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8301:95;8294:102;8078:326;-1:-1:-1;;;8078:326:4:o;6283:91:16:-;1136:6:11;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;6348:18:16::1;6358:7;6348:9;:18::i;:::-;6283:91:::0;:::o;1972:201:11:-;1136:6;;-1:-1:-1;;;;;1136:6:11;736:10:1;1283:23:11;1275:68;;;;-1:-1:-1;;;1275:68:11;;12290:2:17;1275:68:11;;;12272:21:17;;;12309:18;;;12302:30;12368:34;12348:18;;;12341:62;12420:18;;1275:68:11;12088:356:17;1275:68:11;-1:-1:-1;;;;;2061:22:11;::::1;2053:73;;;::::0;-1:-1:-1;;;2053:73:11;;22597:2:17;2053:73:11::1;::::0;::::1;22579:21:17::0;22636:2;22616:18;;;22609:30;22675:34;22655:18;;;22648:62;22746:8;22726:18;;;22719:36;22772:19;;2053:73:11::1;22395:402:17::0;2053:73:11::1;2137:28;2156:8;2137:18;:28::i;707:211:14:-:0;851:58;;;-1:-1:-1;;;;;206:55:17;;851:58:14;;;188:74:17;278:18;;;;271:34;;;851:58:14;;;;;;;;;;161:18:17;;;;851:58:14;;;;;;;;;;874:23;851:58;;;824:86;;844:5;;824:19;:86::i;2119:317:0:-;2234:6;2209:21;:31;;2201:73;;;;-1:-1:-1;;;2201:73:0;;23004:2:17;2201:73:0;;;22986:21:17;23043:2;23023:18;;;23016:30;23082:31;23062:18;;;23055:59;23131:18;;2201:73:0;22802:353:17;2201:73:0;2288:12;2306:9;-1:-1:-1;;;;;2306:14:0;2328:6;2306:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2287:52;;;2358:7;2350:78;;;;-1:-1:-1;;;2350:78:0;;23572:2:17;2350:78:0;;;23554:21:17;23611:2;23591:18;;;23584:30;23650:34;23630:18;;;23623:62;23721:28;23701:18;;;23694:56;23767:19;;2350:78:0;23370:422:17;3603:229:0;3740:12;3772:52;3794:6;3802:4;3808:1;3811:12;3772:21;:52::i;:::-;3765:59;3603:229;-1:-1:-1;;;;3603:229:0:o;1404:215:3:-;1506:4;-1:-1:-1;;;;;;1530:41:3;;1545:26;1530:41;;:81;;;1575:36;1599:11;1575:23;:36::i;2766:332::-;2482:5;2869:33;;;;;2861:88;;;;-1:-1:-1;;;2861:88:3;;23999:2:17;2861:88:3;;;23981:21:17;24038:2;24018:18;;;24011:30;24077:34;24057:18;;;24050:62;24148:12;24128:18;;;24121:40;24178:19;;2861:88:3;23797:406:17;2861:88:3;-1:-1:-1;;;;;2968:22:3;;2960:60;;;;-1:-1:-1;;;2960:60:3;;24410:2:17;2960:60:3;;;24392:21:17;24449:2;24429:18;;;24422:30;24488:27;24468:18;;;24461:55;24533:18;;2960:60:3;24208:349:17;2960:60:3;3055:35;;;;;;;;;-1:-1:-1;;;;;3055:35:3;;;;;;;;;;;;;;;;;-1:-1:-1;;;3033:57:3;;;;:19;:57;2766:332::o;11231:174:4:-;11288:4;11331:7;3727:1;11312:26;;:53;;;;;11352:13;;11342:7;:23;11312:53;:85;;;;-1:-1:-1;;11370:20:4;;;;:11;:20;;;;;:27;-1:-1:-1;;;11370:27:4;;;;11369:28;;11231:174::o;19388:196::-;19503:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;19503:29:4;-1:-1:-1;;;;;19503:29:4;;;;;;;;;19548:28;;19503:24;;19548:28;;;;;;;19388:196;;;:::o;5343:635:12:-;5414:21;5462:15;3936:14;;;3863:95;5462:15;5438:39;;:21;:39;:::i;:::-;5414:63;;5488:15;5506:58;5522:7;5531:13;5546:17;5555:7;-1:-1:-1;;;;;4617:18:12;4590:7;4617:18;;;:9;:18;;;;;;;4534:109;5546:17;5506:15;:58::i;:::-;5488:76;;5660:21;5650:7;:31;5646:95;;;-1:-1:-1;5708:21:12;5646:95;5757:11;;5753:218;;-1:-1:-1;;;;;5785:18:12;;;;;;:9;:18;;;;;:29;;5807:7;;5785:18;:29;;5807:7;;5785:29;:::i;:::-;;;;;;;;5847:7;5829:14;;:25;;;;;;;:::i;:::-;;;;-1:-1:-1;5871:35:12;;-1:-1:-1;5889:7:12;5898;5871:17;:35::i;:::-;5926:33;;;-1:-1:-1;;;;;206:55:17;;188:74;;293:2;278:18;;271:34;;;5926:33:12;;161:18:17;5926:33:12;;;;;;;5403:575;;5343:635;:::o;14331:2130:4:-;14446:35;14484:21;14497:7;14484:12;:21::i;:::-;14446:59;;14544:4;-1:-1:-1;;;;;14522:26:4;:13;:18;;;-1:-1:-1;;;;;14522:26:4;;14518:67;;14557:28;;;;;;;;;;;;;;14518:67;14598:22;736:10:1;-1:-1:-1;;;;;14624:20:4;;;;:73;;-1:-1:-1;14661:36:4;14678:4;736:10:1;9879:164:4;:::i;14661:36::-;14624:126;;;-1:-1:-1;736:10:1;14714:20:4;14726:7;14714:11;:20::i;:::-;-1:-1:-1;;;;;14714:36:4;;14624:126;14598:153;;14769:17;14764:66;;14795:35;;;;;;;;;;;;;;14764:66;-1:-1:-1;;;;;14845:16:4;;14841:52;;14870:23;;;;;;;;;;;;;;14841:52;14906:43;14928:4;14934:2;14938:7;14947:1;14906:21;:43::i;:::-;15014:35;15031:1;15035:7;15044:4;15014:8;:35::i;:::-;-1:-1:-1;;;;;15345:18:4;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;15345:31:4;;;;;;;-1:-1:-1;;15345:31:4;;;;;;;15391:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;15391:29:4;;;;;;;;;;;15471:20;;;:11;:20;;;;;;15506:18;;-1:-1:-1;;;;;;15539:49:4;;;;-1:-1:-1;;;15572:15:4;15539:49;;;;;;;;;;15862:11;;15922:24;;;;;15965:13;;15471:20;;15922:24;;15965:13;15961:384;;16175:13;;16160:11;:28;16156:174;;16213:20;;16282:28;;;;16256:54;;-1:-1:-1;;;16256:54:4;-1:-1:-1;;;;;;16256:54:4;;;-1:-1:-1;;;;;16213:20:4;;16256:54;;;;16156:174;15320:1036;;;16392:7;16388:2;-1:-1:-1;;;;;16373:27:4;16382:4;-1:-1:-1;;;;;16373:27:4;;;;;;;;;;;16411:42;14435:2026;;14331:2130;;;:::o;11534:402:12:-;11614:9;11609:320;11633:7;:14;11629:18;;11609:320;;;11706:9;11701:171;11725:10;:17;11721:21;;11701:171;;;11768:12;11783:10;11794:1;11783:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;11783:13:12;11768:28;;11815:41;11829:5;11844:7;11852:1;11844:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11844:10:12;11815:13;:41::i;:::-;-1:-1:-1;11744:3:12;;;;:::i;:::-;;;;11701:171;;;;11888:29;11905:7;11913:1;11905:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;11905:10:12;11888:8;:29::i;:::-;11649:3;;;;:::i;:::-;;;;11609:320;;11413:104:4;11482:27;11492:2;11496:8;11482:27;;;;;;;;;;;;:9;:27::i;9214:1232:12:-;9296:9;;;;9434:140;9450:7;:14;9446:18;;9434:140;;;9504:7;-1:-1:-1;;;;;9490:21:12;:7;9498:1;9490:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;9490:10:12;:21;9486:77;;-1:-1:-1;9546:1:12;9486:77;9466:3;;;;:::i;:::-;;;;9434:140;;;9592:11;9607:1;9592:16;9584:83;;;;-1:-1:-1;;;9584:83:12;;25274:2:17;9584:83:12;;;25256:21:17;25313:2;25293:18;;;25286:30;25352:34;25332:18;;;25325:62;25423:24;25403:18;;;25396:52;25465:19;;9584:83:12;25072:418:17;9584:83:12;-1:-1:-1;;;;;9710:16:12;;;;;;:7;:16;;;;;;9695:12;;9729:7;;9695:31;;;:::i;:::-;:41;;;;:::i;:::-;9680:56;;9770:1;9755:12;:16;9747:81;;;;-1:-1:-1;;;9747:81:12;;25827:2:17;9747:81:12;;;25809:21:17;25866:2;25846:18;;;25839:30;25905:34;25885:18;;;25878:62;25976:22;25956:18;;;25949:50;26016:19;;9747:81:12;25625:416:17;9747:81:12;9909:11;:9;:11::i;:::-;9948:1;9931:14;:18;;;9948:1;-1:-1:-1;9960:89:12;9976:7;:14;9972:18;;9960:89;;;10036:1;10012:9;:21;10022:7;10030:1;10022:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;10022:10:12;10012:21;;;;;;;;;;;;:25;9992:3;;;;:::i;:::-;;;;9960:89;;;10096:1;10092:5;;10087:275;10103:10;:17;10099:21;;10087:275;;;10142:12;10157:10;10168:1;10157:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;10157:13:12;10185:26;;;:19;:26;;;;;;:30;;;10157:13;;-1:-1:-1;10157:13:12;-1:-1:-1;10242:109:12;10258:7;:14;10254:18;;10242:109;;;-1:-1:-1;;;;;10298:21:12;;10334:1;10298:21;;;:14;:21;;;;;10320:7;:10;;10334:1;;10320:7;10328:1;;10320:10;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;10320:10:12;10298:33;;;;;;;;;;;;:37;10274:3;;;;:::i;:::-;;;;10242:109;;;-1:-1:-1;10122:3:12;;;;:::i;:::-;;;;10087:275;;;-1:-1:-1;10374:12:12;:27;-1:-1:-1;;;;;;;10412:16:12;;;;;;;:7;:16;;;;;:26;9214:1232::o;6371:1109:4:-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;6482:7:4;;3727:1;6531:23;;:47;;;;;6565:13;;6558:4;:20;6531:47;6527:886;;;6599:31;6633:17;;;:11;:17;;;;;;;;;6599:51;;;;;;;;;-1:-1:-1;;;;;6599:51:4;;;;-1:-1:-1;;;6599:51:4;;;;;;;;;;;-1:-1:-1;;;6599:51:4;;;;;;;;;;;;;;6669:729;;6719:14;;-1:-1:-1;;;;;6719:28:4;;6715:101;;6783:9;6371:1109;-1:-1:-1;;;6371:1109:4:o;6715:101::-;-1:-1:-1;;;7158:6:4;7203:17;;;;:11;:17;;;;;;;;;7191:29;;;;;;;;;-1:-1:-1;;;;;7191:29:4;;;;;-1:-1:-1;;;7191:29:4;;;;;;;;;;;-1:-1:-1;;;7191:29:4;;;;;;;;;;;;;7251:28;7247:109;;7319:9;6371:1109;-1:-1:-1;;;6371:1109:4:o;7247:109::-;7118:261;;;6580:833;6527:886;7441:31;;;;;;;;;;;;;;2333:191:11;2426:6;;;-1:-1:-1;;;;;2443:17:11;;;-1:-1:-1;;2443:17:11;;;;;;;2476:40;;2426:6;;;2443:17;2426:6;;2476:40;;2407:16;;2476:40;2396:128;2333:191;:::o;6246:750:12:-;-1:-1:-1;;;;;4205:26:12;;6336:21;4205:26;;;:19;:26;;;;;;6360:30;;-1:-1:-1;;;6360:30:12;;6384:4;6360:30;;;2680:74:17;-1:-1:-1;;;;;6360:15:12;;;;;2653:18:17;;6360:30:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:58;;;;:::i;:::-;6336:82;;6429:15;6447:70;6463:7;6472:13;6487:29;6501:5;6508:7;-1:-1:-1;;;;;4914:21:12;;;4887:7;4914:21;;;:14;:21;;;;;;;;:30;;;;;;;;;;;;;4812:140;6447:70;6612:30;;-1:-1:-1;;;6612:30:12;;6636:4;6612:30;;;2680:74:17;6429:88:12;;-1:-1:-1;;;;;;6612:15:12;;;;;2653:18:17;;6612:30:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6602:7;:40;6598:113;;;6669:30;;-1:-1:-1;;;6669:30:12;;6693:4;6669:30;;;2680:74:17;-1:-1:-1;;;;;6669:15:12;;;;;2653:18:17;;6669:30:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6659:40;;6598:113;6727:11;;6723:266;;-1:-1:-1;;;;;6755:21:12;;;;;;;:14;:21;;;;;;;;:30;;;;;;;;;;;:41;;6789:7;;6755:21;:41;;6789:7;;6755:41;:::i;:::-;;;;-1:-1:-1;;;;;;;6811:26:12;;;;;;:19;:26;;;;;:37;;6841:7;;6811:26;:37;;6841:7;;6811:37;:::i;:::-;;;;-1:-1:-1;6865:47:12;;-1:-1:-1;6888:5:12;6895:7;6904;6865:22;:47::i;:::-;6932:45;;;-1:-1:-1;;;;;206:55:17;;;188:74;;293:2;278:18;;271:34;;;6932:45:12;;;;;161:18:17;6932:45:12;;;;;;;6325:671;;6246:750;;:::o;7765:1399::-;7845:9;;1120:20:0;;1168:8;7887:78:12;;;;-1:-1:-1;;;7887:78:12;;26437:2:17;7887:78:12;;;26419:21:17;26476:2;26456:18;;;26449:30;26515:31;26495:18;;;26488:59;26564:18;;7887:78:12;26235:353:17;7887:78:12;8046:16;8082:1;8078:5;;8073:140;8089:7;:14;8085:18;;8073:140;;;8143:7;-1:-1:-1;;;;;8129:21:12;:7;8137:1;8129:10;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;8129:10:12;:21;8125:77;;-1:-1:-1;8185:1:12;8125:77;8105:3;;;;:::i;:::-;;;;8073:140;;;8262:11;8277:1;8262:16;8258:899;;8371:11;;;;8367:600;;8403:11;:9;:11::i;:::-;8450:1;8433:14;:18;;;8450:1;-1:-1:-1;8470:105:12;8486:7;:14;8482:18;;8470:105;;;8554:1;8530:9;:21;8540:7;8548:1;8540:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;8540:10:12;8530:21;;;;;;;;;;;;:25;8502:3;;;;:::i;:::-;;;;8470:105;;;8638:1;8634:5;;8629:323;8645:10;:17;8641:21;;8629:323;;;8692:12;8707:10;8718:1;8707:13;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;8707:13:12;8743:26;;;:19;:26;;;;;;:30;;;8707:13;;-1:-1:-1;8707:13:12;-1:-1:-1;8808:125:12;8824:7;:14;8820:18;;8808:125;;;-1:-1:-1;;;;;8872:21:12;;8908:1;8872:21;;;:14;:21;;;;;8894:7;:10;;8908:1;;8894:7;8902:1;;8894:10;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;8894:10:12;8872:33;;;;;;;;;;;;:37;8840:3;;;;:::i;:::-;;;;8808:125;;;-1:-1:-1;8664:3:12;;;;:::i;:::-;;;;8629:323;;;8983:7;:21;;;;;;;;;;;;-1:-1:-1;;8983:21:12;-1:-1:-1;;;;;8983:21:12;;;;;;;;-1:-1:-1;9019:16:12;;;:7;8983:21;9019:16;;;;:26;;;;;;;9075:12;;:22;;9019:26;9075:22;:::i;:::-;9060:12;:37;9117:28;;;-1:-1:-1;;;;;26783:55:17;;26765:74;;26887:6;26875:19;;26870:2;26855:18;;26848:47;9117:28:12;;26738:18:17;9117:28:12;;;;;;;7834:1330;;;7765:1399;;:::o;20076:667:4:-;20260:72;;;;;20239:4;;-1:-1:-1;;;;;20260:36:4;;;;;:72;;736:10:1;;20311:4:4;;20317:7;;20326:5;;20260:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20260:72:4;;;;;;;;-1:-1:-1;;20260:72:4;;;;;;;;;;;;:::i;:::-;;;20256:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20494:6;:13;20511:1;20494:18;20490:235;;20540:40;;-1:-1:-1;;;20540:40:4;;;;;;;;;;;20490:235;20683:6;20677:13;20668:6;20664:2;20660:15;20653:38;20256:480;-1:-1:-1;;;;;;20379:55:4;20389:45;20379:55;;-1:-1:-1;20076:667:4;;;;;;:::o;5163:108:16:-;5223:13;5256:7;5249:14;;;;;:::i;342:723:15:-;398:13;619:5;628:1;619:10;615:53;;-1:-1:-1;;646:10:15;;;;;;;;;;;;;;;;;;342:723::o;615:53::-;693:5;678:12;734:78;741:9;;734:78;;767:8;;;;:::i;:::-;;-1:-1:-1;790:10:15;;-1:-1:-1;798:2:15;790:10;;:::i;:::-;;;734:78;;;822:19;854:6;844:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;844:17:15;;822:39;;872:154;879:10;;872:154;;906:11;916:1;906:11;;:::i;:::-;;-1:-1:-1;975:10:15;983:2;975:5;:10;:::i;:::-;962:24;;:2;:24;:::i;:::-;949:39;;932:6;939;932:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1003:11:15;1012:2;1003:11;;:::i;:::-;;;872:154;;10503:624:12;10602:4;1120:20:0;;1168:8;;10573:33:12;10565:81;;;;-1:-1:-1;;;10565:81:12;;27996:2:17;10565:81:12;;;27978:21:17;28035:2;28015:18;;;28008:30;28074:34;28054:18;;;28047:62;28145:5;28125:18;;;28118:33;28168:19;;10565:81:12;27794:399:17;10565:81:12;10691:38;;-1:-1:-1;;;10691:38:12;;10723:4;10691:38;;;2680:74:17;-1:-1:-1;;;;;10691:23:12;;;;;2653:18:17;;10691:38:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;10810:16;10846:9;10841:160;10865:10;:17;10861:21;;10841:160;;;10932:5;-1:-1:-1;;;;;10908:30:12;:10;10919:1;10908:13;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;10908:13:12;:30;10904:86;;10973:1;10959:15;;10904:86;10884:3;;;;:::i;:::-;;;;10841:160;;;-1:-1:-1;11019:16:12;;11011:65;;;;-1:-1:-1;;;11011:65:12;;28400:2:17;11011:65:12;;;28382:21:17;28439:2;28419:18;;;28412:30;28478:34;28458:18;;;28451:62;28549:6;28529:18;;;28522:34;28573:19;;11011:65:12;28198:400:17;11011:65:12;-1:-1:-1;11089:10:12;:30;;;;;;;-1:-1:-1;11089:30:12;;;;;;;;-1:-1:-1;;11089:30:12;-1:-1:-1;;;;;11089:30:12;;;;;;;;;;10503:624::o;3280:716:14:-;3704:23;3730:69;3758:4;3730:69;;;;;;;;;;;;;;;;;3738:5;-1:-1:-1;;;;;3730:27:14;;;:69;;;;;:::i;:::-;3814:17;;3704:95;;-1:-1:-1;3814:21:14;3810:179;;3911:10;3900:30;;;;;;;;;;;;:::i;:::-;3892:85;;;;-1:-1:-1;;;3892:85:14;;29055:2:17;3892:85:14;;;29037:21:17;29094:2;29074:18;;;29067:30;29133:34;29113:18;;;29106:62;29204:12;29184:18;;;29177:40;29234:19;;3892:85:14;28853:406:17;4723:510:0;4893:12;4951:5;4926:21;:30;;4918:81;;;;-1:-1:-1;;;4918:81:0;;29466:2:17;4918:81:0;;;29448:21:17;29505:2;29485:18;;;29478:30;29544:34;29524:18;;;29517:62;29615:8;29595:18;;;29588:36;29641:19;;4918:81:0;29264:402:17;4918:81:0;1120:20;;5010:60;;;;-1:-1:-1;;;5010:60:0;;29873:2:17;5010:60:0;;;29855:21:17;29912:2;29892:18;;;29885:30;29951:31;29931:18;;;29924:59;30000:18;;5010:60:0;29671:353:17;5010:60:0;5084:12;5098:23;5125:6;-1:-1:-1;;;;;5125:11:0;5144:5;5151:4;5125:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5083:73;;;;5174:51;5191:7;5200:10;5212:12;5174:16;:51::i;:::-;5167:58;4723:510;-1:-1:-1;;;;;;;4723:510:0:o;4621:305:4:-;4723:4;-1:-1:-1;;;;;;4760:40:4;;4775:25;4760:40;;:105;;-1:-1:-1;;;;;;;4817:48:4;;4832:33;4817:48;4760:105;:158;;;-1:-1:-1;978:25:2;-1:-1:-1;;;;;;963:40:2;;;4882:36:4;854:157:2;7174:399:12;7320:7;7340:16;7371:12;;7387:1;7371:17;7367:173;;-1:-1:-1;7416:1:12;7367:173;;;7498:12;;-1:-1:-1;;;;;7478:16:12;;;;;;:7;:16;;;;;;7513:15;;7498:12;7462:32;;:13;:32;:::i;:::-;7461:49;;;;:::i;:::-;:67;;;;:::i;:::-;7450:78;7557:8;-1:-1:-1;;;;;7174:399:12:o;3242:246:16:-;3396:29;;;;:15;:29;;;;;;;;:38;3388:92;;;;-1:-1:-1;;;3388:92:16;;30510:2:17;3388:92:16;;;30492:21:17;30549:2;30529:18;;;30522:30;30588:34;30568:18;;;30561:62;30659:11;30639:18;;;30632:39;30688:19;;3388:92:16;30308:405:17;11880:163:4;12003:32;12009:2;12013:8;12023:5;12030:4;12003:5;:32::i;7409:712:0:-;7559:12;7588:7;7584:530;;;-1:-1:-1;7619:10:0;7612:17;;7584:530;7733:17;;:21;7729:374;;7931:10;7925:17;7992:15;7979:10;7975:2;7971:19;7964:44;7729:374;8074:12;8067:20;;-1:-1:-1;;;8067:20:0;;;;;;;;:::i;12302:1775:4:-;12441:20;12464:13;-1:-1:-1;;;;;12492:16:4;;12488:48;;12517:19;;;;;;;;;;;;;;12488:48;12551:8;12563:1;12551:13;12547:44;;12573:18;;;;;;;;;;;;;;12547:44;12604:61;12634:1;12638:2;12642:12;12656:8;12604:21;:61::i;:::-;-1:-1:-1;;;;;12942:16:4;;;;;;:12;:16;;;;;;;;:44;;13001:49;;;12942:44;;;;;;;;13001:49;;;;-1:-1:-1;;12942:44:4;;;;;;13001:49;;;;;;;;;;;;;;;;13067:25;;;:11;:25;;;;;;:35;;-1:-1:-1;;;;;;13117:66:4;;;;-1:-1:-1;;;13167:15:4;13117:66;;;;;;;;;;13067:25;13264:23;;;13308:4;:23;;;;-1:-1:-1;;;;;;13316:13:4;;1120:20:0;1168:8;;13316:15:4;13304:641;;;13352:314;13383:38;;13408:12;;-1:-1:-1;;;;;13383:38:4;;;13400:1;;13383:38;;13400:1;;13383:38;13449:69;13488:1;13492:2;13496:14;;;;;;13512:5;13449:30;:69::i;:::-;13444:174;;13554:40;;-1:-1:-1;;;13554:40:4;;;;;;;;;;;13444:174;13661:3;13645:12;:19;13352:314;;13747:12;13730:13;;:29;13726:43;;13761:8;;;13726:43;13304:641;;;13810:120;13841:40;;13866:14;;;;;-1:-1:-1;;;;;13841:40:4;;;13858:1;;13841:40;;13858:1;;13841:40;13925:3;13909:12;:19;13810:120;;13304:641;-1:-1:-1;13959:13:4;:28;14009:60;10607:369;316:177:17;-1:-1:-1;;;;;;394:5:17;390:78;383:5;380:89;370:117;;483:1;480;473:12;498:245;556:6;609:2;597:9;588:7;584:23;580:32;577:52;;;625:1;622;615:12;577:52;664:9;651:23;683:30;707:5;683:30;:::i;940:154::-;-1:-1:-1;;;;;1019:5:17;1015:54;1008:5;1005:65;995:93;;1084:1;1081;1074:12;1099:435;1166:6;1174;1227:2;1215:9;1206:7;1202:23;1198:32;1195:52;;;1243:1;1240;1233:12;1195:52;1282:9;1269:23;1301:31;1326:5;1301:31;:::i;:::-;1351:5;-1:-1:-1;1408:2:17;1393:18;;1380:32;1456:26;1443:40;;1431:53;;1421:81;;1498:1;1495;1488:12;1421:81;1521:7;1511:17;;;1099:435;;;;;:::o;1539:258::-;1611:1;1621:113;1635:6;1632:1;1629:13;1621:113;;;1711:11;;;1705:18;1692:11;;;1685:39;1657:2;1650:10;1621:113;;;1752:6;1749:1;1746:13;1743:48;;;-1:-1:-1;;1787:1:17;1769:16;;1762:27;1539:258::o;1802:317::-;1844:3;1882:5;1876:12;1909:6;1904:3;1897:19;1925:63;1981:6;1974:4;1969:3;1965:14;1958:4;1951:5;1947:16;1925:63;:::i;:::-;2033:2;2021:15;-1:-1:-1;;2017:88:17;2008:98;;;;2108:4;2004:109;;1802:317;-1:-1:-1;;1802:317:17:o;2124:220::-;2273:2;2262:9;2255:21;2236:4;2293:45;2334:2;2323:9;2319:18;2311:6;2293:45;:::i;2349:180::-;2408:6;2461:2;2449:9;2440:7;2436:23;2432:32;2429:52;;;2477:1;2474;2467:12;2429:52;-1:-1:-1;2500:23:17;;2349:180;-1:-1:-1;2349:180:17:o;2765:315::-;2833:6;2841;2894:2;2882:9;2873:7;2869:23;2865:32;2862:52;;;2910:1;2907;2900:12;2862:52;2949:9;2936:23;2968:31;2993:5;2968:31;:::i;:::-;3018:5;3070:2;3055:18;;;;3042:32;;-1:-1:-1;;;2765:315:17:o;3085:681::-;3256:2;3308:21;;;3378:13;;3281:18;;;3400:22;;;3227:4;;3256:2;3479:15;;;;3453:2;3438:18;;;3227:4;3522:218;3536:6;3533:1;3530:13;3522:218;;;3601:13;;-1:-1:-1;;;;;3597:62:17;3585:75;;3715:15;;;;3680:12;;;;3558:1;3551:9;3522:218;;;-1:-1:-1;3757:3:17;;3085:681;-1:-1:-1;;;;;;3085:681:17:o;3953:118::-;4039:5;4032:13;4025:21;4018:5;4015:32;4005:60;;4061:1;4058;4051:12;4076:241;4132:6;4185:2;4173:9;4164:7;4160:23;4156:32;4153:52;;;4201:1;4198;4191:12;4153:52;4240:9;4227:23;4259:28;4281:5;4259:28;:::i;4322:255::-;4389:6;4442:2;4430:9;4421:7;4417:23;4413:32;4410:52;;;4458:1;4455;4448:12;4410:52;4497:9;4484:23;4516:31;4541:5;4516:31;:::i;4582:456::-;4659:6;4667;4675;4728:2;4716:9;4707:7;4703:23;4699:32;4696:52;;;4744:1;4741;4734:12;4696:52;4783:9;4770:23;4802:31;4827:5;4802:31;:::i;:::-;4852:5;-1:-1:-1;4909:2:17;4894:18;;4881:32;4922:33;4881:32;4922:33;:::i;:::-;4582:456;;4974:7;;-1:-1:-1;;;5028:2:17;5013:18;;;;5000:32;;4582:456::o;5310:248::-;5378:6;5386;5439:2;5427:9;5418:7;5414:23;5410:32;5407:52;;;5455:1;5452;5445:12;5407:52;-1:-1:-1;;5478:23:17;;;5548:2;5533:18;;;5520:32;;-1:-1:-1;5310:248:17:o;5563:159::-;5630:20;;5690:6;5679:18;;5669:29;;5659:57;;5712:1;5709;5702:12;5659:57;5563:159;;;:::o;5727:319::-;5794:6;5802;5855:2;5843:9;5834:7;5830:23;5826:32;5823:52;;;5871:1;5868;5861:12;5823:52;5910:9;5897:23;5929:31;5954:5;5929:31;:::i;:::-;5979:5;-1:-1:-1;6003:37:17;6036:2;6021:18;;6003:37;:::i;:::-;5993:47;;5727:319;;;;;:::o;6051:403::-;6134:6;6142;6195:2;6183:9;6174:7;6170:23;6166:32;6163:52;;;6211:1;6208;6201:12;6163:52;6250:9;6237:23;6269:31;6294:5;6269:31;:::i;:::-;6319:5;-1:-1:-1;6376:2:17;6361:18;;6348:32;6389:33;6348:32;6389:33;:::i;6459:184::-;-1:-1:-1;;;6508:1:17;6501:88;6608:4;6605:1;6598:15;6632:4;6629:1;6622:15;6648:691;6713:5;6743:18;6784:2;6776:6;6773:14;6770:40;;;6790:18;;:::i;:::-;6924:2;6918:9;6990:2;6978:15;;-1:-1:-1;;6974:24:17;;;7000:2;6970:33;6966:42;6954:55;;;7024:18;;;7044:22;;;7021:46;7018:72;;;7070:18;;:::i;:::-;7110:10;7106:2;7099:22;7139:6;7130:15;;7169:6;7161;7154:22;7209:3;7200:6;7195:3;7191:16;7188:25;7185:45;;;7226:1;7223;7216:12;7185:45;7276:6;7271:3;7264:4;7256:6;7252:17;7239:44;7331:1;7324:4;7315:6;7307;7303:19;7299:30;7292:41;;;;6648:691;;;;;:::o;7344:451::-;7413:6;7466:2;7454:9;7445:7;7441:23;7437:32;7434:52;;;7482:1;7479;7472:12;7434:52;7522:9;7509:23;7555:18;7547:6;7544:30;7541:50;;;7587:1;7584;7577:12;7541:50;7610:22;;7663:4;7655:13;;7651:27;-1:-1:-1;7641:55:17;;7692:1;7689;7682:12;7641:55;7715:74;7781:7;7776:2;7763:16;7758:2;7754;7750:11;7715:74;:::i;8052:367::-;8115:8;8125:6;8179:3;8172:4;8164:6;8160:17;8156:27;8146:55;;8197:1;8194;8187:12;8146:55;-1:-1:-1;8220:20:17;;8263:18;8252:30;;8249:50;;;8295:1;8292;8285:12;8249:50;8332:4;8324:6;8320:17;8308:29;;8392:3;8385:4;8375:6;8372:1;8368:14;8360:6;8356:27;8352:38;8349:47;8346:67;;;8409:1;8406;8399:12;8424:773;8546:6;8554;8562;8570;8623:2;8611:9;8602:7;8598:23;8594:32;8591:52;;;8639:1;8636;8629:12;8591:52;8679:9;8666:23;8708:18;8749:2;8741:6;8738:14;8735:34;;;8765:1;8762;8755:12;8735:34;8804:70;8866:7;8857:6;8846:9;8842:22;8804:70;:::i;:::-;8893:8;;-1:-1:-1;8778:96:17;-1:-1:-1;8981:2:17;8966:18;;8953:32;;-1:-1:-1;8997:16:17;;;8994:36;;;9026:1;9023;9016:12;8994:36;;9065:72;9129:7;9118:8;9107:9;9103:24;9065:72;:::i;:::-;8424:773;;;;-1:-1:-1;9156:8:17;-1:-1:-1;;;;8424:773:17:o;10319:184::-;10377:6;10430:2;10418:9;10409:7;10405:23;10401:32;10398:52;;;10446:1;10443;10436:12;10398:52;10469:28;10487:9;10469:28;:::i;10508:382::-;10573:6;10581;10634:2;10622:9;10613:7;10609:23;10605:32;10602:52;;;10650:1;10647;10640:12;10602:52;10689:9;10676:23;10708:31;10733:5;10708:31;:::i;:::-;10758:5;-1:-1:-1;10815:2:17;10800:18;;10787:32;10828:30;10787:32;10828:30;:::i;10895:795::-;10990:6;10998;11006;11014;11067:3;11055:9;11046:7;11042:23;11038:33;11035:53;;;11084:1;11081;11074:12;11035:53;11123:9;11110:23;11142:31;11167:5;11142:31;:::i;:::-;11192:5;-1:-1:-1;11249:2:17;11234:18;;11221:32;11262:33;11221:32;11262:33;:::i;:::-;11314:7;-1:-1:-1;11368:2:17;11353:18;;11340:32;;-1:-1:-1;11423:2:17;11408:18;;11395:32;11450:18;11439:30;;11436:50;;;11482:1;11479;11472:12;11436:50;11505:22;;11558:4;11550:13;;11546:27;-1:-1:-1;11536:55:17;;11587:1;11584;11577:12;11536:55;11610:74;11676:7;11671:2;11658:16;11653:2;11649;11645:11;11610:74;:::i;:::-;11600:84;;;10895:795;;;;;;;:::o;12449:437::-;12528:1;12524:12;;;;12571;;;12592:61;;12646:4;12638:6;12634:17;12624:27;;12592:61;12699:2;12691:6;12688:14;12668:18;12665:38;12662:218;;-1:-1:-1;;;12733:1:17;12726:88;12837:4;12834:1;12827:15;12865:4;12862:1;12855:15;12662:218;;12449:437;;;:::o;13599:184::-;-1:-1:-1;;;13648:1:17;13641:88;13748:4;13745:1;13738:15;13772:4;13769:1;13762:15;13788:228;13828:7;13954:1;-1:-1:-1;;13882:74:17;13879:1;13876:81;13871:1;13864:9;13857:17;13853:105;13850:131;;;13961:18;;:::i;:::-;-1:-1:-1;14001:9:17;;13788:228::o;14021:184::-;-1:-1:-1;;;14070:1:17;14063:88;14170:4;14167:1;14160:15;14194:4;14191:1;14184:15;14210:120;14250:1;14276;14266:35;;14281:18;;:::i;:::-;-1:-1:-1;14315:9:17;;14210:120::o;15803:128::-;15843:3;15874:1;15870:6;15867:1;15864:13;15861:39;;;15880:18;;:::i;:::-;-1:-1:-1;15916:9:17;;15803:128::o;17222:545::-;17324:2;17319:3;17316:11;17313:448;;;17360:1;17385:5;17381:2;17374:17;17430:4;17426:2;17416:19;17500:2;17488:10;17484:19;17481:1;17477:27;17471:4;17467:38;17536:4;17524:10;17521:20;17518:47;;;-1:-1:-1;17559:4:17;17518:47;17614:2;17609:3;17605:12;17602:1;17598:20;17592:4;17588:31;17578:41;;17669:82;17687:2;17680:5;17677:13;17669:82;;;17732:17;;;17713:1;17702:13;17669:82;;18003:1471;18129:3;18123:10;18156:18;18148:6;18145:30;18142:56;;;18178:18;;:::i;:::-;18207:97;18297:6;18257:38;18289:4;18283:11;18257:38;:::i;:::-;18251:4;18207:97;:::i;:::-;18359:4;;18423:2;18412:14;;18440:1;18435:782;;;;19261:1;19278:6;19275:89;;;-1:-1:-1;19330:19:17;;;19324:26;19275:89;-1:-1:-1;;17900:1:17;17896:11;;;17892:84;17888:89;17878:100;17984:1;17980:11;;;17875:117;19377:81;;18405:1063;;18435:782;17169:1;17162:14;;;17206:4;17193:18;;-1:-1:-1;;18471:79:17;;;18648:236;18662:7;18659:1;18656:14;18648:236;;;18751:19;;;18745:26;18730:42;;18843:27;;;;18811:1;18799:14;;;;18678:19;;18648:236;;;18652:3;18912:6;18903:7;18900:19;18897:261;;;18973:19;;;18967:26;-1:-1:-1;;19056:1:17;19052:14;;;19068:3;19048:24;19044:97;19040:102;19025:118;19010:134;;18897:261;-1:-1:-1;;;;;19204:1:17;19188:14;;;19184:22;19171:36;;-1:-1:-1;18003:1471:17:o;19956:184::-;-1:-1:-1;;;20005:1:17;19998:88;20105:4;20102:1;20095:15;20129:4;20126:1;20119:15;21753:637;22033:3;22071:6;22065:13;22087:53;22133:6;22128:3;22121:4;22113:6;22109:17;22087:53;:::i;:::-;22203:13;;22162:16;;;;22225:57;22203:13;22162:16;22259:4;22247:17;;22225:57;:::i;:::-;22347:7;22304:20;;22333:22;;;22382:1;22371:13;;21753:637;-1:-1:-1;;;;21753:637:17:o;24872:195::-;24911:3;-1:-1:-1;;24935:5:17;24932:77;24929:103;;25012:18;;:::i;:::-;-1:-1:-1;25059:1:17;25048:13;;24872:195::o;25495:125::-;25535:4;25563:1;25560;25557:8;25554:34;;;25568:18;;:::i;:::-;-1:-1:-1;25605:9:17;;25495:125::o;26046:184::-;26116:6;26169:2;26157:9;26148:7;26144:23;26140:32;26137:52;;;26185:1;26182;26175:12;26137:52;-1:-1:-1;26208:16:17;;26046:184;-1:-1:-1;26046:184:17:o;26906:512::-;27100:4;-1:-1:-1;;;;;27210:2:17;27202:6;27198:15;27187:9;27180:34;27262:2;27254:6;27250:15;27245:2;27234:9;27230:18;27223:43;;27302:6;27297:2;27286:9;27282:18;27275:34;27345:3;27340:2;27329:9;27325:18;27318:31;27366:46;27407:3;27396:9;27392:19;27384:6;27366:46;:::i;:::-;27358:54;26906:512;-1:-1:-1;;;;;;26906:512:17:o;27423:249::-;27492:6;27545:2;27533:9;27524:7;27520:23;27516:32;27513:52;;;27561:1;27558;27551:12;27513:52;27593:9;27587:16;27612:30;27636:5;27612:30;:::i;27677:112::-;27709:1;27735;27725:35;;27740:18;;:::i;:::-;-1:-1:-1;27774:9:17;;27677:112::o;28603:245::-;28670:6;28723:2;28711:9;28702:7;28698:23;28694:32;28691:52;;;28739:1;28736;28729:12;28691:52;28771:9;28765:16;28790:28;28812:5;28790:28;:::i;30029:274::-;30158:3;30196:6;30190:13;30212:53;30258:6;30253:3;30246:4;30238:6;30234:17;30212:53;:::i;:::-;30281:16;;;;;30029:274;-1:-1:-1;;30029:274:17:o

Swarm Source

ipfs://084c9cdf0fe7545d5e300528d5e65959ebfb644177136177852a9128b94de9de
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.