ETH Price: $2,771.04 (-0.29%)
 

Overview

Max Total Supply

6 GEGG

Holders

2

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
albertohofman.eth
Balance
5 GEGG
0x17e4a86db94a6015fd6f560befd43e378f077542
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:
GoblinEgg

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: GPL-3.0

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {
    
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    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;

        _;

        _status = _NOT_ENTERED;
    }
}


// File: @openzeppelin/contracts/utils/Strings.sol

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    function toString(uint256 value) internal pure returns (string memory) {

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(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);
    }
}


// File: @openzeppelin/contracts/utils/Context.sol

// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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: @openzeppelin/contracts/access/Ownable.sol

pragma solidity ^0.8.0;

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: @openzeppelin/contracts/utils/Address.sol

// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    
    function isContract(address account) internal view returns (bool) {
        return account.code.length > 0;
    }

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

    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        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: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

interface IERC721Receiver {
  
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}


// File: @openzeppelin/contracts/utils/introspection/ERC165.sol

// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

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: @openzeppelin/contracts/token/ERC721/IERC721.sol

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

  
    function ownerOf(uint256 tokenId) external view returns (address owner);


    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

  
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

 
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;


    function approve(address to, uint256 tokenId) external;


    function setApprovalForAll(address operator, bool _approved) external;


    function getApproved(uint256 tokenId) external view returns (address operator);

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


// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

