ETH Price: $3,112.92 (-0.63%)

Token

GrugsLair (GRUG)
 

Overview

Max Total Supply

1,000 GRUG

Holders

364

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 GRUG
0x14C81d281e96453508c80021306cBDB1070f7403
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:
Grug

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license
File 1 of 18 : Grug.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.10;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/interfaces/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

contract Grug is ERC721, ERC721Enumerable, Ownable, ReentrancyGuard {
    using Counters for Counters.Counter;

    // ============ PRIVATE ============
    Counters.Counter private _tokenIdCounter;

    // ============ PUBLIC ============
    string public baseURI;
    uint256 public maxGrugs;
    uint256 public startTime;
    uint256 public constant PUBLIC_SALE_PRICE = 0.1 ether;
    uint256 public constant OG_MINT_TIME = 2 days;
    uint256 public constant WHITELIST_MINT_TIME = OG_MINT_TIME + 5 days;
    bool public isOGSaleActive;

    // ============ MERKLE ROOTS ============
    bytes32 public oGMerkleRoot;
    bytes32 public whiteListMerkleRoot;

    // ============ MAPS ============ 
    mapping(address => bool) public hasMinted;

    // ============ ACCESS CONTROL ============

    modifier oGSaleActive() {
        require(isOGSaleActive, "OG sale is not open");
        _;
    }

    modifier canMintGrugs(uint256 numberOfTokens) {
        require(
            _tokenIdCounter.current() + numberOfTokens <= maxGrugs,
            "No Grugs Left"
        );
        _;
    }
    modifier isCorrectPayment(uint256 price, uint256 numberOfTokens) {
        require(
            price * numberOfTokens == msg.value,
            "Incorrect ETH value sent"
        );
        _;
    }

    modifier isValidMerkleProof(bytes32[] calldata merkleProof, bytes32 root) {
        require(
            MerkleProof.verify(
                merkleProof,
                root,
                keccak256(abi.encodePacked(msg.sender))
            ),
            "Address does not exist on list"
        );
        _;
    }
    modifier hasNotMinted() {
        require(
            !hasMinted[msg.sender],
            "Already Minted"
        );
        _;
    }
    constructor(uint256 _maxGrugs) ERC721("GrugsLair", "GRUG") { 
        maxGrugs = _maxGrugs;
    }

    // ============ MINT FUNCTIONS ==================

    function OGMint(bytes32[] calldata merkleProof)
        external
        payable
        nonReentrant
        oGSaleActive
        canMintGrugs(1)
        hasNotMinted
        isValidMerkleProof(merkleProof, oGMerkleRoot)
    {
        hasMinted[msg.sender] = true;
        _safeMint(msg.sender, nextTokenId());

    }

    function whiteListMint(bytes32[] calldata merkleProof)
        external
        payable
        nonReentrant
        oGSaleActive
        canMintGrugs(1)
        hasNotMinted
        isCorrectPayment(PUBLIC_SALE_PRICE, 1)
        isValidMerkleProof(merkleProof, whiteListMerkleRoot)
    {
        require(block.timestamp > startTime + OG_MINT_TIME, "whitelist mint not started");
        hasMinted[msg.sender] = true;
        _safeMint(msg.sender, nextTokenId());
    }

    function mint(uint8 numberOfTokens)
        external
        payable
        nonReentrant
        oGSaleActive
        canMintGrugs(numberOfTokens)
        isCorrectPayment(PUBLIC_SALE_PRICE, numberOfTokens)
    {
        require(block.timestamp > startTime + WHITELIST_MINT_TIME, "public mint not started");
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, nextTokenId());
        }
    }

    function ownerMint(uint8 numberOfTokens)
        external
        payable
        nonReentrant
        oGSaleActive
        canMintGrugs(numberOfTokens)
        onlyOwner
    {
        for (uint256 i = 0; i < numberOfTokens; i++) {
            _safeMint(msg.sender, nextTokenId());
        }
    }

    // ============ SUPPORTING FUNCTIONS ============
    function setMaxGrugs(uint256 _value) external onlyOwner {
        maxGrugs = _value;
    }

    function setIsOgSaleActive(bool _value) external onlyOwner {
        isOGSaleActive = _value;
        startTime = block.timestamp;
    }

    function setOgMerkleRoot(bytes32 _merkleRoot)
        external
        onlyOwner
    {
        oGMerkleRoot = _merkleRoot;
    }

    function setWhiteListMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        whiteListMerkleRoot = _merkleRoot;
    }

    function setTokenURI(string memory _tokenURI) external onlyOwner {
        baseURI = _tokenURI;
    }

    function nextTokenId() private returns (uint256) {
        _tokenIdCounter.increment();
        return _tokenIdCounter.current();
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        token.transfer(msg.sender, balance);
    }

    // ============ OVERRIDES ============

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(_exists(tokenId), "Nonexistent token");

        return
            string(abi.encodePacked(baseURI, "/", Strings.toString(tokenId)));
    }

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

File 2 of 18 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @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) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        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 virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _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 {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

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

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

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

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

        _balances[owner] -= 1;
        delete _owners[tokenId];

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

File 3 of 18 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

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

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

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

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

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

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

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

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

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

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

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

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

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

File 4 of 18 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (interfaces/IERC20.sol)

pragma solidity ^0.8.0;

import "../token/ERC20/IERC20.sol";

File 5 of 18 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

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

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

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

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

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

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

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

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

File 6 of 18 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

File 7 of 18 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 8 of 18 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 9 of 18 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = keccak256(abi.encodePacked(computedHash, proofElement));
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = keccak256(abi.encodePacked(proofElement, computedHash));
            }
        }
        return computedHash;
    }
}

File 10 of 18 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

File 12 of 18 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 13 of 18 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 14 of 18 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 15 of 18 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 16 of 18 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 17 of 18 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