/**
 * @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: erc721a/contracts/IERC721A.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A is IERC721, IERC721Metadata {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     * 
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);
}


// File: erc721a/contracts/ERC721A.sol

// ERC721A Contracts v3.3.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @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, IERC721A {
    using Address for address;
    using Strings for uint256;

    // 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;

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view override 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) if (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())) : '';
    }

    /**
     * @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) if(!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()) if(!_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;
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 (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 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) 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;

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


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

 
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}


    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


// File: contracts/GoblinEgg.sol
// Goblin Egg

pragma solidity >=0.8.0 <0.9.0;

contract GoblinEgg is ERC721A, Ownable, ReentrancyGuard {
  using Strings for uint256;

  mapping(address => uint256) public addressMintedBalance;

  string public baseURI;
  string public notRevealedUri;
  string public baseExtension = ".json";

  uint256 public maxSupply = 4269;
  uint256 public MaxperTx = 5;
  uint256 public nftPerAddressLimit = 5;

  bool public paused = true;
  bool public revealed = false;

  constructor() ERC721A("Goblin Egg", "GEGG") {
    setNotRevealedUri("ipfs://QmZ3EnbbqeBWPVtRvL5x8pfcGAzg2EtvTJN65Ct3E2jHoN/hidden.json");
  }

  // internal
  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  // FREE MINT
  function freemint(uint256 tokens) public payable nonReentrant {
    
    uint256 supply = totalSupply();
    uint256 ownerMintedCount = addressMintedBalance[msg.sender];

    if (msg.sender != owner()) {
        require(!paused, "Contract is paused.");
        require(tokens <= MaxperTx, "Max mint amount per tx exceeded.");
        require(ownerMintedCount < 5 && ownerMintedCount + tokens <= nftPerAddressLimit, "Max mint amount per wallet exceeded.");
        }

    require(tokens > 0, "Need to mint at least 1 NFT.");
    require(tokens > 0 && tokens <= MaxperTx, "Invalid mint amount!");
    require(supply + tokens <= maxSupply, "We Sold out.");

    addressMintedBalance[msg.sender] += tokens;
    _safeMint(_msgSender(), tokens);
  }

  // FREE GIFT
  function freegift(uint256 _mintAmount, address destination) public onlyOwner nonReentrant {
    uint256 supply = totalSupply();
    
    require(_mintAmount > 0, "need to mint at least 1 NFT.");
    require(supply + _mintAmount <= maxSupply, "max NFT limit exceeded.");

    _safeMint(destination, _mintAmount);
  }

  // URIs
  function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
    require(_exists(tokenId), "ERC721AMetadata: URI query for nonexistent token");

    if (revealed == false) {
        return notRevealedUri;
        }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
        : "";
  }

  // Only owner
  function setMaxPerTx(uint256 _limit) public onlyOwner {
    MaxperTx = _limit;
  }

  function setMaxsupply(uint256 _newsupply) public onlyOwner {
    maxSupply = _newsupply;
  }

  function setBaseURI(string memory _newBaseURI) public onlyOwner {
    baseURI = _newBaseURI;
  }

  function setNotRevealedUri(string memory _notRevealedUri) public onlyOwner {
    notRevealedUri = _notRevealedUri;
  }

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function reveal(bool _state) public onlyOwner {
    revealed = _state;
  }

  function pause(bool _state) public onlyOwner {
    paused = _state;
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MaxperTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"destination","type":"address"}],"name":"freegift","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokens","type":"uint256"}],"name":"freemint","outputs":[],"stateMutability":"payable","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":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedUri","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":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newsupply","type":"uint256"}],"name":"setMaxsupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedUri","type":"string"}],"name":"setNotRevealedUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600d90805190602001906200005192919062000360565b506110ad600e556005600f5560056010556001601160006101000a81548160ff0219169083151502179055506000601160016101000a81548160ff021916908315150217905550348015620000a557600080fd5b506040518060400160405280600a81526020017f476f626c696e20456767000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f474547470000000000000000000000000000000000000000000000000000000081525081600290805190602001906200012a92919062000360565b5080600390805190602001906200014392919062000360565b5062000154620001b460201b60201c565b60008190555050506200017c62000170620001bd60201b60201c565b620001c560201b60201c565b6001600981905550620001ae604051806080016040528060418152602001620044ab604191396200028b60201b60201c565b620004f8565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200029b620001bd60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002c16200033660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200031a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003119062000437565b60405180910390fd5b80600c90805190602001906200033292919062000360565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b8280546200036e906200046a565b90600052602060002090601f016020900481019282620003925760008555620003de565b82601f10620003ad57805160ff1916838001178555620003de565b82800160010185558215620003de579182015b82811115620003dd578251825591602001919060010190620003c0565b5b509050620003ed9190620003f1565b5090565b5b808211156200040c576000816000905550600101620003f2565b5090565b60006200041f60208362000459565b91506200042c82620004cf565b602082019050919050565b60006020820190508181036000830152620004528162000410565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200048357607f821691505b602082108114156200049a5762000499620004a0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b613fa380620005086000396000f3fe6080604052600436106102045760003560e01c806370a0823111610118578063c17ecd12116100a0578063d5abeb011161006f578063d5abeb0114610744578063da3ef23f1461076f578063e985e9c514610798578063f2fde38b146107d5578063ff645691146107fe57610204565b8063c17ecd121461068a578063c6682862146106b3578063c6f6f216146106de578063c87b56dd1461070757610204565b806395d89b41116100e757806395d89b41146105b9578063a22cb465146105e4578063b88d4fde1461060d578063ba7d2c7614610636578063bcf8a8671461066157610204565b806370a0823114610511578063715018a61461054e5780638da5cb5b14610565578063940cd05b1461059057610204565b806318160ddd1161019b578063518302271161016a578063518302271461042a57806355f804b3146104555780635c975abb1461047e5780636352211e146104a95780636c0360eb146104e657610204565b806318160ddd1461037057806318cae2691461039b57806323b872dd146103d857806342842e0e1461040157610204565b8063081c8c44116101d7578063081c8c44146102d7578063095ea7b3146103025780630fbe4fe21461032b578063149835a01461034757610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613203565b610829565b60405161023d919061369e565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906131d6565b61090b565b005b34801561027b57600080fd5b506102846109a4565b60405161029191906136b9565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906132a6565b610a36565b6040516102ce9190613637565b60405180910390f35b3480156102e357600080fd5b506102ec610ab2565b6040516102f991906136b9565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613196565b610b40565b005b610345600480360381019061034091906132a6565b610c45565b005b34801561035357600080fd5b5061036e600480360381019061036991906132a6565b610f67565b005b34801561037c57600080fd5b50610385610fed565b604051610392919061385b565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613013565b611004565b6040516103cf919061385b565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613080565b61101c565b005b34801561040d57600080fd5b5061042860048036038101906104239190613080565b61102c565b005b34801561043657600080fd5b5061043f61104c565b60405161044c919061369e565b60405180910390f35b34801561046157600080fd5b5061047c6004803603810190610477919061325d565b61105f565b005b34801561048a57600080fd5b506104936110f5565b6040516104a0919061369e565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb91906132a6565b611108565b6040516104dd9190613637565b60405180910390f35b3480156104f257600080fd5b506104fb61111e565b60405161050891906136b9565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613013565b6111ac565b604051610545919061385b565b60405180910390f35b34801561055a57600080fd5b5061056361127c565b005b34801561057157600080fd5b5061057a611304565b6040516105879190613637565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906131d6565b61132e565b005b3480156105c557600080fd5b506105ce6113c7565b6040516105db91906136b9565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613156565b611459565b005b34801561061957600080fd5b50610634600480360381019061062f91906130d3565b6115d1565b005b34801561064257600080fd5b5061064b611649565b604051610658919061385b565b60405180910390f35b34801561066d57600080fd5b50610688600480360381019061068391906132d3565b61164f565b005b34801561069657600080fd5b506106b160048036038101906106ac919061325d565b6117cf565b005b3480156106bf57600080fd5b506106c8611865565b6040516106d591906136b9565b60405180910390f35b3480156106ea57600080fd5b50610705600480360381019061070091906132a6565b6118f3565b005b34801561071357600080fd5b5061072e600480360381019061072991906132a6565b611979565b60405161073b91906136b9565b60405180910390f35b34801561075057600080fd5b50610759611ad2565b604051610766919061385b565b60405180910390f35b34801561077b57600080fd5b506107966004803603810190610791919061325d565b611ad8565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190613040565b611b6e565b6040516107cc919061369e565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f79190613013565b611c02565b005b34801561080a57600080fd5b50610813611cfa565b604051610820919061385b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610904575061090382611d00565b5b9050919050565b610913611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610931611304565b73ffffffffffffffffffffffffffffffffffffffff1614610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906137db565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6060600280546109b390613ac6565b80601f01602080910402602001604051908101604052809291908181526020018280546109df90613ac6565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b5050505050905090565b6000610a4182611d72565b610a77576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610abf90613ac6565b80601f0160208091040260200160405190810160405280929190818152602001828054610aeb90613ac6565b8015610b385780601f10610b0d57610100808354040283529160200191610b38565b820191906000526020600020905b815481529060010190602001808311610b1b57829003601f168201915b505050505081565b6000610b4b82611108565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd2611d6a565b73ffffffffffffffffffffffffffffffffffffffff1614610c3557610bfe81610bf9611d6a565b611b6e565b610c34576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610c40838383611dc0565b505050565b60026009541415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c829061383b565b60405180910390fd5b60026009819055506000610c9d610fed565b90506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610ceb611304565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0f57601160009054906101000a900460ff1615610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d649061381b565b60405180910390fd5b600f54831115610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da9906137fb565b60405180910390fd5b600581108015610dcf57506010548382610dcc9190613955565b11155b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e059061379b565b60405180910390fd5b5b60008311610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061371b565b60405180910390fd5b600083118015610e645750600f548311155b610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a9061375b565b60405180910390fd5b600e548383610eb29190613955565b1115610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea9061377b565b60405180910390fd5b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f429190613955565b92505081905550610f5a610f54611d6a565b84611e72565b5050600160098190555050565b610f6f611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610f8d611304565b73ffffffffffffffffffffffffffffffffffffffff1614610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda906137db565b60405180910390fd5b80600e8190555050565b6000610ff7611e90565b6001546000540303905090565b600a6020528060005260406000206000915090505481565b611027838383611e99565b505050565b611047838383604051806020016040528060008152506115d1565b505050565b601160019054906101000a900460ff1681565b611067611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611085611304565b73ffffffffffffffffffffffffffffffffffffffff16146110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d2906137db565b60405180910390fd5b80600b90805190602001906110f1929190612de4565b5050565b601160009054906101000a900460ff1681565b60006111138261234f565b600001519050919050565b600b805461112b90613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461115790613ac6565b80156111a45780601f10611179576101008083540402835291602001916111a4565b820191906000526020600020905b81548152906001019060200180831161118757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611214576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611284611d6a565b73ffffffffffffffffffffffffffffffffffffffff166112a2611304565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906137db565b60405180910390fd5b61130260006125da565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611336611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611354611304565b73ffffffffffffffffffffffffffffffffffffffff16146113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a1906137db565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6060600380546113d690613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461140290613ac6565b801561144f5780601f106114245761010080835404028352916020019161144f565b820191906000526020600020905b81548152906001019060200180831161143257829003601f168201915b5050505050905090565b611461611d6a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114d3611d6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611580611d6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c5919061369e565b60405180910390a35050565b6115dc848484611e99565b6115fb8373ffffffffffffffffffffffffffffffffffffffff166126a0565b156116435761160c848484846126c3565b611642576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b611657611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611675611304565b73ffffffffffffffffffffffffffffffffffffffff16146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906137db565b60405180910390fd5b60026009541415611711576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117089061383b565b60405180910390fd5b60026009819055506000611723610fed565b905060008311611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f906137bb565b60405180910390fd5b600e5483826117779190613955565b11156117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af906136fb565b60405180910390fd5b6117c28284611e72565b5060016009819055505050565b6117d7611d6a565b73ffffffffffffffffffffffffffffffffffffffff166117f5611304565b73ffffffffffffffffffffffffffffffffffffffff161461184b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611842906137db565b60405180910390fd5b80600c9080519060200190611861929190612de4565b5050565b600d805461187290613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461189e90613ac6565b80156118eb5780601f106118c0576101008083540402835291602001916118eb565b820191906000526020600020905b8154815290600101906020018083116118ce57829003601f168201915b505050505081565b6118fb611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611919611304565b73ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611966906137db565b60405180910390fd5b80600f8190555050565b606061198482611d72565b6119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906136db565b60405180910390fd5b60001515601160019054906101000a900460ff1615151415611a7157600c80546119ec90613ac6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1890613ac6565b8015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b50505050509050611acd565b6000611a7b612823565b90506000815111611a9b5760405180602001604052806000815250611ac9565b80611aa5846128b5565b600d604051602001611ab993929190613606565b6040516020818303038152906040525b9150505b919050565b600e5481565b611ae0611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611afe611304565b73ffffffffffffffffffffffffffffffffffffffff1614611b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4b906137db565b60405180910390fd5b80600d9080519060200190611b6a929190612de4565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c0a611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611c28611304565b73ffffffffffffffffffffffffffffffffffffffff1614611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c75906137db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce59061373b565b60405180910390fd5b611cf7816125da565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d7d611e90565b11158015611d8c575060005482105b8015611db9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e8c828260405180602001604052806000815250612a16565b5050565b60006001905090565b6000611ea48261234f565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f30611d6a565b73ffffffffffffffffffffffffffffffffffffffff161480611f5f5750611f5e85611f59611d6a565b611b6e565b5b80611fa45750611f6d611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611f8c84610a36565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611fdd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612044576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120518585856001612dd8565b61205d60008487611dc0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122dd5760005482146122dc57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123488585856001612dde565b5050505050565b612357612e6a565b600082905080612365611e90565b116125a3576000548110156125a2576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516125a057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124845780925050506125d5565b5b60011561259f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461259a5780925050506125d5565b612485565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126e9611d6a565b8786866040518563ffffffff1660e01b815260040161270b9493929190613652565b602060405180830381600087803b15801561272557600080fd5b505af192505050801561275657506040513d601f19601f820116820180604052508101906127539190613230565b60015b6127d0573d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b506000815114156127c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461283290613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461285e90613ac6565b80156128ab5780601f10612880576101008083540402835291602001916128ab565b820191906000526020600020905b81548152906001019060200180831161288e57829003601f168201915b5050505050905090565b606060008214156128fd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a11565b600082905060005b6000821461292f57808061291890613b29565b915050600a8261292891906139ab565b9150612905565b60008167ffffffffffffffff81111561294b5761294a613c5f565b5b6040519080825280601f01601f19166020018201604052801561297d5781602001600182028036833780820191505090505b5090505b60008514612a0a5760018261299691906139dc565b9150600a856129a59190613b72565b60306129b19190613955565b60f81b8183815181106129c7576129c6613c30565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0391906139ab565b9450612981565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a83576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612abe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612acb6000858386612dd8565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612c8c8673ffffffffffffffffffffffffffffffffffffffff166126a0565b15612d51575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d0160008784806001019550876126c3565b612d37576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612c92578260005414612d4c57600080fd5b612dbc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d52575b816000819055505050612dd26000858386612dde565b50505050565b50505050565b50505050565b828054612df090613ac6565b90600052602060002090601f016020900481019282612e125760008555612e59565b82601f10612e2b57805160ff1916838001178555612e59565b82800160010185558215612e59579182015b82811115612e58578251825591602001919060010190612e3d565b5b509050612e669190612ead565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ec6576000816000905550600101612eae565b5090565b6000612edd612ed88461389b565b613876565b905082815260208101848484011115612ef957612ef8613c93565b5b612f04848285613a84565b509392505050565b6000612f1f612f1a846138cc565b613876565b905082815260208101848484011115612f3b57612f3a613c93565b5b612f46848285613a84565b509392505050565b600081359050612f5d81613f11565b92915050565b600081359050612f7281613f28565b92915050565b600081359050612f8781613f3f565b92915050565b600081519050612f9c81613f3f565b92915050565b600082601f830112612fb757612fb6613c8e565b5b8135612fc7848260208601612eca565b91505092915050565b600082601f830112612fe557612fe4613c8e565b5b8135612ff5848260208601612f0c565b91505092915050565b60008135905061300d81613f56565b92915050565b60006020828403121561302957613028613c9d565b5b600061303784828501612f4e565b91505092915050565b6000806040838503121561305757613056613c9d565b5b600061306585828601612f4e565b925050602061307685828601612f4e565b9150509250929050565b60008060006060848603121561309957613098613c9d565b5b60006130a786828701612f4e565b93505060206130b886828701612f4e565b92505060406130c986828701612ffe565b9150509250925092565b600080600080608085870312156130ed576130ec613c9d565b5b60006130fb87828801612f4e565b945050602061310c87828801612f4e565b935050604061311d87828801612ffe565b925050606085013567ffffffffffffffff81111561313e5761313d613c98565b5b61314a87828801612fa2565b91505092959194509250565b6000806040838503121561316d5761316c613c9d565b5b600061317b85828601612f4e565b925050602061318c85828601612f63565b9150509250929050565b600080604083850312156131ad576131ac613c9d565b5b60006131bb85828601612f4e565b92505060206131cc85828601612ffe565b9150509250929050565b6000602082840312156131ec576131eb613c9d565b5b60006131fa84828501612f63565b91505092915050565b60006020828403121561321957613218613c9d565b5b600061322784828501612f78565b91505092915050565b60006020828403121561324657613245613c9d565b5b600061325484828501612f8d565b91505092915050565b60006020828403121561327357613272613c9d565b5b600082013567ffffffffffffffff81111561329157613290613c98565b5b61329d84828501612fd0565b91505092915050565b6000602082840312156132bc576132bb613c9d565b5b60006132ca84828501612ffe565b91505092915050565b600080604083850312156132ea576132e9613c9d565b5b60006132f885828601612ffe565b925050602061330985828601612f4e565b9150509250929050565b61331c81613a10565b82525050565b61332b81613a22565b82525050565b600061333c82613912565b6133468185613928565b9350613356818560208601613a93565b61335f81613ca2565b840191505092915050565b60006133758261391d565b61337f8185613939565b935061338f818560208601613a93565b61339881613ca2565b840191505092915050565b60006133ae8261391d565b6133b8818561394a565b93506133c8818560208601613a93565b80840191505092915050565b600081546133e181613ac6565b6133eb818661394a565b9450600182166000811461340657600181146134175761344a565b60ff1983168652818601935061344a565b613420856138fd565b60005b8381101561344257815481890152600182019150602081019050613423565b838801955050505b50505092915050565b6000613460603083613939565b915061346b82613cb3565b604082019050919050565b6000613483601783613939565b915061348e82613d02565b602082019050919050565b60006134a6601c83613939565b91506134b182613d2b565b602082019050919050565b60006134c9602683613939565b91506134d482613d54565b604082019050919050565b60006134ec601483613939565b91506134f782613da3565b602082019050919050565b600061350f600c83613939565b915061351a82613dcc565b602082019050919050565b6000613532602483613939565b915061353d82613df5565b604082019050919050565b6000613555601c83613939565b915061356082613e44565b602082019050919050565b6000613578602083613939565b915061358382613e6d565b602082019050919050565b600061359b602083613939565b91506135a682613e96565b602082019050919050565b60006135be601383613939565b91506135c982613ebf565b602082019050919050565b60006135e1601f83613939565b91506135ec82613ee8565b602082019050919050565b61360081613a7a565b82525050565b600061361282866133a3565b915061361e82856133a3565b915061362a82846133d4565b9150819050949350505050565b600060208201905061364c6000830184613313565b92915050565b60006080820190506136676000830187613313565b6136746020830186613313565b61368160408301856135f7565b81810360608301526136938184613331565b905095945050505050565b60006020820190506136b36000830184613322565b92915050565b600060208201905081810360008301526136d3818461336a565b905092915050565b600060208201905081810360008301526136f481613453565b9050919050565b6000602082019050818103600083015261371481613476565b9050919050565b6000602082019050818103600083015261373481613499565b9050919050565b60006020820190508181036000830152613754816134bc565b9050919050565b60006020820190508181036000830152613774816134df565b9050919050565b6000602082019050818103600083015261379481613502565b9050919050565b600060208201905081810360008301526137b481613525565b9050919050565b600060208201905081810360008301526137d481613548565b9050919050565b600060208201905081810360008301526137f48161356b565b9050919050565b600060208201905081810360008301526138148161358e565b9050919050565b60006020820190508181036000830152613834816135b1565b9050919050565b60006020820190508181036000830152613854816135d4565b9050919050565b600060208201905061387060008301846135f7565b92915050565b6000613880613891565b905061388c8282613af8565b919050565b6000604051905090565b600067ffffffffffffffff8211156138b6576138b5613c5f565b5b6138bf82613ca2565b9050602081019050919050565b600067ffffffffffffffff8211156138e7576138e6613c5f565b5b6138f082613ca2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061396082613a7a565b915061396b83613a7a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139a05761399f613ba3565b5b828201905092915050565b60006139b682613a7a565b91506139c183613a7a565b9250826139d1576139d0613bd2565b5b828204905092915050565b60006139e782613a7a565b91506139f283613a7a565b925082821015613a0557613a04613ba3565b5b828203905092915050565b6000613a1b82613a5a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ab1578082015181840152602081019050613a96565b83811115613ac0576000848401525b50505050565b60006002820490506001821680613ade57607f821691505b60208210811415613af257613af1613c01565b5b50919050565b613b0182613ca2565b810181811067ffffffffffffffff82111715613b2057613b1f613c5f565b5b80604052505050565b6000613b3482613a7a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b6757613b66613ba3565b5b600182019050919050565b6000613b7d82613a7a565b9150613b8883613a7a565b925082613b9857613b97613bd2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d69742065786365656465642e000000000000000000600082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f576520536f6c64206f75742e0000000000000000000000000000000000000000600082015250565b7f4d6178206d696e7420616d6f756e74207065722077616c6c657420657863656560008201527f6465642e00000000000000000000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178206d696e7420616d6f756e74207065722074782065786365656465642e600082015250565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b613f1a81613a10565b8114613f2557600080fd5b50565b613f3181613a22565b8114613f3c57600080fd5b50565b613f4881613a2e565b8114613f5357600080fd5b50565b613f5f81613a7a565b8114613f6a57600080fd5b5056fea26469706673582212200f87edff432f4eccf2a5d568378219341a90fa32f08f275604dc95750589860464736f6c63430008070033697066733a2f2f516d5a33456e62627165425750567452764c35783870666347417a6732457476544a4e363543743345326a486f4e2f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102045760003560e01c806370a0823111610118578063c17ecd12116100a0578063d5abeb011161006f578063d5abeb0114610744578063da3ef23f1461076f578063e985e9c514610798578063f2fde38b146107d5578063ff645691146107fe57610204565b8063c17ecd121461068a578063c6682862146106b3578063c6f6f216146106de578063c87b56dd1461070757610204565b806395d89b41116100e757806395d89b41146105b9578063a22cb465146105e4578063b88d4fde1461060d578063ba7d2c7614610636578063bcf8a8671461066157610204565b806370a0823114610511578063715018a61461054e5780638da5cb5b14610565578063940cd05b1461059057610204565b806318160ddd1161019b578063518302271161016a578063518302271461042a57806355f804b3146104555780635c975abb1461047e5780636352211e146104a95780636c0360eb146104e657610204565b806318160ddd1461037057806318cae2691461039b57806323b872dd146103d857806342842e0e1461040157610204565b8063081c8c44116101d7578063081c8c44146102d7578063095ea7b3146103025780630fbe4fe21461032b578063149835a01461034757610204565b806301ffc9a71461020957806302329a291461024657806306fdde031461026f578063081812fc1461029a575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190613203565b610829565b60405161023d919061369e565b60405180910390f35b34801561025257600080fd5b5061026d600480360381019061026891906131d6565b61090b565b005b34801561027b57600080fd5b506102846109a4565b60405161029191906136b9565b60405180910390f35b3480156102a657600080fd5b506102c160048036038101906102bc91906132a6565b610a36565b6040516102ce9190613637565b60405180910390f35b3480156102e357600080fd5b506102ec610ab2565b6040516102f991906136b9565b60405180910390f35b34801561030e57600080fd5b5061032960048036038101906103249190613196565b610b40565b005b610345600480360381019061034091906132a6565b610c45565b005b34801561035357600080fd5b5061036e600480360381019061036991906132a6565b610f67565b005b34801561037c57600080fd5b50610385610fed565b604051610392919061385b565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190613013565b611004565b6040516103cf919061385b565b60405180910390f35b3480156103e457600080fd5b506103ff60048036038101906103fa9190613080565b61101c565b005b34801561040d57600080fd5b5061042860048036038101906104239190613080565b61102c565b005b34801561043657600080fd5b5061043f61104c565b60405161044c919061369e565b60405180910390f35b34801561046157600080fd5b5061047c6004803603810190610477919061325d565b61105f565b005b34801561048a57600080fd5b506104936110f5565b6040516104a0919061369e565b60405180910390f35b3480156104b557600080fd5b506104d060048036038101906104cb91906132a6565b611108565b6040516104dd9190613637565b60405180910390f35b3480156104f257600080fd5b506104fb61111e565b60405161050891906136b9565b60405180910390f35b34801561051d57600080fd5b5061053860048036038101906105339190613013565b6111ac565b604051610545919061385b565b60405180910390f35b34801561055a57600080fd5b5061056361127c565b005b34801561057157600080fd5b5061057a611304565b6040516105879190613637565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906131d6565b61132e565b005b3480156105c557600080fd5b506105ce6113c7565b6040516105db91906136b9565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190613156565b611459565b005b34801561061957600080fd5b50610634600480360381019061062f91906130d3565b6115d1565b005b34801561064257600080fd5b5061064b611649565b604051610658919061385b565b60405180910390f35b34801561066d57600080fd5b50610688600480360381019061068391906132d3565b61164f565b005b34801561069657600080fd5b506106b160048036038101906106ac919061325d565b6117cf565b005b3480156106bf57600080fd5b506106c8611865565b6040516106d591906136b9565b60405180910390f35b3480156106ea57600080fd5b50610705600480360381019061070091906132a6565b6118f3565b005b34801561071357600080fd5b5061072e600480360381019061072991906132a6565b611979565b60405161073b91906136b9565b60405180910390f35b34801561075057600080fd5b50610759611ad2565b604051610766919061385b565b60405180910390f35b34801561077b57600080fd5b506107966004803603810190610791919061325d565b611ad8565b005b3480156107a457600080fd5b506107bf60048036038101906107ba9190613040565b611b6e565b6040516107cc919061369e565b60405180910390f35b3480156107e157600080fd5b506107fc60048036038101906107f79190613013565b611c02565b005b34801561080a57600080fd5b50610813611cfa565b604051610820919061385b565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108f457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610904575061090382611d00565b5b9050919050565b610913611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610931611304565b73ffffffffffffffffffffffffffffffffffffffff1614610987576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097e906137db565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6060600280546109b390613ac6565b80601f01602080910402602001604051908101604052809291908181526020018280546109df90613ac6565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b5050505050905090565b6000610a4182611d72565b610a77576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600c8054610abf90613ac6565b80601f0160208091040260200160405190810160405280929190818152602001828054610aeb90613ac6565b8015610b385780601f10610b0d57610100808354040283529160200191610b38565b820191906000526020600020905b815481529060010190602001808311610b1b57829003601f168201915b505050505081565b6000610b4b82611108565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610bb3576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bd2611d6a565b73ffffffffffffffffffffffffffffffffffffffff1614610c3557610bfe81610bf9611d6a565b611b6e565b610c34576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b610c40838383611dc0565b505050565b60026009541415610c8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c829061383b565b60405180910390fd5b60026009819055506000610c9d610fed565b90506000600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050610ceb611304565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610e0f57601160009054906101000a900460ff1615610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d649061381b565b60405180910390fd5b600f54831115610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da9906137fb565b60405180910390fd5b600581108015610dcf57506010548382610dcc9190613955565b11155b610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e059061379b565b60405180910390fd5b5b60008311610e52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e499061371b565b60405180910390fd5b600083118015610e645750600f548311155b610ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9a9061375b565b60405180910390fd5b600e548383610eb29190613955565b1115610ef3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eea9061377b565b60405180910390fd5b82600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610f429190613955565b92505081905550610f5a610f54611d6a565b84611e72565b5050600160098190555050565b610f6f611d6a565b73ffffffffffffffffffffffffffffffffffffffff16610f8d611304565b73ffffffffffffffffffffffffffffffffffffffff1614610fe3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fda906137db565b60405180910390fd5b80600e8190555050565b6000610ff7611e90565b6001546000540303905090565b600a6020528060005260406000206000915090505481565b611027838383611e99565b505050565b611047838383604051806020016040528060008152506115d1565b505050565b601160019054906101000a900460ff1681565b611067611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611085611304565b73ffffffffffffffffffffffffffffffffffffffff16146110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d2906137db565b60405180910390fd5b80600b90805190602001906110f1929190612de4565b5050565b601160009054906101000a900460ff1681565b60006111138261234f565b600001519050919050565b600b805461112b90613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461115790613ac6565b80156111a45780601f10611179576101008083540402835291602001916111a4565b820191906000526020600020905b81548152906001019060200180831161118757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611214576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611284611d6a565b73ffffffffffffffffffffffffffffffffffffffff166112a2611304565b73ffffffffffffffffffffffffffffffffffffffff16146112f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ef906137db565b60405180910390fd5b61130260006125da565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611336611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611354611304565b73ffffffffffffffffffffffffffffffffffffffff16146113aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113a1906137db565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6060600380546113d690613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461140290613ac6565b801561144f5780601f106114245761010080835404028352916020019161144f565b820191906000526020600020905b81548152906001019060200180831161143257829003601f168201915b5050505050905090565b611461611d6a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114c6576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114d3611d6a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611580611d6a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c5919061369e565b60405180910390a35050565b6115dc848484611e99565b6115fb8373ffffffffffffffffffffffffffffffffffffffff166126a0565b156116435761160c848484846126c3565b611642576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b611657611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611675611304565b73ffffffffffffffffffffffffffffffffffffffff16146116cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c2906137db565b60405180910390fd5b60026009541415611711576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117089061383b565b60405180910390fd5b60026009819055506000611723610fed565b905060008311611768576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175f906137bb565b60405180910390fd5b600e5483826117779190613955565b11156117b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117af906136fb565b60405180910390fd5b6117c28284611e72565b5060016009819055505050565b6117d7611d6a565b73ffffffffffffffffffffffffffffffffffffffff166117f5611304565b73ffffffffffffffffffffffffffffffffffffffff161461184b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611842906137db565b60405180910390fd5b80600c9080519060200190611861929190612de4565b5050565b600d805461187290613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461189e90613ac6565b80156118eb5780601f106118c0576101008083540402835291602001916118eb565b820191906000526020600020905b8154815290600101906020018083116118ce57829003601f168201915b505050505081565b6118fb611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611919611304565b73ffffffffffffffffffffffffffffffffffffffff161461196f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611966906137db565b60405180910390fd5b80600f8190555050565b606061198482611d72565b6119c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ba906136db565b60405180910390fd5b60001515601160019054906101000a900460ff1615151415611a7157600c80546119ec90613ac6565b80601f0160208091040260200160405190810160405280929190818152602001828054611a1890613ac6565b8015611a655780601f10611a3a57610100808354040283529160200191611a65565b820191906000526020600020905b815481529060010190602001808311611a4857829003601f168201915b50505050509050611acd565b6000611a7b612823565b90506000815111611a9b5760405180602001604052806000815250611ac9565b80611aa5846128b5565b600d604051602001611ab993929190613606565b6040516020818303038152906040525b9150505b919050565b600e5481565b611ae0611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611afe611304565b73ffffffffffffffffffffffffffffffffffffffff1614611b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4b906137db565b60405180910390fd5b80600d9080519060200190611b6a929190612de4565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c0a611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611c28611304565b73ffffffffffffffffffffffffffffffffffffffff1614611c7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c75906137db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611cee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce59061373b565b60405180910390fd5b611cf7816125da565b50565b600f5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081611d7d611e90565b11158015611d8c575060005482105b8015611db9575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e8c828260405180602001604052806000815250612a16565b5050565b60006001905090565b6000611ea48261234f565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f0f576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611f30611d6a565b73ffffffffffffffffffffffffffffffffffffffff161480611f5f5750611f5e85611f59611d6a565b611b6e565b5b80611fa45750611f6d611d6a565b73ffffffffffffffffffffffffffffffffffffffff16611f8c84610a36565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611fdd576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612044576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6120518585856001612dd8565b61205d60008487611dc0565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156122dd5760005482146122dc57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46123488585856001612dde565b5050505050565b612357612e6a565b600082905080612365611e90565b116125a3576000548110156125a2576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516125a057600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146124845780925050506125d5565b5b60011561259f57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461259a5780925050506125d5565b612485565b5b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026126e9611d6a565b8786866040518563ffffffff1660e01b815260040161270b9493929190613652565b602060405180830381600087803b15801561272557600080fd5b505af192505050801561275657506040513d601f19601f820116820180604052508101906127539190613230565b60015b6127d0573d8060008114612786576040519150601f19603f3d011682016040523d82523d6000602084013e61278b565b606091505b506000815114156127c8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461283290613ac6565b80601f016020809104026020016040519081016040528092919081815260200182805461285e90613ac6565b80156128ab5780601f10612880576101008083540402835291602001916128ab565b820191906000526020600020905b81548152906001019060200180831161288e57829003601f168201915b5050505050905090565b606060008214156128fd576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612a11565b600082905060005b6000821461292f57808061291890613b29565b915050600a8261292891906139ab565b9150612905565b60008167ffffffffffffffff81111561294b5761294a613c5f565b5b6040519080825280601f01601f19166020018201604052801561297d5781602001600182028036833780820191505090505b5090505b60008514612a0a5760018261299691906139dc565b9150600a856129a59190613b72565b60306129b19190613955565b60f81b8183815181106129c7576129c6613c30565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612a0391906139ab565b9450612981565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a83576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415612abe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612acb6000858386612dd8565b82600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555082600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008482019050612c8c8673ffffffffffffffffffffffffffffffffffffffff166126a0565b15612d51575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d0160008784806001019550876126c3565b612d37576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612c92578260005414612d4c57600080fd5b612dbc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612d52575b816000819055505050612dd26000858386612dde565b50505050565b50505050565b50505050565b828054612df090613ac6565b90600052602060002090601f016020900481019282612e125760008555612e59565b82601f10612e2b57805160ff1916838001178555612e59565b82800160010185558215612e59579182015b82811115612e58578251825591602001919060010190612e3d565b5b509050612e669190612ead565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612ec6576000816000905550600101612eae565b5090565b6000612edd612ed88461389b565b613876565b905082815260208101848484011115612ef957612ef8613c93565b5b612f04848285613a84565b509392505050565b6000612f1f612f1a846138cc565b613876565b905082815260208101848484011115612f3b57612f3a613c93565b5b612f46848285613a84565b509392505050565b600081359050612f5d81613f11565b92915050565b600081359050612f7281613f28565b92915050565b600081359050612f8781613f3f565b92915050565b600081519050612f9c81613f3f565b92915050565b600082601f830112612fb757612fb6613c8e565b5b8135612fc7848260208601612eca565b91505092915050565b600082601f830112612fe557612fe4613c8e565b5b8135612ff5848260208601612f0c565b91505092915050565b60008135905061300d81613f56565b92915050565b60006020828403121561302957613028613c9d565b5b600061303784828501612f4e565b91505092915050565b6000806040838503121561305757613056613c9d565b5b600061306585828601612f4e565b925050602061307685828601612f4e565b9150509250929050565b60008060006060848603121561309957613098613c9d565b5b60006130a786828701612f4e565b93505060206130b886828701612f4e565b92505060406130c986828701612ffe565b9150509250925092565b600080600080608085870312156130ed576130ec613c9d565b5b60006130fb87828801612f4e565b945050602061310c87828801612f4e565b935050604061311d87828801612ffe565b925050606085013567ffffffffffffffff81111561313e5761313d613c98565b5b61314a87828801612fa2565b91505092959194509250565b6000806040838503121561316d5761316c613c9d565b5b600061317b85828601612f4e565b925050602061318c85828601612f63565b9150509250929050565b600080604083850312156131ad576131ac613c9d565b5b60006131bb85828601612f4e565b92505060206131cc85828601612ffe565b9150509250929050565b6000602082840312156131ec576131eb613c9d565b5b60006131fa84828501612f63565b91505092915050565b60006020828403121561321957613218613c9d565b5b600061322784828501612f78565b91505092915050565b60006020828403121561324657613245613c9d565b5b600061325484828501612f8d565b91505092915050565b60006020828403121561327357613272613c9d565b5b600082013567ffffffffffffffff81111561329157613290613c98565b5b61329d84828501612fd0565b91505092915050565b6000602082840312156132bc576132bb613c9d565b5b60006132ca84828501612ffe565b91505092915050565b600080604083850312156132ea576132e9613c9d565b5b60006132f885828601612ffe565b925050602061330985828601612f4e565b9150509250929050565b61331c81613a10565b82525050565b61332b81613a22565b82525050565b600061333c82613912565b6133468185613928565b9350613356818560208601613a93565b61335f81613ca2565b840191505092915050565b60006133758261391d565b61337f8185613939565b935061338f818560208601613a93565b61339881613ca2565b840191505092915050565b60006133ae8261391d565b6133b8818561394a565b93506133c8818560208601613a93565b80840191505092915050565b600081546133e181613ac6565b6133eb818661394a565b9450600182166000811461340657600181146134175761344a565b60ff1983168652818601935061344a565b613420856138fd565b60005b8381101561344257815481890152600182019150602081019050613423565b838801955050505b50505092915050565b6000613460603083613939565b915061346b82613cb3565b604082019050919050565b6000613483601783613939565b915061348e82613d02565b602082019050919050565b60006134a6601c83613939565b91506134b182613d2b565b602082019050919050565b60006134c9602683613939565b91506134d482613d54565b604082019050919050565b60006134ec601483613939565b91506134f782613da3565b602082019050919050565b600061350f600c83613939565b915061351a82613dcc565b602082019050919050565b6000613532602483613939565b915061353d82613df5565b604082019050919050565b6000613555601c83613939565b915061356082613e44565b602082019050919050565b6000613578602083613939565b915061358382613e6d565b602082019050919050565b600061359b602083613939565b91506135a682613e96565b602082019050919050565b60006135be601383613939565b91506135c982613ebf565b602082019050919050565b60006135e1601f83613939565b91506135ec82613ee8565b602082019050919050565b61360081613a7a565b82525050565b600061361282866133a3565b915061361e82856133a3565b915061362a82846133d4565b9150819050949350505050565b600060208201905061364c6000830184613313565b92915050565b60006080820190506136676000830187613313565b6136746020830186613313565b61368160408301856135f7565b81810360608301526136938184613331565b905095945050505050565b60006020820190506136b36000830184613322565b92915050565b600060208201905081810360008301526136d3818461336a565b905092915050565b600060208201905081810360008301526136f481613453565b9050919050565b6000602082019050818103600083015261371481613476565b9050919050565b6000602082019050818103600083015261373481613499565b9050919050565b60006020820190508181036000830152613754816134bc565b9050919050565b60006020820190508181036000830152613774816134df565b9050919050565b6000602082019050818103600083015261379481613502565b9050919050565b600060208201905081810360008301526137b481613525565b9050919050565b600060208201905081810360008301526137d481613548565b9050919050565b600060208201905081810360008301526137f48161356b565b9050919050565b600060208201905081810360008301526138148161358e565b9050919050565b60006020820190508181036000830152613834816135b1565b9050919050565b60006020820190508181036000830152613854816135d4565b9050919050565b600060208201905061387060008301846135f7565b92915050565b6000613880613891565b905061388c8282613af8565b919050565b6000604051905090565b600067ffffffffffffffff8211156138b6576138b5613c5f565b5b6138bf82613ca2565b9050602081019050919050565b600067ffffffffffffffff8211156138e7576138e6613c5f565b5b6138f082613ca2565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061396082613a7a565b915061396b83613a7a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139a05761399f613ba3565b5b828201905092915050565b60006139b682613a7a565b91506139c183613a7a565b9250826139d1576139d0613bd2565b5b828204905092915050565b60006139e782613a7a565b91506139f283613a7a565b925082821015613a0557613a04613ba3565b5b828203905092915050565b6000613a1b82613a5a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ab1578082015181840152602081019050613a96565b83811115613ac0576000848401525b50505050565b60006002820490506001821680613ade57607f821691505b60208210811415613af257613af1613c01565b5b50919050565b613b0182613ca2565b810181811067ffffffffffffffff82111715613b2057613b1f613c5f565b5b80604052505050565b6000613b3482613a7a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b6757613b66613ba3565b5b600182019050919050565b6000613b7d82613a7a565b9150613b8883613a7a565b925082613b9857613b97613bd2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231414d657461646174613a2055524920717565727920666f72206e60008201527f6f6e6578697374656e7420746f6b656e00000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d69742065786365656465642e000000000000000000600082015250565b7f4e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f576520536f6c64206f75742e0000000000000000000000000000000000000000600082015250565b7f4d6178206d696e7420616d6f756e74207065722077616c6c657420657863656560008201527f6465642e00000000000000000000000000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46542e00000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4d6178206d696e7420616d6f756e74207065722074782065786365656465642e600082015250565b7f436f6e7472616374206973207061757365642e00000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b613f1a81613a10565b8114613f2557600080fd5b50565b613f3181613a22565b8114613f3c57600080fd5b50565b613f4881613a2e565b8114613f5357600080fd5b50565b613f5f81613a7a565b8114613f6a57600080fd5b5056fea26469706673582212200f87edff432f4eccf2a5d568378219341a90fa32f08f275604dc95750589860464736f6c63430008070033

Deployed Bytecode Sourcemap

36808:3126:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19674:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39856:73;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22789:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24293:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36989:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23855:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37632:760;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39316:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18914:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36901:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25158:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25399:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37208:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39416:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37178:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22597:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36963:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20043:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4067:103;;;;;;;;;;;;;:::i;:::-;;3416:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39774:76;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22958:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24569:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25655:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37134:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38414:322;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39520:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37022:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39226:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38753:450;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37066:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39646:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24927:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4325:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37102:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19674:305;19776:4;19828:25;19813:40;;;:11;:40;;;;:105;;;;19885:33;19870:48;;;:11;:48;;;;19813:105;:158;;;;19935:36;19959:11;19935:23;:36::i;:::-;19813:158;19793:178;;19674:305;;;:::o;39856:73::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39917:6:::1;39908;;:15;;;;;;;;;;;;;;;;;;39856:73:::0;:::o;22789:100::-;22843:13;22876:5;22869:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22789:100;:::o;24293:204::-;24361:7;24386:16;24394:7;24386;:16::i;:::-;24381:64;;24411:34;;;;;;;;;;;;;;24381:64;24465:15;:24;24481:7;24465:24;;;;;;;;;;;;;;;;;;;;;24458:31;;24293:204;;;:::o;36989:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23855:372::-;23928:13;23944:24;23960:7;23944:15;:24::i;:::-;23928:40;;23989:5;23983:11;;:2;:11;;;23979:48;;;24003:24;;;;;;;;;;;;;;23979:48;24060:5;24044:21;;:12;:10;:12::i;:::-;:21;;;24040:139;;24071:37;24088:5;24095:12;:10;:12::i;:::-;24071:16;:37::i;:::-;24067:112;;24132:35;;;;;;;;;;;;;;24067:112;24040:139;24191:28;24200:2;24204:7;24213:5;24191:8;:28::i;:::-;23917:310;23855:372;;:::o;37632:760::-;262:1;482:7;;:19;;474:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;262:1;615:7;:18;;;;37707:14:::1;37724:13;:11;:13::i;:::-;37707:30;;37744:24;37771:20;:32;37792:10;37771:32;;;;;;;;;;;;;;;;37744:59;;37830:7;:5;:7::i;:::-;37816:21;;:10;:21;;;37812:294;;37859:6;;;;;;;;;;;37858:7;37850:39;;;;;;;;;;;;:::i;:::-;;;;;;;;;37918:8;;37908:6;:18;;37900:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38001:1;37982:16;:20;:71;;;;;38035:18;;38025:6;38006:16;:25;;;;:::i;:::-;:47;;37982:71;37974:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;37812:294;38131:1;38122:6;:10;38114:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38189:1;38180:6;:10;:32;;;;;38204:8;;38194:6;:18;;38180:32;38172:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;38271:9;;38261:6;38252;:15;;;;:::i;:::-;:28;;38244:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;38342:6;38306:20;:32;38327:10;38306:32;;;;;;;;;;;;;;;;:42;;;;;;;:::i;:::-;;;;;;;;38355:31;38365:12;:10;:12::i;:::-;38379:6;38355:9;:31::i;:::-;37694:698;;218:1:::0;660:7;:22;;;;37632:760;:::o;39316:94::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39394:10:::1;39382:9;:22;;;;39316:94:::0;:::o;18914:312::-;18967:7;19192:15;:13;:15::i;:::-;19177:12;;19161:13;;:28;:46;19154:53;;18914:312;:::o;36901:55::-;;;;;;;;;;;;;;;;;:::o;25158:170::-;25292:28;25302:4;25308:2;25312:7;25292:9;:28::i;:::-;25158:170;;;:::o;25399:185::-;25537:39;25554:4;25560:2;25564:7;25537:39;;;;;;;;;;;;:16;:39::i;:::-;25399:185;;;:::o;37208:28::-;;;;;;;;;;;;;:::o;39416:98::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39497:11:::1;39487:7;:21;;;;;;;;;;;;:::i;:::-;;39416:98:::0;:::o;37178:25::-;;;;;;;;;;;;;:::o;22597:125::-;22661:7;22688:21;22701:7;22688:12;:21::i;:::-;:26;;;22681:33;;22597:125;;;:::o;36963:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20043:206::-;20107:7;20148:1;20131:19;;:5;:19;;;20127:60;;;20159:28;;;;;;;;;;;;;;20127:60;20213:12;:19;20226:5;20213:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;20205:36;;20198:43;;20043:206;;;:::o;4067:103::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4132:30:::1;4159:1;4132:18;:30::i;:::-;4067:103::o:0;3416:87::-;3462:7;3489:6;;;;;;;;;;;3482:13;;3416:87;:::o;39774:76::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39838:6:::1;39827:8;;:17;;;;;;;;;;;;;;;;;;39774:76:::0;:::o;22958:104::-;23014:13;23047:7;23040:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22958:104;:::o;24569:287::-;24680:12;:10;:12::i;:::-;24668:24;;:8;:24;;;24664:54;;;24701:17;;;;;;;;;;;;;;24664:54;24776:8;24731:18;:32;24750:12;:10;:12::i;:::-;24731:32;;;;;;;;;;;;;;;:42;24764:8;24731:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24829:8;24800:48;;24815:12;:10;:12::i;:::-;24800:48;;;24839:8;24800:48;;;;;;:::i;:::-;;;;;;;;24569:287;;:::o;25655:370::-;25822:28;25832:4;25838:2;25842:7;25822:9;:28::i;:::-;25865:15;:2;:13;;;:15::i;:::-;25861:157;;;25886:56;25917:4;25923:2;25927:7;25936:5;25886:30;:56::i;:::-;25882:136;;25966:40;;;;;;;;;;;;;;25882:136;25861:157;25655:370;;;;:::o;37134:37::-;;;;:::o;38414:322::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;262:1:::1;482:7;;:19;;474:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;262:1;615:7;:18;;;;38511:14:::2;38528:13;:11;:13::i;:::-;38511:30;;38576:1;38562:11;:15;38554:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;38649:9;;38634:11;38625:6;:20;;;;:::i;:::-;:33;;38617:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;38695:35;38705:11;38718;38695:9;:35::i;:::-;38504:232;218:1:::1;660:7;:22;;;;38414:322:::0;;:::o;39520:120::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39619:15:::1;39602:14;:32;;;;;;;;;;;;:::i;:::-;;39520:120:::0;:::o;37022:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39226:84::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39298:6:::1;39287:8;:17;;;;39226:84:::0;:::o;38753:450::-;38826:13;38856:16;38864:7;38856;:16::i;:::-;38848:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;38950:5;38938:17;;:8;;;;;;;;;;;:17;;;38934:67;;;38975:14;38968:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38934:67;39009:28;39040:10;:8;:10::i;:::-;39009:41;;39095:1;39070:14;39064:28;:32;:133;;;;;;;;;;;;;;;;;39132:14;39148:18;:7;:16;:18::i;:::-;39168:13;39115:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39064:133;39057:140;;;38753:450;;;;:::o;37066:31::-;;;;:::o;39646:122::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39745:17:::1;39729:13;:33;;;;;;;;;;;;:::i;:::-;;39646:122:::0;:::o;24927:164::-;25024:4;25048:18;:25;25067:5;25048:25;;;;;;;;;;;;;;;:35;25074:8;25048:35;;;;;;;;;;;;;;;;;;;;;;;;;25041:42;;24927:164;;;;:::o;4325:201::-;3647:12;:10;:12::i;:::-;3636:23;;:7;:5;:7::i;:::-;:23;;;3628:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4434:1:::1;4414:22;;:8;:22;;;;4406:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4490:28;4509:8;4490:18;:28::i;:::-;4325:201:::0;:::o;37102:27::-;;;;:::o;10908:157::-;10993:4;11032:25;11017:40;;;:11;:40;;;;11010:47;;10908:157;;;:::o;2706:98::-;2759:7;2786:10;2779:17;;2706:98;:::o;26280:174::-;26337:4;26380:7;26361:15;:13;:15::i;:::-;:26;;:53;;;;;26401:13;;26391:7;:23;26361:53;:85;;;;;26419:11;:20;26431:7;26419:20;;;;;;;;;;;:27;;;;;;;;;;;;26418:28;26361:85;26354:92;;26280:174;;;:::o;35502:196::-;35644:2;35617:15;:24;35633:7;35617:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35682:7;35678:2;35662:28;;35671:5;35662:28;;;;;;;;;;;;35502:196;;;:::o;26538:104::-;26607:27;26617:2;26621:8;26607:27;;;;;;;;;;;;:9;:27::i;:::-;26538:104;;:::o;37515:95::-;37580:7;37603:1;37596:8;;37515:95;:::o;30450:2130::-;30565:35;30603:21;30616:7;30603:12;:21::i;:::-;30565:59;;30663:4;30641:26;;:13;:18;;;:26;;;30637:67;;30676:28;;;;;;;;;;;;;;30637:67;30717:22;30759:4;30743:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;30780:36;30797:4;30803:12;:10;:12::i;:::-;30780:16;:36::i;:::-;30743:73;:126;;;;30857:12;:10;:12::i;:::-;30833:36;;:20;30845:7;30833:11;:20::i;:::-;:36;;;30743:126;30717:153;;30888:17;30883:66;;30914:35;;;;;;;;;;;;;;30883:66;30978:1;30964:16;;:2;:16;;;30960:52;;;30989:23;;;;;;;;;;;;;;30960:52;31025:43;31047:4;31053:2;31057:7;31066:1;31025:21;:43::i;:::-;31133:35;31150:1;31154:7;31163:4;31133:8;:35::i;:::-;31494:1;31464:12;:18;31477:4;31464:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31538:1;31510:12;:16;31523:2;31510:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31556:31;31590:11;:20;31602:7;31590:20;;;;;;;;;;;31556:54;;31641:2;31625:8;:13;;;:18;;;;;;;;;;;;;;;;;;31691:15;31658:8;:23;;;:49;;;;;;;;;;;;;;;;;;31959:19;31991:1;31981:7;:11;31959:33;;32007:31;32041:11;:24;32053:11;32041:24;;;;;;;;;;;32007:58;;32109:1;32084:27;;:8;:13;;;;;;;;;;;;:27;;;32080:384;;;32294:13;;32279:11;:28;32275:174;;32348:4;32332:8;:13;;;:20;;;;;;;;;;;;;;;;;;32401:13;:28;;;32375:8;:23;;;:54;;;;;;;;;;;;;;;;;;32275:174;32080:384;31439:1036;;;32511:7;32507:2;32492:27;;32501:4;32492:27;;;;;;;;;;;;32530:42;32551:4;32557:2;32561:7;32570:1;32530:20;:42::i;:::-;30554:2026;;30450:2130;;;:::o;21424:1111::-;21486:21;;:::i;:::-;21520:12;21535:7;21520:22;;21603:4;21584:15;:13;:15::i;:::-;:23;21580:888;;21620:13;;21613:4;:20;21609:859;;;21654:31;21688:11;:17;21700:4;21688:17;;;;;;;;;;;21654:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21729:9;:16;;;21724:729;;21800:1;21774:28;;:9;:14;;;:28;;;21770:101;;21838:9;21831:16;;;;;;21770:101;22173:261;22180:4;22173:261;;;22213:6;;;;;;;;22258:11;:17;22270:4;22258:17;;;;;;;;;;;22246:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22332:1;22306:28;;:9;:14;;;:28;;;22302:109;;22374:9;22367:16;;;;;;22302:109;22173:261;;;21724:729;21635:833;21609:859;21580:888;22496:31;;;;;;;;;;;;;;21424:1111;;;;:::o;4686:191::-;4760:16;4779:6;;;;;;;;;;;4760:25;;4805:8;4796:6;;:17;;;;;;;;;;;;;;;;;;4860:8;4829:40;;4850:8;4829:40;;;;;;;;;;;;4749:128;4686:191;:::o;5138:115::-;5198:4;5244:1;5222:7;:19;;;:23;5215:30;;5138:115;;;:::o;35708:667::-;35871:4;35908:2;35892:36;;;35929:12;:10;:12::i;:::-;35943:4;35949:7;35958:5;35892:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35888:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36143:1;36126:6;:13;:18;36122:235;;;36172:40;;;;;;;;;;;;;;36122:235;36315:6;36309:13;36300:6;36296:2;36292:15;36285:38;35888:480;36021:45;;;36011:55;;;:6;:55;;;;36004:62;;;35708:667;;;;;;:::o;37407:102::-;37467:13;37496:7;37489:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37407:102;:::o;964:534::-;1020:13;1061:1;1052:5;:10;1048:53;;;1079:10;;;;;;;;;;;;;;;;;;;;;1048:53;1111:12;1126:5;1111:20;;1142:14;1167:78;1182:1;1174:4;:9;1167:78;;1200:8;;;;;:::i;:::-;;;;1231:2;1223:10;;;;;:::i;:::-;;;1167:78;;;1255:19;1287:6;1277:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1255:39;;1305:154;1321:1;1312:5;:10;1305:154;;1349:1;1339:11;;;;;:::i;:::-;;;1416:2;1408:5;:10;;;;:::i;:::-;1395:2;:24;;;;:::i;:::-;1382:39;;1365:6;1372;1365:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1445:2;1436:11;;;;;:::i;:::-;;;1305:154;;;1483:6;1469:21;;;;;964:534;;;;:::o;27015:1749::-;27138:20;27161:13;;27138:36;;27203:1;27189:16;;:2;:16;;;27185:48;;;27214:19;;;;;;;;;;;;;;27185:48;27260:1;27248:8;:13;27244:44;;;27270:18;;;;;;;;;;;;;;27244:44;27301:61;27331:1;27335:2;27339:12;27353:8;27301:21;:61::i;:::-;27674:8;27639:12;:16;27652:2;27639:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27738:8;27698:12;:16;27711:2;27698:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27797:2;27764:11;:25;27776:12;27764:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;27864:15;27814:11;:25;27826:12;27814:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;27897:20;27920:12;27897:35;;27947:11;27976:8;27961:12;:23;27947:37;;28005:15;:2;:13;;;:15::i;:::-;28001:631;;;28041:313;28097:12;28093:2;28072:38;;28089:1;28072:38;;;;;;;;;;;;28138:69;28177:1;28181:2;28185:14;;;;;;28201:5;28138:30;:69::i;:::-;28133:174;;28243:40;;;;;;;;;;;;;;28133:174;28349:3;28334:12;:18;28041:313;;28435:12;28418:13;;:29;28414:43;;28449:8;;;28414:43;28001:631;;;28498:119;28554:14;;;;;;28550:2;28529:40;;28546:1;28529:40;;;;;;;;;;;;28612:3;28597:12;:18;28498:119;;28001:631;28662:12;28646:13;:28;;;;27614:1072;;28696:60;28725:1;28729:2;28733:12;28747:8;28696:20;:60::i;:::-;27127:1637;27015:1749;;;:::o;36386:159::-;;;;;:::o;36555:158::-;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:474::-;7555:6;7563;7612:2;7600:9;7591:7;7587:23;7583:32;7580:119;;;7618:79;;:::i;:::-;7580:119;7738:1;7763:53;7808:7;7799:6;7788:9;7784:22;7763:53;:::i;:::-;7753:63;;7709:117;7865:2;7891:53;7936:7;7927:6;7916:9;7912:22;7891:53;:::i;:::-;7881:63;;7836:118;7487:474;;;;;:::o;7967:118::-;8054:24;8072:5;8054:24;:::i;:::-;8049:3;8042:37;7967:118;;:::o;8091:109::-;8172:21;8187:5;8172:21;:::i;:::-;8167:3;8160:34;8091:109;;:::o;8206:360::-;8292:3;8320:38;8352:5;8320:38;:::i;:::-;8374:70;8437:6;8432:3;8374:70;:::i;:::-;8367:77;;8453:52;8498:6;8493:3;8486:4;8479:5;8475:16;8453:52;:::i;:::-;8530:29;8552:6;8530:29;:::i;:::-;8525:3;8521:39;8514:46;;8296:270;8206:360;;;;:::o;8572:364::-;8660:3;8688:39;8721:5;8688:39;:::i;:::-;8743:71;8807:6;8802:3;8743:71;:::i;:::-;8736:78;;8823:52;8868:6;8863:3;8856:4;8849:5;8845:16;8823:52;:::i;:::-;8900:29;8922:6;8900:29;:::i;:::-;8895:3;8891:39;8884:46;;8664:272;8572:364;;;;:::o;8942:377::-;9048:3;9076:39;9109:5;9076:39;:::i;:::-;9131:89;9213:6;9208:3;9131:89;:::i;:::-;9124:96;;9229:52;9274:6;9269:3;9262:4;9255:5;9251:16;9229:52;:::i;:::-;9306:6;9301:3;9297:16;9290:23;;9052:267;8942:377;;;;:::o;9349:845::-;9452:3;9489:5;9483:12;9518:36;9544:9;9518:36;:::i;:::-;9570:89;9652:6;9647:3;9570:89;:::i;:::-;9563:96;;9690:1;9679:9;9675:17;9706:1;9701:137;;;;9852:1;9847:341;;;;9668:520;;9701:137;9785:4;9781:9;9770;9766:25;9761:3;9754:38;9821:6;9816:3;9812:16;9805:23;;9701:137;;9847:341;9914:38;9946:5;9914:38;:::i;:::-;9974:1;9988:154;10002:6;9999:1;9996:13;9988:154;;;10076:7;10070:14;10066:1;10061:3;10057:11;10050:35;10126:1;10117:7;10113:15;10102:26;;10024:4;10021:1;10017:12;10012:17;;9988:154;;;10171:6;10166:3;10162:16;10155:23;;9854:334;;9668:520;;9456:738;;9349:845;;;;:::o;10200:366::-;10342:3;10363:67;10427:2;10422:3;10363:67;:::i;:::-;10356:74;;10439:93;10528:3;10439:93;:::i;:::-;10557:2;10552:3;10548:12;10541:19;;10200:366;;;:::o;10572:::-;10714:3;10735:67;10799:2;10794:3;10735:67;:::i;:::-;10728:74;;10811:93;10900:3;10811:93;:::i;:::-;10929:2;10924:3;10920:12;10913:19;;10572:366;;;:::o;10944:::-;11086:3;11107:67;11171:2;11166:3;11107:67;:::i;:::-;11100:74;;11183:93;11272:3;11183:93;:::i;:::-;11301:2;11296:3;11292:12;11285:19;;10944:366;;;:::o;11316:::-;11458:3;11479:67;11543:2;11538:3;11479:67;:::i;:::-;11472:74;;11555:93;11644:3;11555:93;:::i;:::-;11673:2;11668:3;11664:12;11657:19;;11316:366;;;:::o;11688:::-;11830:3;11851:67;11915:2;11910:3;11851:67;:::i;:::-;11844:74;;11927:93;12016:3;11927:93;:::i;:::-;12045:2;12040:3;12036:12;12029:19;;11688:366;;;:::o;12060:::-;12202:3;12223:67;12287:2;12282:3;12223:67;:::i;:::-;12216:74;;12299:93;12388:3;12299:93;:::i;:::-;12417:2;12412:3;12408:12;12401:19;;12060:366;;;:::o;12432:::-;12574:3;12595:67;12659:2;12654:3;12595:67;:::i;:::-;12588:74;;12671:93;12760:3;12671:93;:::i;:::-;12789:2;12784:3;12780:12;12773:19;;12432:366;;;:::o;12804:::-;12946:3;12967:67;13031:2;13026:3;12967:67;:::i;:::-;12960:74;;13043:93;13132:3;13043:93;:::i;:::-;13161:2;13156:3;13152:12;13145:19;;12804:366;;;:::o;13176:::-;13318:3;13339:67;13403:2;13398:3;13339:67;:::i;:::-;13332:74;;13415:93;13504:3;13415:93;:::i;:::-;13533:2;13528:3;13524:12;13517:19;;13176:366;;;:::o;13548:::-;13690:3;13711:67;13775:2;13770:3;13711:67;:::i;:::-;13704:74;;13787:93;13876:3;13787:93;:::i;:::-;13905:2;13900:3;13896:12;13889:19;;13548:366;;;:::o;13920:::-;14062:3;14083:67;14147:2;14142:3;14083:67;:::i;:::-;14076:74;;14159:93;14248:3;14159:93;:::i;:::-;14277:2;14272:3;14268:12;14261:19;;13920:366;;;:::o;14292:::-;14434:3;14455:67;14519:2;14514:3;14455:67;:::i;:::-;14448:74;;14531:93;14620:3;14531:93;:::i;:::-;14649:2;14644:3;14640:12;14633:19;;14292:366;;;:::o;14664:118::-;14751:24;14769:5;14751:24;:::i;:::-;14746:3;14739:37;14664:118;;:::o;14788:589::-;15013:3;15035:95;15126:3;15117:6;15035:95;:::i;:::-;15028:102;;15147:95;15238:3;15229:6;15147:95;:::i;:::-;15140:102;;15259:92;15347:3;15338:6;15259:92;:::i;:::-;15252:99;;15368:3;15361:10;;14788:589;;;;;;:::o;15383:222::-;15476:4;15514:2;15503:9;15499:18;15491:26;;15527:71;15595:1;15584:9;15580:17;15571:6;15527:71;:::i;:::-;15383:222;;;;:::o;15611:640::-;15806:4;15844:3;15833:9;15829:19;15821:27;;15858:71;15926:1;15915:9;15911:17;15902:6;15858:71;:::i;:::-;15939:72;16007:2;15996:9;15992:18;15983:6;15939:72;:::i;:::-;16021;16089:2;16078:9;16074:18;16065:6;16021:72;:::i;:::-;16140:9;16134:4;16130:20;16125:2;16114:9;16110:18;16103:48;16168:76;16239:4;16230:6;16168:76;:::i;:::-;16160:84;;15611:640;;;;;;;:::o;16257:210::-;16344:4;16382:2;16371:9;16367:18;16359:26;;16395:65;16457:1;16446:9;16442:17;16433:6;16395:65;:::i;:::-;16257:210;;;;:::o;16473:313::-;16586:4;16624:2;16613:9;16609:18;16601:26;;16673:9;16667:4;16663:20;16659:1;16648:9;16644:17;16637:47;16701:78;16774:4;16765:6;16701:78;:::i;:::-;16693:86;;16473:313;;;;:::o;16792:419::-;16958:4;16996:2;16985:9;16981:18;16973:26;;17045:9;17039:4;17035:20;17031:1;17020:9;17016:17;17009:47;17073:131;17199:4;17073:131;:::i;:::-;17065:139;;16792:419;;;:::o;17217:::-;17383:4;17421:2;17410:9;17406:18;17398:26;;17470:9;17464:4;17460:20;17456:1;17445:9;17441:17;17434:47;17498:131;17624:4;17498:131;:::i;:::-;17490:139;;17217:419;;;:::o;17642:::-;17808:4;17846:2;17835:9;17831:18;17823:26;;17895:9;17889:4;17885:20;17881:1;17870:9;17866:17;17859:47;17923:131;18049:4;17923:131;:::i;:::-;17915:139;;17642:419;;;:::o;18067:::-;18233:4;18271:2;18260:9;18256:18;18248:26;;18320:9;18314:4;18310:20;18306:1;18295:9;18291:17;18284:47;18348:131;18474:4;18348:131;:::i;:::-;18340:139;;18067:419;;;:::o;18492:::-;18658:4;18696:2;18685:9;18681:18;18673:26;;18745:9;18739:4;18735:20;18731:1;18720:9;18716:17;18709:47;18773:131;18899:4;18773:131;:::i;:::-;18765:139;;18492:419;;;:::o;18917:::-;19083:4;19121:2;19110:9;19106:18;19098:26;;19170:9;19164:4;19160:20;19156:1;19145:9;19141:17;19134:47;19198:131;19324:4;19198:131;:::i;:::-;19190:139;;18917:419;;;:::o;19342:::-;19508:4;19546:2;19535:9;19531:18;19523:26;;19595:9;19589:4;19585:20;19581:1;19570:9;19566:17;19559:47;19623:131;19749:4;19623:131;:::i;:::-;19615:139;;19342:419;;;:::o;19767:::-;19933:4;19971:2;19960:9;19956:18;19948:26;;20020:9;20014:4;20010:20;20006:1;19995:9;19991:17;19984:47;20048:131;20174:4;20048:131;:::i;:::-;20040:139;;19767:419;;;:::o;20192:::-;20358:4;20396:2;20385:9;20381:18;20373:26;;20445:9;20439:4;20435:20;20431:1;20420:9;20416:17;20409:47;20473:131;20599:4;20473:131;:::i;:::-;20465:139;;20192:419;;;:::o;20617:::-;20783:4;20821:2;20810:9;20806:18;20798:26;;20870:9;20864:4;20860:20;20856:1;20845:9;20841:17;20834:47;20898:131;21024:4;20898:131;:::i;:::-;20890:139;;20617:419;;;:::o;21042:::-;21208:4;21246:2;21235:9;21231:18;21223:26;;21295:9;21289:4;21285:20;21281:1;21270:9;21266:17;21259:47;21323:131;21449:4;21323:131;:::i;:::-;21315:139;;21042:419;;;:::o;21467:::-;21633:4;21671:2;21660:9;21656:18;21648:26;;21720:9;21714:4;21710:20;21706:1;21695:9;21691:17;21684:47;21748:131;21874:4;21748:131;:::i;:::-;21740:139;;21467:419;;;:::o;21892:222::-;21985:4;22023:2;22012:9;22008:18;22000:26;;22036:71;22104:1;22093:9;22089:17;22080:6;22036:71;:::i;:::-;21892:222;;;;:::o;22120:129::-;22154:6;22181:20;;:::i;:::-;22171:30;;22210:33;22238:4;22230:6;22210:33;:::i;:::-;22120:129;;;:::o;22255:75::-;22288:6;22321:2;22315:9;22305:19;;22255:75;:::o;22336:307::-;22397:4;22487:18;22479:6;22476:30;22473:56;;;22509:18;;:::i;:::-;22473:56;22547:29;22569:6;22547:29;:::i;:::-;22539:37;;22631:4;22625;22621:15;22613:23;;22336:307;;;:::o;22649:308::-;22711:4;22801:18;22793:6;22790:30;22787:56;;;22823:18;;:::i;:::-;22787:56;22861:29;22883:6;22861:29;:::i;:::-;22853:37;;22945:4;22939;22935:15;22927:23;;22649:308;;;:::o;22963:141::-;23012:4;23035:3;23027:11;;23058:3;23055:1;23048:14;23092:4;23089:1;23079:18;23071:26;;22963:141;;;:::o;23110:98::-;23161:6;23195:5;23189:12;23179:22;;23110:98;;;:::o;23214:99::-;23266:6;23300:5;23294:12;23284:22;;23214:99;;;:::o;23319:168::-;23402:11;23436:6;23431:3;23424:19;23476:4;23471:3;23467:14;23452:29;;23319:168;;;;:::o;23493:169::-;23577:11;23611:6;23606:3;23599:19;23651:4;23646:3;23642:14;23627:29;;23493:169;;;;:::o;23668:148::-;23770:11;23807:3;23792:18;;23668:148;;;;:::o;23822:305::-;23862:3;23881:20;23899:1;23881:20;:::i;:::-;23876:25;;23915:20;23933:1;23915:20;:::i;:::-;23910:25;;24069:1;24001:66;23997:74;23994:1;23991:81;23988:107;;;24075:18;;:::i;:::-;23988:107;24119:1;24116;24112:9;24105:16;;23822:305;;;;:::o;24133:185::-;24173:1;24190:20;24208:1;24190:20;:::i;:::-;24185:25;;24224:20;24242:1;24224:20;:::i;:::-;24219:25;;24263:1;24253:35;;24268:18;;:::i;:::-;24253:35;24310:1;24307;24303:9;24298:14;;24133:185;;;;:::o;24324:191::-;24364:4;24384:20;24402:1;24384:20;:::i;:::-;24379:25;;24418:20;24436:1;24418:20;:::i;:::-;24413:25;;24457:1;24454;24451:8;24448:34;;;24462:18;;:::i;:::-;24448:34;24507:1;24504;24500:9;24492:17;;24324:191;;;;:::o;24521:96::-;24558:7;24587:24;24605:5;24587:24;:::i;:::-;24576:35;;24521:96;;;:::o;24623:90::-;24657:7;24700:5;24693:13;24686:21;24675:32;;24623:90;;;:::o;24719:149::-;24755:7;24795:66;24788:5;24784:78;24773:89;;24719:149;;;:::o;24874:126::-;24911:7;24951:42;24944:5;24940:54;24929:65;;24874:126;;;:::o;25006:77::-;25043:7;25072:5;25061:16;;25006:77;;;:::o;25089:154::-;25173:6;25168:3;25163;25150:30;25235:1;25226:6;25221:3;25217:16;25210:27;25089:154;;;:::o;25249:307::-;25317:1;25327:113;25341:6;25338:1;25335:13;25327:113;;;25426:1;25421:3;25417:11;25411:18;25407:1;25402:3;25398:11;25391:39;25363:2;25360:1;25356:10;25351:15;;25327:113;;;25458:6;25455:1;25452:13;25449:101;;;25538:1;25529:6;25524:3;25520:16;25513:27;25449:101;25298:258;25249:307;;;:::o;25562:320::-;25606:6;25643:1;25637:4;25633:12;25623:22;;25690:1;25684:4;25680:12;25711:18;25701:81;;25767:4;25759:6;25755:17;25745:27;;25701:81;25829:2;25821:6;25818:14;25798:18;25795:38;25792:84;;;25848:18;;:::i;:::-;25792:84;25613:269;25562:320;;;:::o;25888:281::-;25971:27;25993:4;25971:27;:::i;:::-;25963:6;25959:40;26101:6;26089:10;26086:22;26065:18;26053:10;26050:34;26047:62;26044:88;;;26112:18;;:::i;:::-;26044:88;26152:10;26148:2;26141:22;25931:238;25888:281;;:::o;26175:233::-;26214:3;26237:24;26255:5;26237:24;:::i;:::-;26228:33;;26283:66;26276:5;26273:77;26270:103;;;26353:18;;:::i;:::-;26270:103;26400:1;26393:5;26389:13;26382:20;;26175:233;;;:::o;26414:176::-;26446:1;26463:20;26481:1;26463:20;:::i;:::-;26458:25;;26497:20;26515:1;26497:20;:::i;:::-;26492:25;;26536:1;26526:35;;26541:18;;:::i;:::-;26526:35;26582:1;26579;26575:9;26570:14;;26414:176;;;;:::o;26596:180::-;26644:77;26641:1;26634:88;26741:4;26738:1;26731:15;26765:4;26762:1;26755:15;26782:180;26830:77;26827:1;26820:88;26927:4;26924:1;26917:15;26951:4;26948:1;26941:15;26968:180;27016:77;27013:1;27006:88;27113:4;27110:1;27103:15;27137:4;27134:1;27127:15;27154:180;27202:77;27199:1;27192:88;27299:4;27296:1;27289:15;27323:4;27320:1;27313:15;27340:180;27388:77;27385:1;27378:88;27485:4;27482:1;27475:15;27509:4;27506:1;27499:15;27526:117;27635:1;27632;27625:12;27649:117;27758:1;27755;27748:12;27772:117;27881:1;27878;27871:12;27895:117;28004:1;28001;27994:12;28018:102;28059:6;28110:2;28106:7;28101:2;28094:5;28090:14;28086:28;28076:38;;28018:102;;;:::o;28126:235::-;28266:34;28262:1;28254:6;28250:14;28243:58;28335:18;28330:2;28322:6;28318:15;28311:43;28126:235;:::o;28367:173::-;28507:25;28503:1;28495:6;28491:14;28484:49;28367:173;:::o;28546:178::-;28686:30;28682:1;28674:6;28670:14;28663:54;28546:178;:::o;28730:225::-;28870:34;28866:1;28858:6;28854:14;28847:58;28939:8;28934:2;28926:6;28922:15;28915:33;28730:225;:::o;28961:170::-;29101:22;29097:1;29089:6;29085:14;29078:46;28961:170;:::o;29137:162::-;29277:14;29273:1;29265:6;29261:14;29254:38;29137:162;:::o;29305:223::-;29445:34;29441:1;29433:6;29429:14;29422:58;29514:6;29509:2;29501:6;29497:15;29490:31;29305:223;:::o;29534:178::-;29674:30;29670:1;29662:6;29658:14;29651:54;29534:178;:::o;29718:182::-;29858:34;29854:1;29846:6;29842:14;29835:58;29718:182;:::o;29906:::-;30046:34;30042:1;30034:6;30030:14;30023:58;29906:182;:::o;30094:169::-;30234:21;30230:1;30222:6;30218:14;30211:45;30094:169;:::o;30269:181::-;30409:33;30405:1;30397:6;30393:14;30386:57;30269:181;:::o;30456:122::-;30529:24;30547:5;30529:24;:::i;:::-;30522:5;30519:35;30509:63;;30568:1;30565;30558:12;30509:63;30456:122;:::o;30584:116::-;30654:21;30669:5;30654:21;:::i;:::-;30647:5;30644:32;30634:60;;30690:1;30687;30680:12;30634:60;30584:116;:::o;30706:120::-;30778:23;30795:5;30778:23;:::i;:::-;30771:5;30768:34;30758:62;;30816:1;30813;30806:12;30758:62;30706:120;:::o;30832:122::-;30905:24;30923:5;30905:24;:::i;:::-;30898:5;30895:35;30885:63;;30944:1;30941;30934:12;30885:63;30832:122;:::o

Swarm Source

ipfs://0f87edff432f4eccf2a5d568378219341a90fa32f08f275604dc957505898604
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.