File 18 of 18 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"uint256","name":"_maxGrugs","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"OGMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"OG_MINT_TIME","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_SALE_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_MINT_TIME","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":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"isOGSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGrugs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oGMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"numberOfTokens","type":"uint8"}],"name":"ownerMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_value","type":"bool"}],"name":"setIsOgSaleActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"setMaxGrugs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setOgMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setWhiteListMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"whiteListMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005582380380620055828339818101604052810190620000379190620002cb565b6040518060400160405280600981526020017f47727567734c61697200000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47525547000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb929190620001db565b508060019080519060200190620000d4929190620001db565b505050620000f7620000eb6200010d60201b60201c565b6200011560201b60201c565b6001600b8190555080600e819055505062000362565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620001e9906200032c565b90600052602060002090601f0160209004810192826200020d576000855562000259565b82601f106200022857805160ff191683800117855562000259565b8280016001018555821562000259579182015b82811115620002585782518255916020019190600101906200023b565b5b5090506200026891906200026c565b5090565b5b80821115620002875760008160009055506001016200026d565b5090565b600080fd5b6000819050919050565b620002a58162000290565b8114620002b157600080fd5b50565b600081519050620002c5816200029a565b92915050565b600060208284031215620002e457620002e36200028b565b5b6000620002f484828501620002b4565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034557607f821691505b602082108114156200035c576200035b620002fd565b5b50919050565b61521080620003726000396000f3fe60806040526004361061023a5760003560e01c80636c0360eb1161012e578063b83e1346116100ab578063e08e65ea1161006f578063e08e65ea1461083a578063e0df5b6f14610863578063e985e9c51461088c578063ef978827146108c9578063f2fde38b146108f45761023a565b8063b83e134614610755578063b88d4fde14610780578063c30373ab146107a9578063c87b56dd146107d4578063d8a7ab89146108115761023a565b80638da5cb5b116100f25780638da5cb5b1461069e57806395d89b41146106c957806397254e55146106f4578063a22cb46514610710578063b308ff33146107395761023a565b80636c0360eb146105d85780636ecd23061461060357806370a082311461061f578063715018a61461065c57806378e97925146106735761023a565b80632796d139116101bc57806342842e0e1161018057806342842e0e146104e357806349df728c1461050c5780634aac41e6146105355780634f6ccce71461055e5780636352211e1461059b5761023a565b80632796d139146103fc5780632f745c591461042757806334b6ab1a1461046457806338e21cce1461048f5780633ccfd60b146104cc5761023a565b8063081812fc11610203578063081812fc14610317578063095ea7b31461035457806318160ddd1461037d5780631959d9f8146103a857806323b872dd146103d35761023a565b80629a46fd1461023f5780630186d1371461026857806301ffc9a71461028457806306fdde03146102c157806307e89ec0146102ec575b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190613624565b61091d565b005b610282600480360381019061027d91906136b6565b6109bd565b005b34801561029057600080fd5b506102ab60048036038101906102a6919061375b565b610c71565b6040516102b89190613797565b60405180910390f35b3480156102cd57600080fd5b506102d6610c83565b6040516102e3919061384b565b60405180910390f35b3480156102f857600080fd5b50610301610d15565b60405161030e9190613886565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906138cd565b610d21565b60405161034b919061393b565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190613982565b610da6565b005b34801561038957600080fd5b50610392610ebe565b60405161039f9190613886565b60405180910390f35b3480156103b457600080fd5b506103bd610ecb565b6040516103ca9190613797565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906139c2565b610ede565b005b34801561040857600080fd5b50610411610f3e565b60405161041e9190613886565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613982565b610f45565b60405161045b9190613886565b60405180910390f35b34801561047057600080fd5b50610479610fea565b6040516104869190613a2e565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190613a49565b610ff0565b6040516104c39190613797565b60405180910390f35b3480156104d857600080fd5b506104e1611010565b005b3480156104ef57600080fd5b5061050a600480360381019061050591906139c2565b6110db565b005b34801561051857600080fd5b50610533600480360381019061052e9190613ab4565b6110fb565b005b34801561054157600080fd5b5061055c600480360381019061055791906138cd565b611278565b005b34801561056a57600080fd5b50610585600480360381019061058091906138cd565b6112fe565b6040516105929190613886565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906138cd565b61136f565b6040516105cf919061393b565b60405180910390f35b3480156105e457600080fd5b506105ed611421565b6040516105fa919061384b565b60405180910390f35b61061d60048036038101906106189190613b1a565b6114af565b005b34801561062b57600080fd5b5061064660048036038101906106419190613a49565b6116a4565b6040516106539190613886565b60405180910390f35b34801561066857600080fd5b5061067161175c565b005b34801561067f57600080fd5b506106886117e4565b6040516106959190613886565b60405180910390f35b3480156106aa57600080fd5b506106b36117ea565b6040516106c0919061393b565b60405180910390f35b3480156106d557600080fd5b506106de611814565b6040516106eb919061384b565b60405180910390f35b61070e600480360381019061070991906136b6565b6118a6565b005b34801561071c57600080fd5b5061073760048036038101906107329190613b47565b611c06565b005b610753600480360381019061074e9190613b1a565b611c1c565b005b34801561076157600080fd5b5061076a611dd1565b6040516107779190613a2e565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613cb7565b611dd7565b005b3480156107b557600080fd5b506107be611e39565b6040516107cb9190613886565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f691906138cd565b611e4e565b604051610808919061384b565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613d66565b611eca565b005b34801561084657600080fd5b50610861600480360381019061085c9190613d66565b611f50565b005b34801561086f57600080fd5b5061088a60048036038101906108859190613e34565b611fd6565b005b34801561089857600080fd5b506108b360048036038101906108ae9190613e7d565b61206c565b6040516108c09190613797565b60405180910390f35b3480156108d557600080fd5b506108de612100565b6040516108eb9190613886565b60405180910390f35b34801561090057600080fd5b5061091b60048036038101906109169190613a49565b612106565b005b6109256121fe565b73ffffffffffffffffffffffffffffffffffffffff166109436117ea565b73ffffffffffffffffffffffffffffffffffffffff1614610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090613f09565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555042600f8190555050565b6002600b541415610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190613fe1565b60405180910390fd5b6001600e5481610a6a600c612206565b610a749190614030565b1115610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac906140d2565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b399061413e565b60405180910390fd5b8282601154610bb9838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610b9e91906141a6565b60405160208183030381529060405280519060200120612214565b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061420d565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610c6133610c5c61222b565b612246565b505050506001600b819055505050565b6000610c7c82612264565b9050919050565b606060008054610c929061425c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe9061425c565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b67016345785d8a000081565b6000610d2c826122de565b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290614300565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db18261136f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614392565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e416121fe565b73ffffffffffffffffffffffffffffffffffffffff161480610e705750610e6f81610e6a6121fe565b61206c565b5b610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614424565b60405180910390fd5b610eb9838361234a565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610eef610ee96121fe565b82612403565b610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906144b6565b60405180910390fd5b610f398383836124e1565b505050565b6202a30081565b6000610f50836116a4565b8210610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890614548565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60125481565b60136020528060005260406000206000915054906101000a900460ff1681565b6110186121fe565b73ffffffffffffffffffffffffffffffffffffffff166110366117ea565b73ffffffffffffffffffffffffffffffffffffffff161461108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613f09565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110d7573d6000803e3d6000fd5b5050565b6110f683838360405180602001604052806000815250611dd7565b505050565b6111036121fe565b73ffffffffffffffffffffffffffffffffffffffff166111216117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e90613f09565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111b2919061393b565b602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f3919061457d565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016112309291906145aa565b6020604051808303816000875af115801561124f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127391906145e8565b505050565b6112806121fe565b73ffffffffffffffffffffffffffffffffffffffff1661129e6117ea565b73ffffffffffffffffffffffffffffffffffffffff16146112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90613f09565b60405180910390fd5b80600e8190555050565b6000611308610ebe565b8210611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614687565b60405180910390fd5b6008828154811061135d5761135c6146a7565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90614748565b60405180910390fd5b80915050919050565b600d805461142e9061425c565b80601f016020809104026020016040519081016040528092919081815260200182805461145a9061425c565b80156114a75780601f1061147c576101008083540402835291602001916114a7565b820191906000526020600020905b81548152906001019060200180831161148a57829003601f168201915b505050505081565b6002600b5414156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff1661154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390613fe1565b60405180910390fd5b8060ff16600e548161155e600c612206565b6115689190614030565b11156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906140d2565b60405180910390fd5b67016345785d8a00008260ff163481836115c39190614768565b14611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa9061480e565b60405180910390fd5b620697806202a3006116159190614030565b600f546116229190614030565b4211611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a9061487a565b60405180910390fd5b60005b8460ff16811015611695576116823361167d61222b565b612246565b808061168d9061489a565b915050611666565b505050506001600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c90614955565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117646121fe565b73ffffffffffffffffffffffffffffffffffffffff166117826117ea565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90613f09565b60405180910390fd5b6117e2600061273d565b565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118239061425c565b80601f016020809104026020016040519081016040528092919081815260200182805461184f9061425c565b801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b5050505050905090565b6002600b5414156118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a90613fe1565b60405180910390fd5b6001600e5481611953600c612206565b61195d9190614030565b111561199e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611995906140d2565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a229061413e565b60405180910390fd5b67016345785d8a00006001348183611a439190614768565b14611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a9061480e565b60405180910390fd5b8484601254611afa838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001611adf91906141a6565b60405160208183030381529060405280519060200120612214565b611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b309061420d565b60405180910390fd5b6202a300600f54611b4a9190614030565b4211611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b82906149c1565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bf433611bef61222b565b612246565b5050505050506001600b819055505050565b611c18611c116121fe565b8383612803565b5050565b6002600b541415611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5990613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613fe1565b60405180910390fd5b8060ff16600e5481611ccb600c612206565b611cd59190614030565b1115611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d906140d2565b60405180910390fd5b611d1e6121fe565b73ffffffffffffffffffffffffffffffffffffffff16611d3c6117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990613f09565b60405180910390fd5b60005b8260ff16811015611dc457611db133611dac61222b565b612246565b8080611dbc9061489a565b915050611d95565b50506001600b8190555050565b60115481565b611de8611de26121fe565b83612403565b611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e906144b6565b60405180910390fd5b611e3384848484612970565b50505050565b620697806202a300611e4b9190614030565b81565b6060611e59826122de565b611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90614a2d565b60405180910390fd5b600d611ea3836129cc565b604051602001611eb4929190614b69565b6040516020818303038152906040529050919050565b611ed26121fe565b73ffffffffffffffffffffffffffffffffffffffff16611ef06117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90613f09565b60405180910390fd5b8060118190555050565b611f586121fe565b73ffffffffffffffffffffffffffffffffffffffff16611f766117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc390613f09565b60405180910390fd5b8060128190555050565b611fde6121fe565b73ffffffffffffffffffffffffffffffffffffffff16611ffc6117ea565b73ffffffffffffffffffffffffffffffffffffffff1614612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613f09565b60405180910390fd5b80600d9080519060200190612068929190613535565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b61210e6121fe565b73ffffffffffffffffffffffffffffffffffffffff1661212c6117ea565b73ffffffffffffffffffffffffffffffffffffffff1614612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217990613f09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614c0a565b60405180910390fd5b6121fb8161273d565b50565b600033905090565b600081600001549050919050565b6000826122218584612b2d565b1490509392505050565b6000612237600c612be0565b612241600c612206565b905090565b612260828260405180602001604052806000815250612bf6565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122d757506122d682612c51565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123bd8361136f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061240e826122de565b61244d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244490614c9c565b60405180910390fd5b60006124588361136f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124c757508373ffffffffffffffffffffffffffffffffffffffff166124af84610d21565b73ffffffffffffffffffffffffffffffffffffffff16145b806124d857506124d7818561206c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125018261136f565b73ffffffffffffffffffffffffffffffffffffffff1614612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614d2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125be90614dc0565b60405180910390fd5b6125d2838383612d33565b6125dd60008261234a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262d9190614de0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126849190614030565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286990614e60565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129639190613797565b60405180910390a3505050565b61297b8484846124e1565b61298784848484612d43565b6129c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bd90614ef2565b60405180910390fd5b50505050565b60606000821415612a14576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b28565b600082905060005b60008214612a46578080612a2f9061489a565b915050600a82612a3f9190614f41565b9150612a1c565b60008167ffffffffffffffff811115612a6257612a61613b8c565b5b6040519080825280601f01601f191660200182016040528015612a945781602001600182028036833780820191505090505b5090505b60008514612b2157600182612aad9190614de0565b9150600a85612abc9190614f72565b6030612ac89190614030565b60f81b818381518110612ade57612add6146a7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1a9190614f41565b9450612a98565b8093505050505b919050565b60008082905060005b8451811015612bd5576000858281518110612b5457612b536146a7565b5b60200260200101519050808311612b95578281604051602001612b78929190614fc4565b604051602081830303815290604052805190602001209250612bc1565b8083604051602001612ba8929190614fc4565b6040516020818303038152906040528051906020012092505b508080612bcd9061489a565b915050612b36565b508091505092915050565b6001816000016000828254019250508190555050565b612c008383612ecb565b612c0d6000848484612d43565b612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4390614ef2565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d1c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d2c5750612d2b82613099565b5b9050919050565b612d3e838383613103565b505050565b6000612d648473ffffffffffffffffffffffffffffffffffffffff16613217565b15612ebe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d8d6121fe565b8786866040518563ffffffff1660e01b8152600401612daf9493929190615045565b6020604051808303816000875af1925050508015612deb57506040513d601f19601f82011682018060405250810190612de891906150a6565b60015b612e6e573d8060008114612e1b576040519150601f19603f3d011682016040523d82523d6000602084013e612e20565b606091505b50600081511415612e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5d90614ef2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ec3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f329061511f565b60405180910390fd5b612f44816122de565b15612f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7b9061518b565b60405180910390fd5b612f9060008383612d33565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fe09190614030565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61310e83838361322a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131515761314c8161322f565b613190565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318f5761318e8382613278565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131d3576131ce816133e5565b613212565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132115761321082826134b6565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613285846116a4565b61328f9190614de0565b9050600060076000848152602001908152602001600020549050818114613374576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133f99190614de0565b9050600060096000848152602001908152602001600020549050600060088381548110613429576134286146a7565b5b90600052602060002001549050806008838154811061344b5761344a6146a7565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061349a576134996151ab565b5b6001900381819060005260206000200160009055905550505050565b60006134c1836116a4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546135419061425c565b90600052602060002090601f01602090048101928261356357600085556135aa565b82601f1061357c57805160ff19168380011785556135aa565b828001600101855582156135aa579182015b828111156135a957825182559160200191906001019061358e565b5b5090506135b791906135bb565b5090565b5b808211156135d45760008160009055506001016135bc565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b613601816135ec565b811461360c57600080fd5b50565b60008135905061361e816135f8565b92915050565b60006020828403121561363a576136396135e2565b5b60006136488482850161360f565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261367657613675613651565b5b8235905067ffffffffffffffff81111561369357613692613656565b5b6020830191508360208202830111156136af576136ae61365b565b5b9250929050565b600080602083850312156136cd576136cc6135e2565b5b600083013567ffffffffffffffff8111156136eb576136ea6135e7565b5b6136f785828601613660565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61373881613703565b811461374357600080fd5b50565b6000813590506137558161372f565b92915050565b600060208284031215613771576137706135e2565b5b600061377f84828501613746565b91505092915050565b613791816135ec565b82525050565b60006020820190506137ac6000830184613788565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156137ec5780820151818401526020810190506137d1565b838111156137fb576000848401525b50505050565b6000601f19601f8301169050919050565b600061381d826137b2565b61382781856137bd565b93506138378185602086016137ce565b61384081613801565b840191505092915050565b600060208201905081810360008301526138658184613812565b905092915050565b6000819050919050565b6138808161386d565b82525050565b600060208201905061389b6000830184613877565b92915050565b6138aa8161386d565b81146138b557600080fd5b50565b6000813590506138c7816138a1565b92915050565b6000602082840312156138e3576138e26135e2565b5b60006138f1848285016138b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613925826138fa565b9050919050565b6139358161391a565b82525050565b6000602082019050613950600083018461392c565b92915050565b61395f8161391a565b811461396a57600080fd5b50565b60008135905061397c81613956565b92915050565b60008060408385031215613999576139986135e2565b5b60006139a78582860161396d565b92505060206139b8858286016138b8565b9150509250929050565b6000806000606084860312156139db576139da6135e2565b5b60006139e98682870161396d565b93505060206139fa8682870161396d565b9250506040613a0b868287016138b8565b9150509250925092565b6000819050919050565b613a2881613a15565b82525050565b6000602082019050613a436000830184613a1f565b92915050565b600060208284031215613a5f57613a5e6135e2565b5b6000613a6d8482850161396d565b91505092915050565b6000613a818261391a565b9050919050565b613a9181613a76565b8114613a9c57600080fd5b50565b600081359050613aae81613a88565b92915050565b600060208284031215613aca57613ac96135e2565b5b6000613ad884828501613a9f565b91505092915050565b600060ff82169050919050565b613af781613ae1565b8114613b0257600080fd5b50565b600081359050613b1481613aee565b92915050565b600060208284031215613b3057613b2f6135e2565b5b6000613b3e84828501613b05565b91505092915050565b60008060408385031215613b5e57613b5d6135e2565b5b6000613b6c8582860161396d565b9250506020613b7d8582860161360f565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bc482613801565b810181811067ffffffffffffffff82111715613be357613be2613b8c565b5b80604052505050565b6000613bf66135d8565b9050613c028282613bbb565b919050565b600067ffffffffffffffff821115613c2257613c21613b8c565b5b613c2b82613801565b9050602081019050919050565b82818337600083830152505050565b6000613c5a613c5584613c07565b613bec565b905082815260208101848484011115613c7657613c75613b87565b5b613c81848285613c38565b509392505050565b600082601f830112613c9e57613c9d613651565b5b8135613cae848260208601613c47565b91505092915050565b60008060008060808587031215613cd157613cd06135e2565b5b6000613cdf8782880161396d565b9450506020613cf08782880161396d565b9350506040613d01878288016138b8565b925050606085013567ffffffffffffffff811115613d2257613d216135e7565b5b613d2e87828801613c89565b91505092959194509250565b613d4381613a15565b8114613d4e57600080fd5b50565b600081359050613d6081613d3a565b92915050565b600060208284031215613d7c57613d7b6135e2565b5b6000613d8a84828501613d51565b91505092915050565b600067ffffffffffffffff821115613dae57613dad613b8c565b5b613db782613801565b9050602081019050919050565b6000613dd7613dd284613d93565b613bec565b905082815260208101848484011115613df357613df2613b87565b5b613dfe848285613c38565b509392505050565b600082601f830112613e1b57613e1a613651565b5b8135613e2b848260208601613dc4565b91505092915050565b600060208284031215613e4a57613e496135e2565b5b600082013567ffffffffffffffff811115613e6857613e676135e7565b5b613e7484828501613e06565b91505092915050565b60008060408385031215613e9457613e936135e2565b5b6000613ea28582860161396d565b9250506020613eb38582860161396d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ef36020836137bd565b9150613efe82613ebd565b602082019050919050565b60006020820190508181036000830152613f2281613ee6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f5f601f836137bd565b9150613f6a82613f29565b602082019050919050565b60006020820190508181036000830152613f8e81613f52565b9050919050565b7f4f472073616c65206973206e6f74206f70656e00000000000000000000000000600082015250565b6000613fcb6013836137bd565b9150613fd682613f95565b602082019050919050565b60006020820190508181036000830152613ffa81613fbe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061403b8261386d565b91506140468361386d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561407b5761407a614001565b5b828201905092915050565b7f4e6f204772756773204c65667400000000000000000000000000000000000000600082015250565b60006140bc600d836137bd565b91506140c782614086565b602082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b7f416c7265616479204d696e746564000000000000000000000000000000000000600082015250565b6000614128600e836137bd565b9150614133826140f2565b602082019050919050565b600060208201905081810360008301526141578161411b565b9050919050565b60008160601b9050919050565b60006141768261415e565b9050919050565b60006141888261416b565b9050919050565b6141a061419b8261391a565b61417d565b82525050565b60006141b2828461418f565b60148201915081905092915050565b7f4164647265737320646f6573206e6f74206578697374206f6e206c6973740000600082015250565b60006141f7601e836137bd565b9150614202826141c1565b602082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061427457607f821691505b602082108114156142885761428761422d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142ea602c836137bd565b91506142f58261428e565b604082019050919050565b60006020820190508181036000830152614319816142dd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061437c6021836137bd565b915061438782614320565b604082019050919050565b600060208201905081810360008301526143ab8161436f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061440e6038836137bd565b9150614419826143b2565b604082019050919050565b6000602082019050818103600083015261443d81614401565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006144a06031836137bd565b91506144ab82614444565b604082019050919050565b600060208201905081810360008301526144cf81614493565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614532602b836137bd565b915061453d826144d6565b604082019050919050565b6000602082019050818103600083015261456181614525565b9050919050565b600081519050614577816138a1565b92915050565b600060208284031215614593576145926135e2565b5b60006145a184828501614568565b91505092915050565b60006040820190506145bf600083018561392c565b6145cc6020830184613877565b9392505050565b6000815190506145e2816135f8565b92915050565b6000602082840312156145fe576145fd6135e2565b5b600061460c848285016145d3565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614671602c836137bd565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006147326029836137bd565b915061473d826146d6565b604082019050919050565b6000602082019050818103600083015261476181614725565b9050919050565b60006147738261386d565b915061477e8361386d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147b7576147b6614001565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b60006147f86018836137bd565b9150614803826147c2565b602082019050919050565b60006020820190508181036000830152614827816147eb565b9050919050565b7f7075626c6963206d696e74206e6f742073746172746564000000000000000000600082015250565b60006148646017836137bd565b915061486f8261482e565b602082019050919050565b6000602082019050818103600083015261489381614857565b9050919050565b60006148a58261386d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d8576148d7614001565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061493f602a836137bd565b915061494a826148e3565b604082019050919050565b6000602082019050818103600083015261496e81614932565b9050919050565b7f77686974656c697374206d696e74206e6f742073746172746564000000000000600082015250565b60006149ab601a836137bd565b91506149b682614975565b602082019050919050565b600060208201905081810360008301526149da8161499e565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000614a176011836137bd565b9150614a22826149e1565b602082019050919050565b60006020820190508181036000830152614a4681614a0a565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614a7a8161425c565b614a848186614a4d565b94506001821660008114614a9f5760018114614ab057614ae3565b60ff19831686528186019350614ae3565b614ab985614a58565b60005b83811015614adb57815481890152600182019150602081019050614abc565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b22600183614a4d565b9150614b2d82614aec565b600182019050919050565b6000614b43826137b2565b614b4d8185614a4d565b9350614b5d8185602086016137ce565b80840191505092915050565b6000614b758285614a6d565b9150614b8082614b15565b9150614b8c8284614b38565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614bf46026836137bd565b9150614bff82614b98565b604082019050919050565b60006020820190508181036000830152614c2381614be7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c86602c836137bd565b9150614c9182614c2a565b604082019050919050565b60006020820190508181036000830152614cb581614c79565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614d186029836137bd565b9150614d2382614cbc565b604082019050919050565b60006020820190508181036000830152614d4781614d0b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614daa6024836137bd565b9150614db582614d4e565b604082019050919050565b60006020820190508181036000830152614dd981614d9d565b9050919050565b6000614deb8261386d565b9150614df68361386d565b925082821015614e0957614e08614001565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e4a6019836137bd565b9150614e5582614e14565b602082019050919050565b60006020820190508181036000830152614e7981614e3d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614edc6032836137bd565b9150614ee782614e80565b604082019050919050565b60006020820190508181036000830152614f0b81614ecf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f4c8261386d565b9150614f578361386d565b925082614f6757614f66614f12565b5b828204905092915050565b6000614f7d8261386d565b9150614f888361386d565b925082614f9857614f97614f12565b5b828206905092915050565b6000819050919050565b614fbe614fb982613a15565b614fa3565b82525050565b6000614fd08285614fad565b602082019150614fe08284614fad565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061501782614ff0565b6150218185614ffb565b93506150318185602086016137ce565b61503a81613801565b840191505092915050565b600060808201905061505a600083018761392c565b615067602083018661392c565b6150746040830185613877565b8181036060830152615086818461500c565b905095945050505050565b6000815190506150a08161372f565b92915050565b6000602082840312156150bc576150bb6135e2565b5b60006150ca84828501615091565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006151096020836137bd565b9150615114826150d3565b602082019050919050565b60006020820190508181036000830152615138816150fc565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615175601c836137bd565b91506151808261513f565b602082019050919050565b600060208201905081810360008301526151a481615168565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202b6ab5b9034da7ead1a69f6adf331386ca16d3e725ede6f4472adcf93a33c5ea64736f6c634300080a003300000000000000000000000000000000000000000000000000000000000003e8

Deployed Bytecode

0x60806040526004361061023a5760003560e01c80636c0360eb1161012e578063b83e1346116100ab578063e08e65ea1161006f578063e08e65ea1461083a578063e0df5b6f14610863578063e985e9c51461088c578063ef978827146108c9578063f2fde38b146108f45761023a565b8063b83e134614610755578063b88d4fde14610780578063c30373ab146107a9578063c87b56dd146107d4578063d8a7ab89146108115761023a565b80638da5cb5b116100f25780638da5cb5b1461069e57806395d89b41146106c957806397254e55146106f4578063a22cb46514610710578063b308ff33146107395761023a565b80636c0360eb146105d85780636ecd23061461060357806370a082311461061f578063715018a61461065c57806378e97925146106735761023a565b80632796d139116101bc57806342842e0e1161018057806342842e0e146104e357806349df728c1461050c5780634aac41e6146105355780634f6ccce71461055e5780636352211e1461059b5761023a565b80632796d139146103fc5780632f745c591461042757806334b6ab1a1461046457806338e21cce1461048f5780633ccfd60b146104cc5761023a565b8063081812fc11610203578063081812fc14610317578063095ea7b31461035457806318160ddd1461037d5780631959d9f8146103a857806323b872dd146103d35761023a565b80629a46fd1461023f5780630186d1371461026857806301ffc9a71461028457806306fdde03146102c157806307e89ec0146102ec575b600080fd5b34801561024b57600080fd5b5061026660048036038101906102619190613624565b61091d565b005b610282600480360381019061027d91906136b6565b6109bd565b005b34801561029057600080fd5b506102ab60048036038101906102a6919061375b565b610c71565b6040516102b89190613797565b60405180910390f35b3480156102cd57600080fd5b506102d6610c83565b6040516102e3919061384b565b60405180910390f35b3480156102f857600080fd5b50610301610d15565b60405161030e9190613886565b60405180910390f35b34801561032357600080fd5b5061033e600480360381019061033991906138cd565b610d21565b60405161034b919061393b565b60405180910390f35b34801561036057600080fd5b5061037b60048036038101906103769190613982565b610da6565b005b34801561038957600080fd5b50610392610ebe565b60405161039f9190613886565b60405180910390f35b3480156103b457600080fd5b506103bd610ecb565b6040516103ca9190613797565b60405180910390f35b3480156103df57600080fd5b506103fa60048036038101906103f591906139c2565b610ede565b005b34801561040857600080fd5b50610411610f3e565b60405161041e9190613886565b60405180910390f35b34801561043357600080fd5b5061044e60048036038101906104499190613982565b610f45565b60405161045b9190613886565b60405180910390f35b34801561047057600080fd5b50610479610fea565b6040516104869190613a2e565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190613a49565b610ff0565b6040516104c39190613797565b60405180910390f35b3480156104d857600080fd5b506104e1611010565b005b3480156104ef57600080fd5b5061050a600480360381019061050591906139c2565b6110db565b005b34801561051857600080fd5b50610533600480360381019061052e9190613ab4565b6110fb565b005b34801561054157600080fd5b5061055c600480360381019061055791906138cd565b611278565b005b34801561056a57600080fd5b50610585600480360381019061058091906138cd565b6112fe565b6040516105929190613886565b60405180910390f35b3480156105a757600080fd5b506105c260048036038101906105bd91906138cd565b61136f565b6040516105cf919061393b565b60405180910390f35b3480156105e457600080fd5b506105ed611421565b6040516105fa919061384b565b60405180910390f35b61061d60048036038101906106189190613b1a565b6114af565b005b34801561062b57600080fd5b5061064660048036038101906106419190613a49565b6116a4565b6040516106539190613886565b60405180910390f35b34801561066857600080fd5b5061067161175c565b005b34801561067f57600080fd5b506106886117e4565b6040516106959190613886565b60405180910390f35b3480156106aa57600080fd5b506106b36117ea565b6040516106c0919061393b565b60405180910390f35b3480156106d557600080fd5b506106de611814565b6040516106eb919061384b565b60405180910390f35b61070e600480360381019061070991906136b6565b6118a6565b005b34801561071c57600080fd5b5061073760048036038101906107329190613b47565b611c06565b005b610753600480360381019061074e9190613b1a565b611c1c565b005b34801561076157600080fd5b5061076a611dd1565b6040516107779190613a2e565b60405180910390f35b34801561078c57600080fd5b506107a760048036038101906107a29190613cb7565b611dd7565b005b3480156107b557600080fd5b506107be611e39565b6040516107cb9190613886565b60405180910390f35b3480156107e057600080fd5b506107fb60048036038101906107f691906138cd565b611e4e565b604051610808919061384b565b60405180910390f35b34801561081d57600080fd5b5061083860048036038101906108339190613d66565b611eca565b005b34801561084657600080fd5b50610861600480360381019061085c9190613d66565b611f50565b005b34801561086f57600080fd5b5061088a60048036038101906108859190613e34565b611fd6565b005b34801561089857600080fd5b506108b360048036038101906108ae9190613e7d565b61206c565b6040516108c09190613797565b60405180910390f35b3480156108d557600080fd5b506108de612100565b6040516108eb9190613886565b60405180910390f35b34801561090057600080fd5b5061091b60048036038101906109169190613a49565b612106565b005b6109256121fe565b73ffffffffffffffffffffffffffffffffffffffff166109436117ea565b73ffffffffffffffffffffffffffffffffffffffff1614610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099090613f09565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555042600f8190555050565b6002600b541415610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16610a5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5190613fe1565b60405180910390fd5b6001600e5481610a6a600c612206565b610a749190614030565b1115610ab5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aac906140d2565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b399061413e565b60405180910390fd5b8282601154610bb9838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001610b9e91906141a6565b60405160208183030381529060405280519060200120612214565b610bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bef9061420d565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550610c6133610c5c61222b565b612246565b505050506001600b819055505050565b6000610c7c82612264565b9050919050565b606060008054610c929061425c565b80601f0160208091040260200160405190810160405280929190818152602001828054610cbe9061425c565b8015610d0b5780601f10610ce057610100808354040283529160200191610d0b565b820191906000526020600020905b815481529060010190602001808311610cee57829003601f168201915b5050505050905090565b67016345785d8a000081565b6000610d2c826122de565b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290614300565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610db18261136f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1990614392565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e416121fe565b73ffffffffffffffffffffffffffffffffffffffff161480610e705750610e6f81610e6a6121fe565b61206c565b5b610eaf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea690614424565b60405180910390fd5b610eb9838361234a565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610eef610ee96121fe565b82612403565b610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906144b6565b60405180910390fd5b610f398383836124e1565b505050565b6202a30081565b6000610f50836116a4565b8210610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8890614548565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60125481565b60136020528060005260406000206000915054906101000a900460ff1681565b6110186121fe565b73ffffffffffffffffffffffffffffffffffffffff166110366117ea565b73ffffffffffffffffffffffffffffffffffffffff161461108c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108390613f09565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156110d7573d6000803e3d6000fd5b5050565b6110f683838360405180602001604052806000815250611dd7565b505050565b6111036121fe565b73ffffffffffffffffffffffffffffffffffffffff166111216117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611177576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116e90613f09565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016111b2919061393b565b602060405180830381865afa1580156111cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f3919061457d565b90508173ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33836040518363ffffffff1660e01b81526004016112309291906145aa565b6020604051808303816000875af115801561124f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061127391906145e8565b505050565b6112806121fe565b73ffffffffffffffffffffffffffffffffffffffff1661129e6117ea565b73ffffffffffffffffffffffffffffffffffffffff16146112f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112eb90613f09565b60405180910390fd5b80600e8190555050565b6000611308610ebe565b8210611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134090614687565b60405180910390fd5b6008828154811061135d5761135c6146a7565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611418576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140f90614748565b60405180910390fd5b80915050919050565b600d805461142e9061425c565b80601f016020809104026020016040519081016040528092919081815260200182805461145a9061425c565b80156114a75780601f1061147c576101008083540402835291602001916114a7565b820191906000526020600020905b81548152906001019060200180831161148a57829003601f168201915b505050505081565b6002600b5414156114f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ec90613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff1661154c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154390613fe1565b60405180910390fd5b8060ff16600e548161155e600c612206565b6115689190614030565b11156115a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a0906140d2565b60405180910390fd5b67016345785d8a00008260ff163481836115c39190614768565b14611603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fa9061480e565b60405180910390fd5b620697806202a3006116159190614030565b600f546116229190614030565b4211611663576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165a9061487a565b60405180910390fd5b60005b8460ff16811015611695576116823361167d61222b565b612246565b808061168d9061489a565b915050611666565b505050506001600b8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c90614955565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117646121fe565b73ffffffffffffffffffffffffffffffffffffffff166117826117ea565b73ffffffffffffffffffffffffffffffffffffffff16146117d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117cf90613f09565b60405180910390fd5b6117e2600061273d565b565b600f5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546118239061425c565b80601f016020809104026020016040519081016040528092919081815260200182805461184f9061425c565b801561189c5780601f106118715761010080835404028352916020019161189c565b820191906000526020600020905b81548152906001019060200180831161187f57829003601f168201915b5050505050905090565b6002600b5414156118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16611943576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193a90613fe1565b60405180910390fd5b6001600e5481611953600c612206565b61195d9190614030565b111561199e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611995906140d2565b60405180910390fd5b601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a229061413e565b60405180910390fd5b67016345785d8a00006001348183611a439190614768565b14611a83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7a9061480e565b60405180910390fd5b8484601254611afa838380806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050508233604051602001611adf91906141a6565b60405160208183030381529060405280519060200120612214565b611b39576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b309061420d565b60405180910390fd5b6202a300600f54611b4a9190614030565b4211611b8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b82906149c1565b60405180910390fd5b6001601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611bf433611bef61222b565b612246565b5050505050506001600b819055505050565b611c18611c116121fe565b8383612803565b5050565b6002600b541415611c62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5990613f75565b60405180910390fd5b6002600b81905550601060009054906101000a900460ff16611cb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb090613fe1565b60405180910390fd5b8060ff16600e5481611ccb600c612206565b611cd59190614030565b1115611d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0d906140d2565b60405180910390fd5b611d1e6121fe565b73ffffffffffffffffffffffffffffffffffffffff16611d3c6117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611d92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d8990613f09565b60405180910390fd5b60005b8260ff16811015611dc457611db133611dac61222b565b612246565b8080611dbc9061489a565b915050611d95565b50506001600b8190555050565b60115481565b611de8611de26121fe565b83612403565b611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e906144b6565b60405180910390fd5b611e3384848484612970565b50505050565b620697806202a300611e4b9190614030565b81565b6060611e59826122de565b611e98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8f90614a2d565b60405180910390fd5b600d611ea3836129cc565b604051602001611eb4929190614b69565b6040516020818303038152906040529050919050565b611ed26121fe565b73ffffffffffffffffffffffffffffffffffffffff16611ef06117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611f46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3d90613f09565b60405180910390fd5b8060118190555050565b611f586121fe565b73ffffffffffffffffffffffffffffffffffffffff16611f766117ea565b73ffffffffffffffffffffffffffffffffffffffff1614611fcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc390613f09565b60405180910390fd5b8060128190555050565b611fde6121fe565b73ffffffffffffffffffffffffffffffffffffffff16611ffc6117ea565b73ffffffffffffffffffffffffffffffffffffffff1614612052576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204990613f09565b60405180910390fd5b80600d9080519060200190612068929190613535565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e5481565b61210e6121fe565b73ffffffffffffffffffffffffffffffffffffffff1661212c6117ea565b73ffffffffffffffffffffffffffffffffffffffff1614612182576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217990613f09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156121f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e990614c0a565b60405180910390fd5b6121fb8161273d565b50565b600033905090565b600081600001549050919050565b6000826122218584612b2d565b1490509392505050565b6000612237600c612be0565b612241600c612206565b905090565b612260828260405180602001604052806000815250612bf6565b5050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122d757506122d682612c51565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166123bd8361136f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061240e826122de565b61244d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244490614c9c565b60405180910390fd5b60006124588361136f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806124c757508373ffffffffffffffffffffffffffffffffffffffff166124af84610d21565b73ffffffffffffffffffffffffffffffffffffffff16145b806124d857506124d7818561206c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166125018261136f565b73ffffffffffffffffffffffffffffffffffffffff1614612557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161254e90614d2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125be90614dc0565b60405180910390fd5b6125d2838383612d33565b6125dd60008261234a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461262d9190614de0565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126849190614030565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612872576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161286990614e60565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516129639190613797565b60405180910390a3505050565b61297b8484846124e1565b61298784848484612d43565b6129c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129bd90614ef2565b60405180910390fd5b50505050565b60606000821415612a14576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612b28565b600082905060005b60008214612a46578080612a2f9061489a565b915050600a82612a3f9190614f41565b9150612a1c565b60008167ffffffffffffffff811115612a6257612a61613b8c565b5b6040519080825280601f01601f191660200182016040528015612a945781602001600182028036833780820191505090505b5090505b60008514612b2157600182612aad9190614de0565b9150600a85612abc9190614f72565b6030612ac89190614030565b60f81b818381518110612ade57612add6146a7565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612b1a9190614f41565b9450612a98565b8093505050505b919050565b60008082905060005b8451811015612bd5576000858281518110612b5457612b536146a7565b5b60200260200101519050808311612b95578281604051602001612b78929190614fc4565b604051602081830303815290604052805190602001209250612bc1565b8083604051602001612ba8929190614fc4565b6040516020818303038152906040528051906020012092505b508080612bcd9061489a565b915050612b36565b508091505092915050565b6001816000016000828254019250508190555050565b612c008383612ecb565b612c0d6000848484612d43565b612c4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4390614ef2565b60405180910390fd5b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d1c57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d2c5750612d2b82613099565b5b9050919050565b612d3e838383613103565b505050565b6000612d648473ffffffffffffffffffffffffffffffffffffffff16613217565b15612ebe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612d8d6121fe565b8786866040518563ffffffff1660e01b8152600401612daf9493929190615045565b6020604051808303816000875af1925050508015612deb57506040513d601f19601f82011682018060405250810190612de891906150a6565b60015b612e6e573d8060008114612e1b576040519150601f19603f3d011682016040523d82523d6000602084013e612e20565b606091505b50600081511415612e66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e5d90614ef2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612ec3565b600190505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612f3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f329061511f565b60405180910390fd5b612f44816122de565b15612f84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f7b9061518b565b60405180910390fd5b612f9060008383612d33565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612fe09190614030565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61310e83838361322a565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156131515761314c8161322f565b613190565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461318f5761318e8382613278565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131d3576131ce816133e5565b613212565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146132115761321082826134b6565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001613285846116a4565b61328f9190614de0565b9050600060076000848152602001908152602001600020549050818114613374576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133f99190614de0565b9050600060096000848152602001908152602001600020549050600060088381548110613429576134286146a7565b5b90600052602060002001549050806008838154811061344b5761344a6146a7565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061349a576134996151ab565b5b6001900381819060005260206000200160009055905550505050565b60006134c1836116a4565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546135419061425c565b90600052602060002090601f01602090048101928261356357600085556135aa565b82601f1061357c57805160ff19168380011785556135aa565b828001600101855582156135aa579182015b828111156135a957825182559160200191906001019061358e565b5b5090506135b791906135bb565b5090565b5b808211156135d45760008160009055506001016135bc565b5090565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b613601816135ec565b811461360c57600080fd5b50565b60008135905061361e816135f8565b92915050565b60006020828403121561363a576136396135e2565b5b60006136488482850161360f565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261367657613675613651565b5b8235905067ffffffffffffffff81111561369357613692613656565b5b6020830191508360208202830111156136af576136ae61365b565b5b9250929050565b600080602083850312156136cd576136cc6135e2565b5b600083013567ffffffffffffffff8111156136eb576136ea6135e7565b5b6136f785828601613660565b92509250509250929050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61373881613703565b811461374357600080fd5b50565b6000813590506137558161372f565b92915050565b600060208284031215613771576137706135e2565b5b600061377f84828501613746565b91505092915050565b613791816135ec565b82525050565b60006020820190506137ac6000830184613788565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156137ec5780820151818401526020810190506137d1565b838111156137fb576000848401525b50505050565b6000601f19601f8301169050919050565b600061381d826137b2565b61382781856137bd565b93506138378185602086016137ce565b61384081613801565b840191505092915050565b600060208201905081810360008301526138658184613812565b905092915050565b6000819050919050565b6138808161386d565b82525050565b600060208201905061389b6000830184613877565b92915050565b6138aa8161386d565b81146138b557600080fd5b50565b6000813590506138c7816138a1565b92915050565b6000602082840312156138e3576138e26135e2565b5b60006138f1848285016138b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613925826138fa565b9050919050565b6139358161391a565b82525050565b6000602082019050613950600083018461392c565b92915050565b61395f8161391a565b811461396a57600080fd5b50565b60008135905061397c81613956565b92915050565b60008060408385031215613999576139986135e2565b5b60006139a78582860161396d565b92505060206139b8858286016138b8565b9150509250929050565b6000806000606084860312156139db576139da6135e2565b5b60006139e98682870161396d565b93505060206139fa8682870161396d565b9250506040613a0b868287016138b8565b9150509250925092565b6000819050919050565b613a2881613a15565b82525050565b6000602082019050613a436000830184613a1f565b92915050565b600060208284031215613a5f57613a5e6135e2565b5b6000613a6d8482850161396d565b91505092915050565b6000613a818261391a565b9050919050565b613a9181613a76565b8114613a9c57600080fd5b50565b600081359050613aae81613a88565b92915050565b600060208284031215613aca57613ac96135e2565b5b6000613ad884828501613a9f565b91505092915050565b600060ff82169050919050565b613af781613ae1565b8114613b0257600080fd5b50565b600081359050613b1481613aee565b92915050565b600060208284031215613b3057613b2f6135e2565b5b6000613b3e84828501613b05565b91505092915050565b60008060408385031215613b5e57613b5d6135e2565b5b6000613b6c8582860161396d565b9250506020613b7d8582860161360f565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613bc482613801565b810181811067ffffffffffffffff82111715613be357613be2613b8c565b5b80604052505050565b6000613bf66135d8565b9050613c028282613bbb565b919050565b600067ffffffffffffffff821115613c2257613c21613b8c565b5b613c2b82613801565b9050602081019050919050565b82818337600083830152505050565b6000613c5a613c5584613c07565b613bec565b905082815260208101848484011115613c7657613c75613b87565b5b613c81848285613c38565b509392505050565b600082601f830112613c9e57613c9d613651565b5b8135613cae848260208601613c47565b91505092915050565b60008060008060808587031215613cd157613cd06135e2565b5b6000613cdf8782880161396d565b9450506020613cf08782880161396d565b9350506040613d01878288016138b8565b925050606085013567ffffffffffffffff811115613d2257613d216135e7565b5b613d2e87828801613c89565b91505092959194509250565b613d4381613a15565b8114613d4e57600080fd5b50565b600081359050613d6081613d3a565b92915050565b600060208284031215613d7c57613d7b6135e2565b5b6000613d8a84828501613d51565b91505092915050565b600067ffffffffffffffff821115613dae57613dad613b8c565b5b613db782613801565b9050602081019050919050565b6000613dd7613dd284613d93565b613bec565b905082815260208101848484011115613df357613df2613b87565b5b613dfe848285613c38565b509392505050565b600082601f830112613e1b57613e1a613651565b5b8135613e2b848260208601613dc4565b91505092915050565b600060208284031215613e4a57613e496135e2565b5b600082013567ffffffffffffffff811115613e6857613e676135e7565b5b613e7484828501613e06565b91505092915050565b60008060408385031215613e9457613e936135e2565b5b6000613ea28582860161396d565b9250506020613eb38582860161396d565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613ef36020836137bd565b9150613efe82613ebd565b602082019050919050565b60006020820190508181036000830152613f2281613ee6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613f5f601f836137bd565b9150613f6a82613f29565b602082019050919050565b60006020820190508181036000830152613f8e81613f52565b9050919050565b7f4f472073616c65206973206e6f74206f70656e00000000000000000000000000600082015250565b6000613fcb6013836137bd565b9150613fd682613f95565b602082019050919050565b60006020820190508181036000830152613ffa81613fbe565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061403b8261386d565b91506140468361386d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561407b5761407a614001565b5b828201905092915050565b7f4e6f204772756773204c65667400000000000000000000000000000000000000600082015250565b60006140bc600d836137bd565b91506140c782614086565b602082019050919050565b600060208201905081810360008301526140eb816140af565b9050919050565b7f416c7265616479204d696e746564000000000000000000000000000000000000600082015250565b6000614128600e836137bd565b9150614133826140f2565b602082019050919050565b600060208201905081810360008301526141578161411b565b9050919050565b60008160601b9050919050565b60006141768261415e565b9050919050565b60006141888261416b565b9050919050565b6141a061419b8261391a565b61417d565b82525050565b60006141b2828461418f565b60148201915081905092915050565b7f4164647265737320646f6573206e6f74206578697374206f6e206c6973740000600082015250565b60006141f7601e836137bd565b9150614202826141c1565b602082019050919050565b60006020820190508181036000830152614226816141ea565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061427457607f821691505b602082108114156142885761428761422d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006142ea602c836137bd565b91506142f58261428e565b604082019050919050565b60006020820190508181036000830152614319816142dd565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061437c6021836137bd565b915061438782614320565b604082019050919050565b600060208201905081810360008301526143ab8161436f565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061440e6038836137bd565b9150614419826143b2565b604082019050919050565b6000602082019050818103600083015261443d81614401565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006144a06031836137bd565b91506144ab82614444565b604082019050919050565b600060208201905081810360008301526144cf81614493565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000614532602b836137bd565b915061453d826144d6565b604082019050919050565b6000602082019050818103600083015261456181614525565b9050919050565b600081519050614577816138a1565b92915050565b600060208284031215614593576145926135e2565b5b60006145a184828501614568565b91505092915050565b60006040820190506145bf600083018561392c565b6145cc6020830184613877565b9392505050565b6000815190506145e2816135f8565b92915050565b6000602082840312156145fe576145fd6135e2565b5b600061460c848285016145d3565b91505092915050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614671602c836137bd565b915061467c82614615565b604082019050919050565b600060208201905081810360008301526146a081614664565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006147326029836137bd565b915061473d826146d6565b604082019050919050565b6000602082019050818103600083015261476181614725565b9050919050565b60006147738261386d565b915061477e8361386d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156147b7576147b6614001565b5b828202905092915050565b7f496e636f7272656374204554482076616c75652073656e740000000000000000600082015250565b60006147f86018836137bd565b9150614803826147c2565b602082019050919050565b60006020820190508181036000830152614827816147eb565b9050919050565b7f7075626c6963206d696e74206e6f742073746172746564000000000000000000600082015250565b60006148646017836137bd565b915061486f8261482e565b602082019050919050565b6000602082019050818103600083015261489381614857565b9050919050565b60006148a58261386d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148d8576148d7614001565b5b600182019050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061493f602a836137bd565b915061494a826148e3565b604082019050919050565b6000602082019050818103600083015261496e81614932565b9050919050565b7f77686974656c697374206d696e74206e6f742073746172746564000000000000600082015250565b60006149ab601a836137bd565b91506149b682614975565b602082019050919050565b600060208201905081810360008301526149da8161499e565b9050919050565b7f4e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b6000614a176011836137bd565b9150614a22826149e1565b602082019050919050565b60006020820190508181036000830152614a4681614a0a565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154614a7a8161425c565b614a848186614a4d565b94506001821660008114614a9f5760018114614ab057614ae3565b60ff19831686528186019350614ae3565b614ab985614a58565b60005b83811015614adb57815481890152600182019150602081019050614abc565b838801955050505b50505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6000614b22600183614a4d565b9150614b2d82614aec565b600182019050919050565b6000614b43826137b2565b614b4d8185614a4d565b9350614b5d8185602086016137ce565b80840191505092915050565b6000614b758285614a6d565b9150614b8082614b15565b9150614b8c8284614b38565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614bf46026836137bd565b9150614bff82614b98565b604082019050919050565b60006020820190508181036000830152614c2381614be7565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000614c86602c836137bd565b9150614c9182614c2a565b604082019050919050565b60006020820190508181036000830152614cb581614c79565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614d186029836137bd565b9150614d2382614cbc565b604082019050919050565b60006020820190508181036000830152614d4781614d0b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614daa6024836137bd565b9150614db582614d4e565b604082019050919050565b60006020820190508181036000830152614dd981614d9d565b9050919050565b6000614deb8261386d565b9150614df68361386d565b925082821015614e0957614e08614001565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614e4a6019836137bd565b9150614e5582614e14565b602082019050919050565b60006020820190508181036000830152614e7981614e3d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614edc6032836137bd565b9150614ee782614e80565b604082019050919050565b60006020820190508181036000830152614f0b81614ecf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614f4c8261386d565b9150614f578361386d565b925082614f6757614f66614f12565b5b828204905092915050565b6000614f7d8261386d565b9150614f888361386d565b925082614f9857614f97614f12565b5b828206905092915050565b6000819050919050565b614fbe614fb982613a15565b614fa3565b82525050565b6000614fd08285614fad565b602082019150614fe08284614fad565b6020820191508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061501782614ff0565b6150218185614ffb565b93506150318185602086016137ce565b61503a81613801565b840191505092915050565b600060808201905061505a600083018761392c565b615067602083018661392c565b6150746040830185613877565b8181036060830152615086818461500c565b905095945050505050565b6000815190506150a08161372f565b92915050565b6000602082840312156150bc576150bb6135e2565b5b60006150ca84828501615091565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006151096020836137bd565b9150615114826150d3565b602082019050919050565b60006020820190508181036000830152615138816150fc565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000615175601c836137bd565b91506151808261513f565b602082019050919050565b600060208201905081810360008301526151a481615168565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea26469706673582212202b6ab5b9034da7ead1a69f6adf331386ca16d3e725ede6f4472adcf93a33c5ea64736f6c634300080a0033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

00000000000000000000000000000000000000000000000000000000000003e8

-----Decoded View---------------
Arg [0] : _maxGrugs (uint256): 1000

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000003e8


Deployed Bytecode Sourcemap

542:5344:17:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4155:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2468:318;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5679:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2473:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;872:53:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3984:217:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3522:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1615:111:7;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1055:26:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4711:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;931:45:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1291:253:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1167:34:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1247:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4807:140;;;;;;;;;;;;;:::i;:::-;;5107:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4953:165:17;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4059:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1798:230:7;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2176:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;786:21:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3267:429;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1914:205:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;842:24:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2635:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2792:469:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4268:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3702:297:17;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1134:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5352:320:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;982:67:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5168:290;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4297:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4431:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4559:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4487:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;813:23:17;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4155:136:17;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4241:6:17::1;4224:14;;:23;;;;;;;;;;;;;;;;;;4269:15;4257:9;:27;;;;4155:136:::0;:::o;2468:318::-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1386:14:17::1;;;;;;;;;;;1378:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2612:1:::2;1571:8;;1553:14;1525:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:54;;1504:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;2226:9:::3;:21;2236:10;2226:21;;;;;;;;;;;;;;;;;;;;;;;;;2225:22;2204:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;2663:11:::4;;2676:12;;1951:140;1987:11;;1951:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2016:4;2065:10;2048:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2038:39;;;;;;1951:18;:140::i;:::-;1930:217;;;;;;;;;;;;:::i;:::-;;;;;;;;;2728:4:::5;2704:9;:21;2714:10;2704:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;2742:36;2752:10;2764:13;:11;:13::i;:::-;2742:9;:36::i;:::-;2297:1:::4;;;1434::::2;1701::2::0;2628:7;:22;;;;2468:318:17;;:::o;5679:205::-;5814:4;5841:36;5865:11;5841:23;:36::i;:::-;5834:43;;5679:205;;;:::o;2473:98:4:-;2527:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:98;:::o;872:53:17:-;916:9;872:53;:::o;3984:217:4:-;4060:7;4087:16;4095:7;4087;:16::i;:::-;4079:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4170:15;:24;4186:7;4170:24;;;;;;;;;;;;;;;;;;;;;4163:31;;3984:217;;;:::o;3522:401::-;3602:13;3618:23;3633:7;3618:14;:23::i;:::-;3602:39;;3665:5;3659:11;;:2;:11;;;;3651:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3756:5;3740:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3765:37;3782:5;3789:12;:10;:12::i;:::-;3765:16;:37::i;:::-;3740:62;3719:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3895:21;3904:2;3908:7;3895:8;:21::i;:::-;3592:331;3522:401;;:::o;1615:111:7:-;1676:7;1702:10;:17;;;;1695:24;;1615:111;:::o;1055:26:17:-;;;;;;;;;;;;;:::o;4711:330:4:-;4900:41;4919:12;:10;:12::i;:::-;4933:7;4900:18;:41::i;:::-;4892:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5006:28;5016:4;5022:2;5026:7;5006:9;:28::i;:::-;4711:330;;;:::o;931:45:17:-;970:6;931:45;:::o;1291:253:7:-;1388:7;1423:23;1440:5;1423:16;:23::i;:::-;1415:5;:31;1407:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1511:12;:19;1524:5;1511:19;;;;;;;;;;;;;;;:26;1531:5;1511:26;;;;;;;;;;;;1504:33;;1291:253;;;;:::o;1167:34:17:-;;;;:::o;1247:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;4807:140::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4854:15:17::1;4872:21;4854:39;;4911:10;4903:28;;:37;4932:7;4903:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4844:103;4807:140::o:0;5107:179:4:-;5240:39;5257:4;5263:2;5267:7;5240:39;;;;;;;;;;;;:16;:39::i;:::-;5107:179;;;:::o;4953:165:17:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5018:15:17::1;5036:5;:15;;;5060:4;5036:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;5018:48;;5076:5;:14;;;5091:10;5103:7;5076:35;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;5008:110;4953:165:::0;:::o;4059:90::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4136:6:17::1;4125:8;:17;;;;4059:90:::0;:::o;1798:230:7:-;1873:7;1908:30;:28;:30::i;:::-;1900:5;:38;1892:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2004:10;2015:5;2004:17;;;;;;;;:::i;:::-;;;;;;;;;;1997:24;;1798:230;;;:::o;2176:235:4:-;2248:7;2267:13;2283:7;:16;2291:7;2283:16;;;;;;;;;;;;;;;;;;;;;2267:32;;2334:1;2317:19;;:5;:19;;;;2309:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2399:5;2392:12;;;2176:235;;;:::o;786:21:17:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3267:429::-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1386:14:17::1;;;;;;;;;;;1378:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3399:14:::2;1448:188;;1571:8;;1553:14;1525:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:54;;1504:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;916:9:::3;3459:14;1641:199;;1763:9;1745:14;1737:5;:22;;;;:::i;:::-;:35;1716:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1043:6:::4;970;1028:21;;;;:::i;:::-;3515:9;;:31;;;;:::i;:::-;3497:15;:49;3489:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;3589:9;3584:106;3608:14;3604:18;;:1;:18;3584:106;;;3643:36;3653:10;3665:13;:11;:13::i;:::-;3643:9;:36::i;:::-;3624:3;;;;;:::i;:::-;;;;3584:106;;;;1628:1:::3;;1434::::2;1701::2::0;2628:7;:22;;;;3267:429:17;:::o;1914:205:4:-;1986:7;2030:1;2013:19;;:5;:19;;;;2005:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2096:9;:16;2106:5;2096:16;;;;;;;;;;;;;;;;2089:23;;1914:205;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;842:24:17:-;;;;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;2635:102:4:-;2691:13;2723:7;2716:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2635:102;:::o;2792:469:17:-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1386:14:17::1;;;;;;;;;;;1378:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2943:1:::2;1571:8;;1553:14;1525:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:54;;1504:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;2226:9:::3;:21;2236:10;2226:21;;;;;;;;;;;;;;;;;;;;;;;;;2225:22;2204:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;916:9:::4;3011:1;1763:9;1745:14;1737:5;:22;;;;:::i;:::-;:35;1716:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;3041:11:::5;;3054:19;;1951:140;1987:11;;1951:140;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2016:4;2065:10;2048:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;2038:39;;;;;;1951:18;:140::i;:::-;1930:217;;;;;;;;;;;;:::i;:::-;;;;;;;;;970:6:::6;3115:9;;:24;;;;:::i;:::-;3097:15;:42;3089:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;3204:4;3180:9;:21;3190:10;3180:21;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;3218:36;3228:10;3240:13;:11;:13::i;:::-;3218:9;:36::i;:::-;1832:1:::5;;;2297::::4;;1434::::2;1701::2::0;2628:7;:22;;;;2792:469:17;;:::o;4268:153:4:-;4362:52;4381:12;:10;:12::i;:::-;4395:8;4405;4362:18;:52::i;:::-;4268:153;;:::o;3702:297:17:-;1744:1:2;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1386:14:17::1;;;;;;;;;;;1378:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;3839:14:::2;1448:188;;1571:8;;1553:14;1525:25;:15;:23;:25::i;:::-;:42;;;;:::i;:::-;:54;;1504:114;;;;;;;;;;;;:::i;:::-;;;;;;;;;1259:12:0::3;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3892:9:17::4;3887:106;3911:14;3907:18;;:1;:18;3887:106;;;3946:36;3956:10;3968:13;:11;:13::i;:::-;3946:9;:36::i;:::-;3927:3;;;;;:::i;:::-;;;;3887:106;;;;1434:1:::2;1701::2::0;2628:7;:22;;;;3702:297:17;:::o;1134:27::-;;;;:::o;5352:320:4:-;5521:41;5540:12;:10;:12::i;:::-;5554:7;5521:18;:41::i;:::-;5513:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5626:39;5640:4;5646:2;5650:7;5659:5;5626:13;:39::i;:::-;5352:320;;;;:::o;982:67:17:-;1043:6;970;1028:21;;;;:::i;:::-;982:67;:::o;5168:290::-;5281:13;5318:16;5326:7;5318;:16::i;:::-;5310:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;5410:7;5424:25;5441:7;5424:16;:25::i;:::-;5393:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;5367:84;;5168:290;;;:::o;4297:128::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4407:11:17::1;4392:12;:26;;;;4297:128:::0;:::o;4431:122::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4535:11:17::1;4513:19;:33;;;;4431:122:::0;:::o;4559:101::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4644:9:17::1;4634:7;:19;;;;;;;;;;;;:::i;:::-;;4559:101:::0;:::o;4487:162:4:-;4584:4;4607:18;:25;4626:5;4607:25;;;;;;;;;;;;;;;:35;4633:8;4607:35;;;;;;;;;;;;;;;;;;;;;;;;;4600:42;;4487:162;;;;:::o;813:23:17:-;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;640:96:11:-;693:7;719:10;712:17;;640:96;:::o;827:112:12:-;892:7;918;:14;;;911:21;;827:112;;;:::o;847:184:14:-;968:4;1020;991:25;1004:5;1011:4;991:12;:25::i;:::-;:33;984:40;;847:184;;;;;:::o;4666:135:17:-;4706:7;4725:27;:15;:25;:27::i;:::-;4769:25;:15;:23;:25::i;:::-;4762:32;;4666:135;:::o;8101:108:4:-;8176:26;8186:2;8190:7;8176:26;;;;;;;;;;;;:9;:26::i;:::-;8101:108;;:::o;990:222:7:-;1092:4;1130:35;1115:50;;;:11;:50;;;;:90;;;;1169:36;1193:11;1169:23;:36::i;:::-;1115:90;1108:97;;990:222;;;:::o;7144:125:4:-;7209:4;7260:1;7232:30;;:7;:16;7240:7;7232:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7225:37;;7144:125;;;:::o;10995:171::-;11096:2;11069:15;:24;11085:7;11069:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11151:7;11147:2;11113:46;;11122:23;11137:7;11122:14;:23::i;:::-;11113:46;;;;;;;;;;;;10995:171;;:::o;7427:344::-;7520:4;7544:16;7552:7;7544;:16::i;:::-;7536:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7619:13;7635:23;7650:7;7635:14;:23::i;:::-;7619:39;;7687:5;7676:16;;:7;:16;;;:51;;;;7720:7;7696:31;;:20;7708:7;7696:11;:20::i;:::-;:31;;;7676:51;:87;;;;7731:32;7748:5;7755:7;7731:16;:32::i;:::-;7676:87;7668:96;;;7427:344;;;;:::o;10324:560::-;10478:4;10451:31;;:23;10466:7;10451:14;:23::i;:::-;:31;;;10443:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10560:1;10546:16;;:2;:16;;;;10538:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10614:39;10635:4;10641:2;10645:7;10614:20;:39::i;:::-;10715:29;10732:1;10736:7;10715:8;:29::i;:::-;10774:1;10755:9;:15;10765:4;10755:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10802:1;10785:9;:13;10795:2;10785:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10832:2;10813:7;:16;10821:7;10813:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10869:7;10865:2;10850:27;;10859:4;10850:27;;;;;;;;;;;;10324:560;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2333:124;2270:187;:::o;11301:307:4:-;11451:8;11442:17;;:5;:17;;;;11434:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11537:8;11499:18;:25;11518:5;11499:25;;;;;;;;;;;;;;;:35;11525:8;11499:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11582:8;11560:41;;11575:5;11560:41;;;11592:8;11560:41;;;;;;:::i;:::-;;;;;;;;11301:307;;;:::o;6534:::-;6685:28;6695:4;6701:2;6705:7;6685:9;:28::i;:::-;6731:48;6754:4;6760:2;6764:7;6773:5;6731:22;:48::i;:::-;6723:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6534:307;;;;:::o;328:703:13:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;1383:688:14:-;1466:7;1485:20;1508:4;1485:27;;1527:9;1522:514;1546:5;:12;1542:1;:16;1522:514;;;1579:20;1602:5;1608:1;1602:8;;;;;;;;:::i;:::-;;;;;;;;1579:31;;1644:12;1628;:28;1624:402;;1796:12;1810;1779:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1769:55;;;;;;1754:70;;1624:402;;;1983:12;1997;1966:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1956:55;;;;;;1941:70;;1624:402;1565:471;1560:3;;;;;:::i;:::-;;;;1522:514;;;;2052:12;2045:19;;;1383:688;;;;:::o;945:123:12:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;8430:311:4:-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8604:54;8635:1;8639:2;8643:7;8652:5;8604:22;:54::i;:::-;8583:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8430:311;;;:::o;1555:300::-;1657:4;1707:25;1692:40;;;:11;:40;;;;:104;;;;1763:33;1748:48;;;:11;:48;;;;1692:104;:156;;;;1812:36;1836:11;1812:23;:36::i;:::-;1692:156;1673:175;;1555:300;;;:::o;5464:209:17:-;5621:45;5648:4;5654:2;5658:7;5621:26;:45::i;:::-;5464:209;;;:::o;12161:778:4:-;12311:4;12331:15;:2;:13;;;:15::i;:::-;12327:606;;;12382:2;12366:36;;;12403:12;:10;:12::i;:::-;12417:4;12423:7;12432:5;12366:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12362:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12622:1;12605:6;:13;:18;12601:266;;;12647:60;;;;;;;;;;:::i;:::-;;;;;;;;12601:266;12819:6;12813:13;12804:6;12800:2;12796:15;12789:38;12362:519;12498:41;;;12488:51;;;:6;:51;;;;12481:58;;;;;12327:606;12918:4;12911:11;;12161:778;;;;;;;:::o;9063:372::-;9156:1;9142:16;;:2;:16;;;;9134:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9214:16;9222:7;9214;:16::i;:::-;9213:17;9205:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9274:45;9303:1;9307:2;9311:7;9274:20;:45::i;:::-;9347:1;9330:9;:13;9340:2;9330:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9377:2;9358:7;:16;9366:7;9358:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9420:7;9416:2;9395:33;;9412:1;9395:33;;;;;;;;;;;;9063:372;;:::o;829:155:15:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;2624:572:7:-;2763:45;2790:4;2796:2;2800:7;2763:26;:45::i;:::-;2839:1;2823:18;;:4;:18;;;2819:183;;;2857:40;2889:7;2857:31;:40::i;:::-;2819:183;;;2926:2;2918:10;;:4;:10;;;2914:88;;2944:47;2977:4;2983:7;2944:32;:47::i;:::-;2914:88;2819:183;3029:1;3015:16;;:2;:16;;;3011:179;;;3047:45;3084:7;3047:36;:45::i;:::-;3011:179;;;3119:4;3113:10;;:2;:10;;;3109:81;;3139:40;3167:2;3171:7;3139:27;:40::i;:::-;3109:81;3011:179;2624:572;;;:::o;771:377:10:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;13495:122:4:-;;;;:::o;3902:161:7:-;4005:10;:17;;;;3978:15;:24;3994:7;3978:24;;;;;;;;;;;:44;;;;4032:10;4048:7;4032:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3902:161;:::o;4680:970::-;4942:22;4992:1;4967:22;4984:4;4967:16;:22::i;:::-;:26;;;;:::i;:::-;4942:51;;5003:18;5024:17;:26;5042:7;5024:26;;;;;;;;;;;;5003:47;;5168:14;5154:10;:28;5150:323;;5198:19;5220:12;:18;5233:4;5220:18;;;;;;;;;;;;;;;:34;5239:14;5220:34;;;;;;;;;;;;5198:56;;5302:11;5269:12;:18;5282:4;5269:18;;;;;;;;;;;;;;;:30;5288:10;5269:30;;;;;;;;;;;:44;;;;5418:10;5385:17;:30;5403:11;5385:30;;;;;;;;;;;:43;;;;5184:289;5150:323;5566:17;:26;5584:7;5566:26;;;;;;;;;;;5559:33;;;5609:12;:18;5622:4;5609:18;;;;;;;;;;;;;;;:34;5628:14;5609:34;;;;;;;;;;;5602:41;;;4761:889;;4680:970;;:::o;5938:1061::-;6187:22;6232:1;6212:10;:17;;;;:21;;;;:::i;:::-;6187:46;;6243:18;6264:15;:24;6280:7;6264:24;;;;;;;;;;;;6243:45;;6610:19;6632:10;6643:14;6632:26;;;;;;;;:::i;:::-;;;;;;;;;;6610:48;;6694:11;6669:10;6680;6669:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6804:10;6773:15;:28;6789:11;6773:28;;;;;;;;;;;:41;;;;6942:15;:24;6958:7;6942:24;;;;;;;;;;;6935:31;;;6976:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6009:990;;;5938:1061;:::o;3490:217::-;3574:14;3591:20;3608:2;3591:16;:20::i;:::-;3574:37;;3648:7;3621:12;:16;3634:2;3621:16;;;;;;;;;;;;;;;:24;3638:6;3621:24;;;;;;;;;;;:34;;;;3694:6;3665:17;:26;3683:7;3665:26;;;;;;;;;;;:35;;;;3564:143;3490:217;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:18:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:90;368:7;411:5;404:13;397:21;386:32;;334:90;;;:::o;430:116::-;500:21;515:5;500:21;:::i;:::-;493:5;490:32;480:60;;536:1;533;526:12;480:60;430:116;:::o;552:133::-;595:5;633:6;620:20;611:29;;649:30;673:5;649:30;:::i;:::-;552:133;;;;:::o;691:323::-;747:6;796:2;784:9;775:7;771:23;767:32;764:119;;;802:79;;:::i;:::-;764:119;922:1;947:50;989:7;980:6;969:9;965:22;947:50;:::i;:::-;937:60;;893:114;691:323;;;;:::o;1020:117::-;1129:1;1126;1119:12;1143:117;1252:1;1249;1242:12;1266:117;1375:1;1372;1365:12;1406:568;1479:8;1489:6;1539:3;1532:4;1524:6;1520:17;1516:27;1506:122;;1547:79;;:::i;:::-;1506:122;1660:6;1647:20;1637:30;;1690:18;1682:6;1679:30;1676:117;;;1712:79;;:::i;:::-;1676:117;1826:4;1818:6;1814:17;1802:29;;1880:3;1872:4;1864:6;1860:17;1850:8;1846:32;1843:41;1840:128;;;1887:79;;:::i;:::-;1840:128;1406:568;;;;;:::o;1980:559::-;2066:6;2074;2123:2;2111:9;2102:7;2098:23;2094:32;2091:119;;;2129:79;;:::i;:::-;2091:119;2277:1;2266:9;2262:17;2249:31;2307:18;2299:6;2296:30;2293:117;;;2329:79;;:::i;:::-;2293:117;2442:80;2514:7;2505:6;2494:9;2490:22;2442:80;:::i;:::-;2424:98;;;;2220:312;1980:559;;;;;:::o;2545:149::-;2581:7;2621:66;2614:5;2610:78;2599:89;;2545:149;;;:::o;2700:120::-;2772:23;2789:5;2772:23;:::i;:::-;2765:5;2762:34;2752:62;;2810:1;2807;2800:12;2752:62;2700:120;:::o;2826:137::-;2871:5;2909:6;2896:20;2887:29;;2925:32;2951:5;2925:32;:::i;:::-;2826:137;;;;:::o;2969:327::-;3027:6;3076:2;3064:9;3055:7;3051:23;3047:32;3044:119;;;3082:79;;:::i;:::-;3044:119;3202:1;3227:52;3271:7;3262:6;3251:9;3247:22;3227:52;:::i;:::-;3217:62;;3173:116;2969:327;;;;:::o;3302:109::-;3383:21;3398:5;3383:21;:::i;:::-;3378:3;3371:34;3302:109;;:::o;3417:210::-;3504:4;3542:2;3531:9;3527:18;3519:26;;3555:65;3617:1;3606:9;3602:17;3593:6;3555:65;:::i;:::-;3417:210;;;;:::o;3633:99::-;3685:6;3719:5;3713:12;3703:22;;3633:99;;;:::o;3738:169::-;3822:11;3856:6;3851:3;3844:19;3896:4;3891:3;3887:14;3872:29;;3738:169;;;;:::o;3913:307::-;3981:1;3991:113;4005:6;4002:1;3999:13;3991:113;;;4090:1;4085:3;4081:11;4075:18;4071:1;4066:3;4062:11;4055:39;4027:2;4024:1;4020:10;4015:15;;3991:113;;;4122:6;4119:1;4116:13;4113:101;;;4202:1;4193:6;4188:3;4184:16;4177:27;4113:101;3962:258;3913:307;;;:::o;4226:102::-;4267:6;4318:2;4314:7;4309:2;4302:5;4298:14;4294:28;4284:38;;4226:102;;;:::o;4334:364::-;4422:3;4450:39;4483:5;4450:39;:::i;:::-;4505:71;4569:6;4564:3;4505:71;:::i;:::-;4498:78;;4585:52;4630:6;4625:3;4618:4;4611:5;4607:16;4585:52;:::i;:::-;4662:29;4684:6;4662:29;:::i;:::-;4657:3;4653:39;4646:46;;4426:272;4334:364;;;;:::o;4704:313::-;4817:4;4855:2;4844:9;4840:18;4832:26;;4904:9;4898:4;4894:20;4890:1;4879:9;4875:17;4868:47;4932:78;5005:4;4996:6;4932:78;:::i;:::-;4924:86;;4704:313;;;;:::o;5023:77::-;5060:7;5089:5;5078:16;;5023:77;;;:::o;5106:118::-;5193:24;5211:5;5193:24;:::i;:::-;5188:3;5181:37;5106:118;;:::o;5230:222::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5374:71;5442:1;5431:9;5427:17;5418:6;5374:71;:::i;:::-;5230:222;;;;:::o;5458:122::-;5531:24;5549:5;5531:24;:::i;:::-;5524:5;5521:35;5511:63;;5570:1;5567;5560:12;5511:63;5458:122;:::o;5586:139::-;5632:5;5670:6;5657:20;5648:29;;5686:33;5713:5;5686:33;:::i;:::-;5586:139;;;;:::o;5731:329::-;5790:6;5839:2;5827:9;5818:7;5814:23;5810:32;5807:119;;;5845:79;;:::i;:::-;5807:119;5965:1;5990:53;6035:7;6026:6;6015:9;6011:22;5990:53;:::i;:::-;5980:63;;5936:117;5731:329;;;;:::o;6066:126::-;6103:7;6143:42;6136:5;6132:54;6121:65;;6066:126;;;:::o;6198:96::-;6235:7;6264:24;6282:5;6264:24;:::i;:::-;6253:35;;6198:96;;;:::o;6300:118::-;6387:24;6405:5;6387:24;:::i;:::-;6382:3;6375:37;6300:118;;:::o;6424:222::-;6517:4;6555:2;6544:9;6540:18;6532:26;;6568:71;6636:1;6625:9;6621:17;6612:6;6568:71;:::i;:::-;6424:222;;;;:::o;6652:122::-;6725:24;6743:5;6725:24;:::i;:::-;6718:5;6715:35;6705:63;;6764:1;6761;6754:12;6705:63;6652:122;:::o;6780:139::-;6826:5;6864:6;6851:20;6842:29;;6880:33;6907:5;6880:33;:::i;:::-;6780:139;;;;:::o;6925:474::-;6993:6;7001;7050:2;7038:9;7029:7;7025:23;7021:32;7018:119;;;7056:79;;:::i;:::-;7018:119;7176:1;7201:53;7246:7;7237:6;7226:9;7222:22;7201:53;:::i;:::-;7191:63;;7147:117;7303:2;7329:53;7374:7;7365:6;7354:9;7350:22;7329:53;:::i;:::-;7319:63;;7274:118;6925:474;;;;;:::o;7405:619::-;7482:6;7490;7498;7547:2;7535:9;7526:7;7522:23;7518:32;7515:119;;;7553:79;;:::i;:::-;7515:119;7673:1;7698:53;7743:7;7734:6;7723:9;7719:22;7698:53;:::i;:::-;7688:63;;7644:117;7800:2;7826:53;7871:7;7862:6;7851:9;7847:22;7826:53;:::i;:::-;7816:63;;7771:118;7928:2;7954:53;7999:7;7990:6;7979:9;7975:22;7954:53;:::i;:::-;7944:63;;7899:118;7405:619;;;;;:::o;8030:77::-;8067:7;8096:5;8085:16;;8030:77;;;:::o;8113:118::-;8200:24;8218:5;8200:24;:::i;:::-;8195:3;8188:37;8113:118;;:::o;8237:222::-;8330:4;8368:2;8357:9;8353:18;8345:26;;8381:71;8449:1;8438:9;8434:17;8425:6;8381:71;:::i;:::-;8237:222;;;;:::o;8465:329::-;8524:6;8573:2;8561:9;8552:7;8548:23;8544:32;8541:119;;;8579:79;;:::i;:::-;8541:119;8699:1;8724:53;8769:7;8760:6;8749:9;8745:22;8724:53;:::i;:::-;8714:63;;8670:117;8465:329;;;;:::o;8800:110::-;8851:7;8880:24;8898:5;8880:24;:::i;:::-;8869:35;;8800:110;;;:::o;8916:150::-;9003:38;9035:5;9003:38;:::i;:::-;8996:5;8993:49;8983:77;;9056:1;9053;9046:12;8983:77;8916:150;:::o;9072:167::-;9132:5;9170:6;9157:20;9148:29;;9186:47;9227:5;9186:47;:::i;:::-;9072:167;;;;:::o;9245:357::-;9318:6;9367:2;9355:9;9346:7;9342:23;9338:32;9335:119;;;9373:79;;:::i;:::-;9335:119;9493:1;9518:67;9577:7;9568:6;9557:9;9553:22;9518:67;:::i;:::-;9508:77;;9464:131;9245:357;;;;:::o;9608:86::-;9643:7;9683:4;9676:5;9672:16;9661:27;;9608:86;;;:::o;9700:118::-;9771:22;9787:5;9771:22;:::i;:::-;9764:5;9761:33;9751:61;;9808:1;9805;9798:12;9751:61;9700:118;:::o;9824:135::-;9868:5;9906:6;9893:20;9884:29;;9922:31;9947:5;9922:31;:::i;:::-;9824:135;;;;:::o;9965:325::-;10022:6;10071:2;10059:9;10050:7;10046:23;10042:32;10039:119;;;10077:79;;:::i;:::-;10039:119;10197:1;10222:51;10265:7;10256:6;10245:9;10241:22;10222:51;:::i;:::-;10212:61;;10168:115;9965:325;;;;:::o;10296:468::-;10361:6;10369;10418:2;10406:9;10397:7;10393:23;10389:32;10386:119;;;10424:79;;:::i;:::-;10386:119;10544:1;10569:53;10614:7;10605:6;10594:9;10590:22;10569:53;:::i;:::-;10559:63;;10515:117;10671:2;10697:50;10739:7;10730:6;10719:9;10715:22;10697:50;:::i;:::-;10687:60;;10642:115;10296:468;;;;;:::o;10770:117::-;10879:1;10876;10869:12;10893:180;10941:77;10938:1;10931:88;11038:4;11035:1;11028:15;11062:4;11059:1;11052:15;11079:281;11162:27;11184:4;11162:27;:::i;:::-;11154:6;11150:40;11292:6;11280:10;11277:22;11256:18;11244:10;11241:34;11238:62;11235:88;;;11303:18;;:::i;:::-;11235:88;11343:10;11339:2;11332:22;11122:238;11079:281;;:::o;11366:129::-;11400:6;11427:20;;:::i;:::-;11417:30;;11456:33;11484:4;11476:6;11456:33;:::i;:::-;11366:129;;;:::o;11501:307::-;11562:4;11652:18;11644:6;11641:30;11638:56;;;11674:18;;:::i;:::-;11638:56;11712:29;11734:6;11712:29;:::i;:::-;11704:37;;11796:4;11790;11786:15;11778:23;;11501:307;;;:::o;11814:154::-;11898:6;11893:3;11888;11875:30;11960:1;11951:6;11946:3;11942:16;11935:27;11814:154;;;:::o;11974:410::-;12051:5;12076:65;12092:48;12133:6;12092:48;:::i;:::-;12076:65;:::i;:::-;12067:74;;12164:6;12157:5;12150:21;12202:4;12195:5;12191:16;12240:3;12231:6;12226:3;12222:16;12219:25;12216:112;;;12247:79;;:::i;:::-;12216:112;12337:41;12371:6;12366:3;12361;12337:41;:::i;:::-;12057:327;11974:410;;;;;:::o;12403:338::-;12458:5;12507:3;12500:4;12492:6;12488:17;12484:27;12474:122;;12515:79;;:::i;:::-;12474:122;12632:6;12619:20;12657:78;12731:3;12723:6;12716:4;12708:6;12704:17;12657:78;:::i;:::-;12648:87;;12464:277;12403:338;;;;:::o;12747:943::-;12842:6;12850;12858;12866;12915:3;12903:9;12894:7;12890:23;12886:33;12883:120;;;12922:79;;:::i;:::-;12883:120;13042:1;13067:53;13112:7;13103:6;13092:9;13088:22;13067:53;:::i;:::-;13057:63;;13013:117;13169:2;13195:53;13240:7;13231:6;13220:9;13216:22;13195:53;:::i;:::-;13185:63;;13140:118;13297:2;13323:53;13368:7;13359:6;13348:9;13344:22;13323:53;:::i;:::-;13313:63;;13268:118;13453:2;13442:9;13438:18;13425:32;13484:18;13476:6;13473:30;13470:117;;;13506:79;;:::i;:::-;13470:117;13611:62;13665:7;13656:6;13645:9;13641:22;13611:62;:::i;:::-;13601:72;;13396:287;12747:943;;;;;;;:::o;13696:122::-;13769:24;13787:5;13769:24;:::i;:::-;13762:5;13759:35;13749:63;;13808:1;13805;13798:12;13749:63;13696:122;:::o;13824:139::-;13870:5;13908:6;13895:20;13886:29;;13924:33;13951:5;13924:33;:::i;:::-;13824:139;;;;:::o;13969:329::-;14028:6;14077:2;14065:9;14056:7;14052:23;14048:32;14045:119;;;14083:79;;:::i;:::-;14045:119;14203:1;14228:53;14273:7;14264:6;14253:9;14249:22;14228:53;:::i;:::-;14218:63;;14174:117;13969:329;;;;:::o;14304:308::-;14366:4;14456:18;14448:6;14445:30;14442:56;;;14478:18;;:::i;:::-;14442:56;14516:29;14538:6;14516:29;:::i;:::-;14508:37;;14600:4;14594;14590:15;14582:23;;14304:308;;;:::o;14618:412::-;14696:5;14721:66;14737:49;14779:6;14737:49;:::i;:::-;14721:66;:::i;:::-;14712:75;;14810:6;14803:5;14796:21;14848:4;14841:5;14837:16;14886:3;14877:6;14872:3;14868:16;14865:25;14862:112;;;14893:79;;:::i;:::-;14862:112;14983:41;15017:6;15012:3;15007;14983:41;:::i;:::-;14702:328;14618:412;;;;;:::o;15050:340::-;15106:5;15155:3;15148:4;15140:6;15136:17;15132:27;15122:122;;15163:79;;:::i;:::-;15122:122;15280:6;15267:20;15305:79;15380:3;15372:6;15365:4;15357:6;15353:17;15305:79;:::i;:::-;15296:88;;15112:278;15050:340;;;;:::o;15396:509::-;15465:6;15514:2;15502:9;15493:7;15489:23;15485:32;15482:119;;;15520:79;;:::i;:::-;15482:119;15668:1;15657:9;15653:17;15640:31;15698:18;15690:6;15687:30;15684:117;;;15720:79;;:::i;:::-;15684:117;15825:63;15880:7;15871:6;15860:9;15856:22;15825:63;:::i;:::-;15815:73;;15611:287;15396:509;;;;:::o;15911:474::-;15979:6;15987;16036:2;16024:9;16015:7;16011:23;16007:32;16004:119;;;16042:79;;:::i;:::-;16004:119;16162:1;16187:53;16232:7;16223:6;16212:9;16208:22;16187:53;:::i;:::-;16177:63;;16133:117;16289:2;16315:53;16360:7;16351:6;16340:9;16336:22;16315:53;:::i;:::-;16305:63;;16260:118;15911:474;;;;;:::o;16391:182::-;16531:34;16527:1;16519:6;16515:14;16508:58;16391:182;:::o;16579:366::-;16721:3;16742:67;16806:2;16801:3;16742:67;:::i;:::-;16735:74;;16818:93;16907:3;16818:93;:::i;:::-;16936:2;16931:3;16927:12;16920:19;;16579:366;;;:::o;16951:419::-;17117:4;17155:2;17144:9;17140:18;17132:26;;17204:9;17198:4;17194:20;17190:1;17179:9;17175:17;17168:47;17232:131;17358:4;17232:131;:::i;:::-;17224:139;;16951:419;;;:::o;17376:181::-;17516:33;17512:1;17504:6;17500:14;17493:57;17376:181;:::o;17563:366::-;17705:3;17726:67;17790:2;17785:3;17726:67;:::i;:::-;17719:74;;17802:93;17891:3;17802:93;:::i;:::-;17920:2;17915:3;17911:12;17904:19;;17563:366;;;:::o;17935:419::-;18101:4;18139:2;18128:9;18124:18;18116:26;;18188:9;18182:4;18178:20;18174:1;18163:9;18159:17;18152:47;18216:131;18342:4;18216:131;:::i;:::-;18208:139;;17935:419;;;:::o;18360:169::-;18500:21;18496:1;18488:6;18484:14;18477:45;18360:169;:::o;18535:366::-;18677:3;18698:67;18762:2;18757:3;18698:67;:::i;:::-;18691:74;;18774:93;18863:3;18774:93;:::i;:::-;18892:2;18887:3;18883:12;18876:19;;18535:366;;;:::o;18907:419::-;19073:4;19111:2;19100:9;19096:18;19088:26;;19160:9;19154:4;19150:20;19146:1;19135:9;19131:17;19124:47;19188:131;19314:4;19188:131;:::i;:::-;19180:139;;18907:419;;;:::o;19332:180::-;19380:77;19377:1;19370:88;19477:4;19474:1;19467:15;19501:4;19498:1;19491:15;19518:305;19558:3;19577:20;19595:1;19577:20;:::i;:::-;19572:25;;19611:20;19629:1;19611:20;:::i;:::-;19606:25;;19765:1;19697:66;19693:74;19690:1;19687:81;19684:107;;;19771:18;;:::i;:::-;19684:107;19815:1;19812;19808:9;19801:16;;19518:305;;;;:::o;19829:163::-;19969:15;19965:1;19957:6;19953:14;19946:39;19829:163;:::o;19998:366::-;20140:3;20161:67;20225:2;20220:3;20161:67;:::i;:::-;20154:74;;20237:93;20326:3;20237:93;:::i;:::-;20355:2;20350:3;20346:12;20339:19;;19998:366;;;:::o;20370:419::-;20536:4;20574:2;20563:9;20559:18;20551:26;;20623:9;20617:4;20613:20;20609:1;20598:9;20594:17;20587:47;20651:131;20777:4;20651:131;:::i;:::-;20643:139;;20370:419;;;:::o;20795:164::-;20935:16;20931:1;20923:6;20919:14;20912:40;20795:164;:::o;20965:366::-;21107:3;21128:67;21192:2;21187:3;21128:67;:::i;:::-;21121:74;;21204:93;21293:3;21204:93;:::i;:::-;21322:2;21317:3;21313:12;21306:19;;20965:366;;;:::o;21337:419::-;21503:4;21541:2;21530:9;21526:18;21518:26;;21590:9;21584:4;21580:20;21576:1;21565:9;21561:17;21554:47;21618:131;21744:4;21618:131;:::i;:::-;21610:139;;21337:419;;;:::o;21762:94::-;21795:8;21843:5;21839:2;21835:14;21814:35;;21762:94;;;:::o;21862:::-;21901:7;21930:20;21944:5;21930:20;:::i;:::-;21919:31;;21862:94;;;:::o;21962:100::-;22001:7;22030:26;22050:5;22030:26;:::i;:::-;22019:37;;21962:100;;;:::o;22068:157::-;22173:45;22193:24;22211:5;22193:24;:::i;:::-;22173:45;:::i;:::-;22168:3;22161:58;22068:157;;:::o;22231:256::-;22343:3;22358:75;22429:3;22420:6;22358:75;:::i;:::-;22458:2;22453:3;22449:12;22442:19;;22478:3;22471:10;;22231:256;;;;:::o;22493:180::-;22633:32;22629:1;22621:6;22617:14;22610:56;22493:180;:::o;22679:366::-;22821:3;22842:67;22906:2;22901:3;22842:67;:::i;:::-;22835:74;;22918:93;23007:3;22918:93;:::i;:::-;23036:2;23031:3;23027:12;23020:19;;22679:366;;;:::o;23051:419::-;23217:4;23255:2;23244:9;23240:18;23232:26;;23304:9;23298:4;23294:20;23290:1;23279:9;23275:17;23268:47;23332:131;23458:4;23332:131;:::i;:::-;23324:139;;23051:419;;;:::o;23476:180::-;23524:77;23521:1;23514:88;23621:4;23618:1;23611:15;23645:4;23642:1;23635:15;23662:320;23706:6;23743:1;23737:4;23733:12;23723:22;;23790:1;23784:4;23780:12;23811:18;23801:81;;23867:4;23859:6;23855:17;23845:27;;23801:81;23929:2;23921:6;23918:14;23898:18;23895:38;23892:84;;;23948:18;;:::i;:::-;23892:84;23713:269;23662:320;;;:::o;23988:231::-;24128:34;24124:1;24116:6;24112:14;24105:58;24197:14;24192:2;24184:6;24180:15;24173:39;23988:231;:::o;24225:366::-;24367:3;24388:67;24452:2;24447:3;24388:67;:::i;:::-;24381:74;;24464:93;24553:3;24464:93;:::i;:::-;24582:2;24577:3;24573:12;24566:19;;24225:366;;;:::o;24597:419::-;24763:4;24801:2;24790:9;24786:18;24778:26;;24850:9;24844:4;24840:20;24836:1;24825:9;24821:17;24814:47;24878:131;25004:4;24878:131;:::i;:::-;24870:139;;24597:419;;;:::o;25022:220::-;25162:34;25158:1;25150:6;25146:14;25139:58;25231:3;25226:2;25218:6;25214:15;25207:28;25022:220;:::o;25248:366::-;25390:3;25411:67;25475:2;25470:3;25411:67;:::i;:::-;25404:74;;25487:93;25576:3;25487:93;:::i;:::-;25605:2;25600:3;25596:12;25589:19;;25248:366;;;:::o;25620:419::-;25786:4;25824:2;25813:9;25809:18;25801:26;;25873:9;25867:4;25863:20;25859:1;25848:9;25844:17;25837:47;25901:131;26027:4;25901:131;:::i;:::-;25893:139;;25620:419;;;:::o;26045:243::-;26185:34;26181:1;26173:6;26169:14;26162:58;26254:26;26249:2;26241:6;26237:15;26230:51;26045:243;:::o;26294:366::-;26436:3;26457:67;26521:2;26516:3;26457:67;:::i;:::-;26450:74;;26533:93;26622:3;26533:93;:::i;:::-;26651:2;26646:3;26642:12;26635:19;;26294:366;;;:::o;26666:419::-;26832:4;26870:2;26859:9;26855:18;26847:26;;26919:9;26913:4;26909:20;26905:1;26894:9;26890:17;26883:47;26947:131;27073:4;26947:131;:::i;:::-;26939:139;;26666:419;;;:::o;27091:236::-;27231:34;27227:1;27219:6;27215:14;27208:58;27300:19;27295:2;27287:6;27283:15;27276:44;27091:236;:::o;27333:366::-;27475:3;27496:67;27560:2;27555:3;27496:67;:::i;:::-;27489:74;;27572:93;27661:3;27572:93;:::i;:::-;27690:2;27685:3;27681:12;27674:19;;27333:366;;;:::o;27705:419::-;27871:4;27909:2;27898:9;27894:18;27886:26;;27958:9;27952:4;27948:20;27944:1;27933:9;27929:17;27922:47;27986:131;28112:4;27986:131;:::i;:::-;27978:139;;27705:419;;;:::o;28130:230::-;28270:34;28266:1;28258:6;28254:14;28247:58;28339:13;28334:2;28326:6;28322:15;28315:38;28130:230;:::o;28366:366::-;28508:3;28529:67;28593:2;28588:3;28529:67;:::i;:::-;28522:74;;28605:93;28694:3;28605:93;:::i;:::-;28723:2;28718:3;28714:12;28707:19;;28366:366;;;:::o;28738:419::-;28904:4;28942:2;28931:9;28927:18;28919:26;;28991:9;28985:4;28981:20;28977:1;28966:9;28962:17;28955:47;29019:131;29145:4;29019:131;:::i;:::-;29011:139;;28738:419;;;:::o;29163:143::-;29220:5;29251:6;29245:13;29236:22;;29267:33;29294:5;29267:33;:::i;:::-;29163:143;;;;:::o;29312:351::-;29382:6;29431:2;29419:9;29410:7;29406:23;29402:32;29399:119;;;29437:79;;:::i;:::-;29399:119;29557:1;29582:64;29638:7;29629:6;29618:9;29614:22;29582:64;:::i;:::-;29572:74;;29528:128;29312:351;;;;:::o;29669:332::-;29790:4;29828:2;29817:9;29813:18;29805:26;;29841:71;29909:1;29898:9;29894:17;29885:6;29841:71;:::i;:::-;29922:72;29990:2;29979:9;29975:18;29966:6;29922:72;:::i;:::-;29669:332;;;;;:::o;30007:137::-;30061:5;30092:6;30086:13;30077:22;;30108:30;30132:5;30108:30;:::i;:::-;30007:137;;;;:::o;30150:345::-;30217:6;30266:2;30254:9;30245:7;30241:23;30237:32;30234:119;;;30272:79;;:::i;:::-;30234:119;30392:1;30417:61;30470:7;30461:6;30450:9;30446:22;30417:61;:::i;:::-;30407:71;;30363:125;30150:345;;;;:::o;30501:231::-;30641:34;30637:1;30629:6;30625:14;30618:58;30710:14;30705:2;30697:6;30693:15;30686:39;30501:231;:::o;30738:366::-;30880:3;30901:67;30965:2;30960:3;30901:67;:::i;:::-;30894:74;;30977:93;31066:3;30977:93;:::i;:::-;31095:2;31090:3;31086:12;31079:19;;30738:366;;;:::o;31110:419::-;31276:4;31314:2;31303:9;31299:18;31291:26;;31363:9;31357:4;31353:20;31349:1;31338:9;31334:17;31327:47;31391:131;31517:4;31391:131;:::i;:::-;31383:139;;31110:419;;;:::o;31535:180::-;31583:77;31580:1;31573:88;31680:4;31677:1;31670:15;31704:4;31701:1;31694:15;31721:228;31861:34;31857:1;31849:6;31845:14;31838:58;31930:11;31925:2;31917:6;31913:15;31906:36;31721:228;:::o;31955:366::-;32097:3;32118:67;32182:2;32177:3;32118:67;:::i;:::-;32111:74;;32194:93;32283:3;32194:93;:::i;:::-;32312:2;32307:3;32303:12;32296:19;;31955:366;;;:::o;32327:419::-;32493:4;32531:2;32520:9;32516:18;32508:26;;32580:9;32574:4;32570:20;32566:1;32555:9;32551:17;32544:47;32608:131;32734:4;32608:131;:::i;:::-;32600:139;;32327:419;;;:::o;32752:348::-;32792:7;32815:20;32833:1;32815:20;:::i;:::-;32810:25;;32849:20;32867:1;32849:20;:::i;:::-;32844:25;;33037:1;32969:66;32965:74;32962:1;32959:81;32954:1;32947:9;32940:17;32936:105;32933:131;;;33044:18;;:::i;:::-;32933:131;33092:1;33089;33085:9;33074:20;;32752:348;;;;:::o;33106:174::-;33246:26;33242:1;33234:6;33230:14;33223:50;33106:174;:::o;33286:366::-;33428:3;33449:67;33513:2;33508:3;33449:67;:::i;:::-;33442:74;;33525:93;33614:3;33525:93;:::i;:::-;33643:2;33638:3;33634:12;33627:19;;33286:366;;;:::o;33658:419::-;33824:4;33862:2;33851:9;33847:18;33839:26;;33911:9;33905:4;33901:20;33897:1;33886:9;33882:17;33875:47;33939:131;34065:4;33939:131;:::i;:::-;33931:139;;33658:419;;;:::o;34083:173::-;34223:25;34219:1;34211:6;34207:14;34200:49;34083:173;:::o;34262:366::-;34404:3;34425:67;34489:2;34484:3;34425:67;:::i;:::-;34418:74;;34501:93;34590:3;34501:93;:::i;:::-;34619:2;34614:3;34610:12;34603:19;;34262:366;;;:::o;34634:419::-;34800:4;34838:2;34827:9;34823:18;34815:26;;34887:9;34881:4;34877:20;34873:1;34862:9;34858:17;34851:47;34915:131;35041:4;34915:131;:::i;:::-;34907:139;;34634:419;;;:::o;35059:233::-;35098:3;35121:24;35139:5;35121:24;:::i;:::-;35112:33;;35167:66;35160:5;35157:77;35154:103;;;35237:18;;:::i;:::-;35154:103;35284:1;35277:5;35273:13;35266:20;;35059:233;;;:::o;35298:229::-;35438:34;35434:1;35426:6;35422:14;35415:58;35507:12;35502:2;35494:6;35490:15;35483:37;35298:229;:::o;35533:366::-;35675:3;35696:67;35760:2;35755:3;35696:67;:::i;:::-;35689:74;;35772:93;35861:3;35772:93;:::i;:::-;35890:2;35885:3;35881:12;35874:19;;35533:366;;;:::o;35905:419::-;36071:4;36109:2;36098:9;36094:18;36086:26;;36158:9;36152:4;36148:20;36144:1;36133:9;36129:17;36122:47;36186:131;36312:4;36186:131;:::i;:::-;36178:139;;35905:419;;;:::o;36330:176::-;36470:28;36466:1;36458:6;36454:14;36447:52;36330:176;:::o;36512:366::-;36654:3;36675:67;36739:2;36734:3;36675:67;:::i;:::-;36668:74;;36751:93;36840:3;36751:93;:::i;:::-;36869:2;36864:3;36860:12;36853:19;;36512:366;;;:::o;36884:419::-;37050:4;37088:2;37077:9;37073:18;37065:26;;37137:9;37131:4;37127:20;37123:1;37112:9;37108:17;37101:47;37165:131;37291:4;37165:131;:::i;:::-;37157:139;;36884:419;;;:::o;37309:167::-;37449:19;37445:1;37437:6;37433:14;37426:43;37309:167;:::o;37482:366::-;37624:3;37645:67;37709:2;37704:3;37645:67;:::i;:::-;37638:74;;37721:93;37810:3;37721:93;:::i;:::-;37839:2;37834:3;37830:12;37823:19;;37482:366;;;:::o;37854:419::-;38020:4;38058:2;38047:9;38043:18;38035:26;;38107:9;38101:4;38097:20;38093:1;38082:9;38078:17;38071:47;38135:131;38261:4;38135:131;:::i;:::-;38127:139;;37854:419;;;:::o;38279:148::-;38381:11;38418:3;38403:18;;38279:148;;;;:::o;38433:141::-;38482:4;38505:3;38497:11;;38528:3;38525:1;38518:14;38562:4;38559:1;38549:18;38541:26;;38433:141;;;:::o;38604:845::-;38707:3;38744:5;38738:12;38773:36;38799:9;38773:36;:::i;:::-;38825:89;38907:6;38902:3;38825:89;:::i;:::-;38818:96;;38945:1;38934:9;38930:17;38961:1;38956:137;;;;39107:1;39102:341;;;;38923:520;;38956:137;39040:4;39036:9;39025;39021:25;39016:3;39009:38;39076:6;39071:3;39067:16;39060:23;;38956:137;;39102:341;39169:38;39201:5;39169:38;:::i;:::-;39229:1;39243:154;39257:6;39254:1;39251:13;39243:154;;;39331:7;39325:14;39321:1;39316:3;39312:11;39305:35;39381:1;39372:7;39368:15;39357:26;;39279:4;39276:1;39272:12;39267:17;;39243:154;;;39426:6;39421:3;39417:16;39410:23;;39109:334;;38923:520;;38711:738;;38604:845;;;;:::o;39455:151::-;39595:3;39591:1;39583:6;39579:14;39572:27;39455:151;:::o;39612:400::-;39772:3;39793:84;39875:1;39870:3;39793:84;:::i;:::-;39786:91;;39886:93;39975:3;39886:93;:::i;:::-;40004:1;39999:3;39995:11;39988:18;;39612:400;;;:::o;40018:377::-;40124:3;40152:39;40185:5;40152:39;:::i;:::-;40207:89;40289:6;40284:3;40207:89;:::i;:::-;40200:96;;40305:52;40350:6;40345:3;40338:4;40331:5;40327:16;40305:52;:::i;:::-;40382:6;40377:3;40373:16;40366:23;;40128:267;40018:377;;;;:::o;40401:695::-;40679:3;40701:92;40789:3;40780:6;40701:92;:::i;:::-;40694:99;;40810:148;40954:3;40810:148;:::i;:::-;40803:155;;40975:95;41066:3;41057:6;40975:95;:::i;:::-;40968:102;;41087:3;41080:10;;40401:695;;;;;:::o;41102:225::-;41242:34;41238:1;41230:6;41226:14;41219:58;41311:8;41306:2;41298:6;41294:15;41287:33;41102:225;:::o;41333:366::-;41475:3;41496:67;41560:2;41555:3;41496:67;:::i;:::-;41489:74;;41572:93;41661:3;41572:93;:::i;:::-;41690:2;41685:3;41681:12;41674:19;;41333:366;;;:::o;41705:419::-;41871:4;41909:2;41898:9;41894:18;41886:26;;41958:9;41952:4;41948:20;41944:1;41933:9;41929:17;41922:47;41986:131;42112:4;41986:131;:::i;:::-;41978:139;;41705:419;;;:::o;42130:231::-;42270:34;42266:1;42258:6;42254:14;42247:58;42339:14;42334:2;42326:6;42322:15;42315:39;42130:231;:::o;42367:366::-;42509:3;42530:67;42594:2;42589:3;42530:67;:::i;:::-;42523:74;;42606:93;42695:3;42606:93;:::i;:::-;42724:2;42719:3;42715:12;42708:19;;42367:366;;;:::o;42739:419::-;42905:4;42943:2;42932:9;42928:18;42920:26;;42992:9;42986:4;42982:20;42978:1;42967:9;42963:17;42956:47;43020:131;43146:4;43020:131;:::i;:::-;43012:139;;42739:419;;;:::o;43164:228::-;43304:34;43300:1;43292:6;43288:14;43281:58;43373:11;43368:2;43360:6;43356:15;43349:36;43164:228;:::o;43398:366::-;43540:3;43561:67;43625:2;43620:3;43561:67;:::i;:::-;43554:74;;43637:93;43726:3;43637:93;:::i;:::-;43755:2;43750:3;43746:12;43739:19;;43398:366;;;:::o;43770:419::-;43936:4;43974:2;43963:9;43959:18;43951:26;;44023:9;44017:4;44013:20;44009:1;43998:9;43994:17;43987:47;44051:131;44177:4;44051:131;:::i;:::-;44043:139;;43770:419;;;:::o;44195:223::-;44335:34;44331:1;44323:6;44319:14;44312:58;44404:6;44399:2;44391:6;44387:15;44380:31;44195:223;:::o;44424:366::-;44566:3;44587:67;44651:2;44646:3;44587:67;:::i;:::-;44580:74;;44663:93;44752:3;44663:93;:::i;:::-;44781:2;44776:3;44772:12;44765:19;;44424:366;;;:::o;44796:419::-;44962:4;45000:2;44989:9;44985:18;44977:26;;45049:9;45043:4;45039:20;45035:1;45024:9;45020:17;45013:47;45077:131;45203:4;45077:131;:::i;:::-;45069:139;;44796:419;;;:::o;45221:191::-;45261:4;45281:20;45299:1;45281:20;:::i;:::-;45276:25;;45315:20;45333:1;45315:20;:::i;:::-;45310:25;;45354:1;45351;45348:8;45345:34;;;45359:18;;:::i;:::-;45345:34;45404:1;45401;45397:9;45389:17;;45221:191;;;;:::o;45418:175::-;45558:27;45554:1;45546:6;45542:14;45535:51;45418:175;:::o;45599:366::-;45741:3;45762:67;45826:2;45821:3;45762:67;:::i;:::-;45755:74;;45838:93;45927:3;45838:93;:::i;:::-;45956:2;45951:3;45947:12;45940:19;;45599:366;;;:::o;45971:419::-;46137:4;46175:2;46164:9;46160:18;46152:26;;46224:9;46218:4;46214:20;46210:1;46199:9;46195:17;46188:47;46252:131;46378:4;46252:131;:::i;:::-;46244:139;;45971:419;;;:::o;46396:237::-;46536:34;46532:1;46524:6;46520:14;46513:58;46605:20;46600:2;46592:6;46588:15;46581:45;46396:237;:::o;46639:366::-;46781:3;46802:67;46866:2;46861:3;46802:67;:::i;:::-;46795:74;;46878:93;46967:3;46878:93;:::i;:::-;46996:2;46991:3;46987:12;46980:19;;46639:366;;;:::o;47011:419::-;47177:4;47215:2;47204:9;47200:18;47192:26;;47264:9;47258:4;47254:20;47250:1;47239:9;47235:17;47228:47;47292:131;47418:4;47292:131;:::i;:::-;47284:139;;47011:419;;;:::o;47436:180::-;47484:77;47481:1;47474:88;47581:4;47578:1;47571:15;47605:4;47602:1;47595:15;47622:185;47662:1;47679:20;47697:1;47679:20;:::i;:::-;47674:25;;47713:20;47731:1;47713:20;:::i;:::-;47708:25;;47752:1;47742:35;;47757:18;;:::i;:::-;47742:35;47799:1;47796;47792:9;47787:14;;47622:185;;;;:::o;47813:176::-;47845:1;47862:20;47880:1;47862:20;:::i;:::-;47857:25;;47896:20;47914:1;47896:20;:::i;:::-;47891:25;;47935:1;47925:35;;47940:18;;:::i;:::-;47925:35;47981:1;47978;47974:9;47969:14;;47813:176;;;;:::o;47995:79::-;48034:7;48063:5;48052:16;;47995:79;;;:::o;48080:157::-;48185:45;48205:24;48223:5;48205:24;:::i;:::-;48185:45;:::i;:::-;48180:3;48173:58;48080:157;;:::o;48243:397::-;48383:3;48398:75;48469:3;48460:6;48398:75;:::i;:::-;48498:2;48493:3;48489:12;48482:19;;48511:75;48582:3;48573:6;48511:75;:::i;:::-;48611:2;48606:3;48602:12;48595:19;;48631:3;48624:10;;48243:397;;;;;:::o;48646:98::-;48697:6;48731:5;48725:12;48715:22;;48646:98;;;:::o;48750:168::-;48833:11;48867:6;48862:3;48855:19;48907:4;48902:3;48898:14;48883:29;;48750:168;;;;:::o;48924:360::-;49010:3;49038:38;49070:5;49038:38;:::i;:::-;49092:70;49155:6;49150:3;49092:70;:::i;:::-;49085:77;;49171:52;49216:6;49211:3;49204:4;49197:5;49193:16;49171:52;:::i;:::-;49248:29;49270:6;49248:29;:::i;:::-;49243:3;49239:39;49232:46;;49014:270;48924:360;;;;:::o;49290:640::-;49485:4;49523:3;49512:9;49508:19;49500:27;;49537:71;49605:1;49594:9;49590:17;49581:6;49537:71;:::i;:::-;49618:72;49686:2;49675:9;49671:18;49662:6;49618:72;:::i;:::-;49700;49768:2;49757:9;49753:18;49744:6;49700:72;:::i;:::-;49819:9;49813:4;49809:20;49804:2;49793:9;49789:18;49782:48;49847:76;49918:4;49909:6;49847:76;:::i;:::-;49839:84;;49290:640;;;;;;;:::o;49936:141::-;49992:5;50023:6;50017:13;50008:22;;50039:32;50065:5;50039:32;:::i;:::-;49936:141;;;;:::o;50083:349::-;50152:6;50201:2;50189:9;50180:7;50176:23;50172:32;50169:119;;;50207:79;;:::i;:::-;50169:119;50327:1;50352:63;50407:7;50398:6;50387:9;50383:22;50352:63;:::i;:::-;50342:73;;50298:127;50083:349;;;;:::o;50438:182::-;50578:34;50574:1;50566:6;50562:14;50555:58;50438:182;:::o;50626:366::-;50768:3;50789:67;50853:2;50848:3;50789:67;:::i;:::-;50782:74;;50865:93;50954:3;50865:93;:::i;:::-;50983:2;50978:3;50974:12;50967:19;;50626:366;;;:::o;50998:419::-;51164:4;51202:2;51191:9;51187:18;51179:26;;51251:9;51245:4;51241:20;51237:1;51226:9;51222:17;51215:47;51279:131;51405:4;51279:131;:::i;:::-;51271:139;;50998:419;;;:::o;51423:178::-;51563:30;51559:1;51551:6;51547:14;51540:54;51423:178;:::o;51607:366::-;51749:3;51770:67;51834:2;51829:3;51770:67;:::i;:::-;51763:74;;51846:93;51935:3;51846:93;:::i;:::-;51964:2;51959:3;51955:12;51948:19;;51607:366;;;:::o;51979:419::-;52145:4;52183:2;52172:9;52168:18;52160:26;;52232:9;52226:4;52222:20;52218:1;52207:9;52203:17;52196:47;52260:131;52386:4;52260:131;:::i;:::-;52252:139;;51979:419;;;:::o;52404:180::-;52452:77;52449:1;52442:88;52549:4;52546:1;52539:15;52573:4;52570:1;52563:15

Swarm Source

ipfs://2b6ab5b9034da7ead1a69f6adf331386ca16d3e725ede6f4472adcf93a33c5ea
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.