ETH Price: $3,384.67 (+0.82%)

Token

Bad Cats Gang (BCG)
 

Overview

Max Total Supply

4,444 BCG

Holders

1,240

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

A cool collection of 4444 Bad Cats NFTs, known as Gang. Your Bad Cat will grant you access to future benefits exclusively for members only.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BadCatsGang

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

//
//
// ▄▄▄▄▄▄▄▄▄▄   ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄        ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄  ▄▄▄▄▄▄▄▄▄▄▄ 
//▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░░░░░░░░░░▌      ▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌▐░░░░░░░░░░░▌
//▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌     ▐░█▀▀▀▀▀▀▀▀▀ ▐░█▀▀▀▀▀▀▀█░▌ ▀▀▀▀█░█▀▀▀▀ ▐░█▀▀▀▀▀▀▀▀▀ 
//▐░▌       ▐░▌▐░▌       ▐░▌▐░▌       ▐░▌     ▐░▌          ▐░▌       ▐░▌     ▐░▌     ▐░▌          
//▐░█▄▄▄▄▄▄▄█░▌▐░█▄▄▄▄▄▄▄█░▌▐░▌       ▐░▌     ▐░▌          ▐░█▄▄▄▄▄▄▄█░▌     ▐░▌     ▐░█▄▄▄▄▄▄▄▄▄ 
//▐░░░░░░░░░░▌ ▐░░░░░░░░░░░▌▐░▌       ▐░▌     ▐░▌          ▐░░░░░░░░░░░▌     ▐░▌     ▐░░░░░░░░░░░▌
//▐░█▀▀▀▀▀▀▀█░▌▐░█▀▀▀▀▀▀▀█░▌▐░▌       ▐░▌     ▐░▌          ▐░█▀▀▀▀▀▀▀█░▌     ▐░▌      ▀▀▀▀▀▀▀▀▀█░▌
//▐░▌       ▐░▌▐░▌       ▐░▌▐░▌       ▐░▌     ▐░▌          ▐░▌       ▐░▌     ▐░▌               ▐░▌
//▐░█▄▄▄▄▄▄▄█░▌▐░▌       ▐░▌▐░█▄▄▄▄▄▄▄█░▌     ▐░█▄▄▄▄▄▄▄▄▄ ▐░▌       ▐░▌     ▐░▌      ▄▄▄▄▄▄▄▄▄█░▌
//▐░░░░░░░░░░▌ ▐░▌       ▐░▌▐░░░░░░░░░░▌      ▐░░░░░░░░░░░▌▐░▌       ▐░▌     ▐░▌     ▐░░░░░░░░░░░▌
// ▀▀▀▀▀▀▀▀▀▀   ▀         ▀  ▀▀▀▀▀▀▀▀▀▀        ▀▀▀▀▀▀▀▀▀▀▀  ▀         ▀       ▀       ▀▀▀▀▀▀▀▀▀▀▀ 
//                                                                                                
//

// Contract developed by Cats

abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

pragma solidity ^0.8.0;

abstract contract Ownable is Context {
    address private _owner;

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

    constructor() {
        _transferOwnership(_msgSender());
    }

    modifier onlyOwner() {
        _checkOwner();
        _;
    }

    function owner() public view virtual returns (address) {
        return _owner;
    }

    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }


    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

abstract contract ReentrancyGuard {

    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

        _status = _NOT_ENTERED;
    }
}

pragma solidity ^0.8.0;

library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

pragma solidity ^0.8.0;


library EnumerableSet {


    struct Set {
        // Storage of set values
        bytes32[] _values;

        mapping(bytes32 => uint256) _indexes;
    }

    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);

            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    function _remove(Set storage set, bytes32 value) private returns (bool) {

        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                set._values[toDeleteIndex] = lastValue;
                
                set._indexes[lastValue] = valueIndex; 
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    struct Bytes32Set {
        Set _inner;
    }

    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    struct AddressSet {
        Set _inner;
    }

    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    struct UintSet {
        Set _inner;
    }

    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

interface IERC721A {

    error ApprovalCallerNotOwnerNorApproved();

    error ApprovalQueryForNonexistentToken();

    error BalanceQueryForZeroAddress();

    error MintToZeroAddress();

    error MintZeroQuantity();

    error OwnerQueryForNonexistentToken();

    error TransferCallerNotOwnerNorApproved();

    error TransferFromIncorrectOwner();

    error TransferToNonERC721ReceiverImplementer();

    error TransferToZeroAddress();

    error URIQueryForNonexistentToken();

    error MintERC2309QuantityExceedsLimit();

    error OwnershipNotInitializedForExtraData();

    struct TokenOwnership {

        address addr;

        uint64 startTimestamp;

        bool burned;

        uint24 extraData;
    }

    function totalSupply() external view returns (uint256);

    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    function balanceOf(address owner) external view returns (uint256 balance);

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

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

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

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

    function approve(address to, uint256 tokenId) external payable;

    function setApprovalForAll(address operator, bool _approved) external;

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

    function isApprovedForAll(address owner, address operator) external view returns (bool);

    function name() external view returns (string memory);

    function symbol() external view returns (string memory);

    function tokenURI(uint256 tokenId) external view returns (string memory);

    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

pragma solidity ^0.8.4;

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

contract ERC721A is IERC721A {

    struct TokenApprovalRef {
        address value;
    }

    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    uint256 private constant _BITPOS_AUX = 192;

    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    uint256 private constant _BITMASK_BURNED = 1 << 224;

    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    uint256 private _currentIndex;

    uint256 private _burnCounter;

    string private _name;

    string private _symbol;

    mapping(uint256 => uint256) private _packedOwnerships;

    mapping(address => uint256) private _packedAddressData;

    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

    mapping(address => mapping(address => bool)) private _operatorApprovals;

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

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

    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    function totalSupply() public view virtual override returns (uint256) {

        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    function _totalMinted() internal view virtual returns (uint256) {

        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }


    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {

        return
            interfaceId == 0x01ffc9a7 || 
            interfaceId == 0x80ac58cd || 
            interfaceId == 0x5b5e139f; 
    }

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

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

    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];

                    if (packed & _BITMASK_BURNED == 0) {

                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    function approve(address to, uint256 tokenId) public payable virtual override {
        address owner = ownerOf(tokenId);

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

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {

            owner := and(owner, _BITMASK_ADDRESS)

            msgSender := and(msgSender, _BITMASK_ADDRESS)

            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];

        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        assembly {
            if approvedAddress {

                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            --_packedAddressData[from]; 
            ++_packedAddressData[to]; 

            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

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

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            assembly {

                toMasked := and(to, _BITMASK_ADDRESS)

                log4(
                    0, 
                    0, 
                    _TRANSFER_EVENT_SIGNATURE, 
                    0, 
                    toMasked, 
                    startTokenId 
                )

                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {

                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        unchecked {

            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

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

    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        assembly {
            if approvedAddress {
                
                sstore(approvedAddressSlot, 0)
            }
        }

        unchecked {

            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;

                if (_packedOwnerships[nextTokenId] == 0) {

                    if (nextTokenId != _currentIndex) {

                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

        unchecked {
            _burnCounter++;
        }
    }

    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {

            let m := add(mload(0x40), 0xa0)

            mstore(0x40, m)

            str := sub(m, 0x20)

            mstore(str, 0)

            let end := str

            for { let temp := value } 1 {} {
                str := sub(str, 1)

                mstore8(str, add(48, mod(temp, 10)))

                temp := div(temp, 10)

                if iszero(temp) { break }
            }

            let length := sub(end, str)

            str := sub(str, 0x20)

            mstore(str, length)
        }
    }
}

pragma solidity ^0.8.13;

contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (subscribe) {
                operatorFilterRegistry.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    operatorFilterRegistry.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    operatorFilterRegistry.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator() virtual {

        if (address(operatorFilterRegistry).code.length > 0) {
            if (!operatorFilterRegistry.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }
}

pragma solidity ^0.8.13;

contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.4;

interface IERC721ABurnable is IERC721A {

    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.16;
contract BadCatsGang is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{

string public CONTRACT_URI = "https://opensea.badcatsgang.club/";
    mapping(address => uint) public userHasMinted;
    bool public REVEALED;
    string public UNREVEALED_URI = "https://opensea.badcatsgang.club/";
    string public BASE_URI = "https://opensea.badcatsgang.club/";
    bool public isPublicMintEnabled = false;
    uint public COLLECTION_SIZE = 4444;
    uint public MINT_PRICE = 0.00165 ether;
    uint public MAX_BATCH_SIZE = 21;
    uint public SUPPLY_PER_WALLET = 21;
    uint public FREE_SUPPLY_PER_WALLET = 1;

    constructor() ERC721A("Bad Cats Gang", "BCG") {}
    function FreeMintVip(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "No more Cats in stock!"
        );
        
        _safeMint(receiver, quantity);
    }

    modifier callerIsUser() {
        require(tx.origin == msg.sender, "The caller is another contract");
        _;
    }

    function getPrice(uint quantity) public view returns(uint){
        uint price;
        uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender];
        if (quantity >= free) {
            price = (MINT_PRICE) * (quantity - free);
        } else {
            price = 0;
        }
        return price;
    }

    function mint(uint quantity)
        external
        payable
        callerIsUser 
        nonReentrant
    {
        uint price;
        uint free = FREE_SUPPLY_PER_WALLET - userHasMinted[msg.sender];
        if (quantity >= free) {
            price = (MINT_PRICE) * (quantity - free);
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + free;
        } else {
            price = 0;
            userHasMinted[msg.sender] = userHasMinted[msg.sender] + quantity;
        }

        require(isPublicMintEnabled, "Cats not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Bad Cats!");

        require(balanceOf(msg.sender) + quantity <= SUPPLY_PER_WALLET, "Tried to total mint quanity per wallet over limit");

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint quanity over limit, retry with reduced quantity");
        require(msg.value >= price, "Must send enough eth to adopt cat");

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }

    function withdrawFunds() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function setPublicMintEnabled() public onlyOwner {
        isPublicMintEnabled = !isPublicMintEnabled;
    }

    function setBaseURI(bool _revealed, string memory _baseURI) public onlyOwner {
        BASE_URI = _baseURI;
        REVEALED = _revealed;
    }

    function contractURI() public view returns (string memory) {
        return CONTRACT_URI;
    }

    function setContractURI(string memory _contractURI) public onlyOwner {
        CONTRACT_URI = _contractURI;
    }

    function set_COLLECTION_SIZE(uint256 _new) external onlyOwner {
        COLLECTION_SIZE = _new;
    }

    function setPrice(uint256 _newPrice) external onlyOwner {
        MINT_PRICE = _newPrice;
    }

    function set_FREE_SUPPLY_PER_WALLET(uint256 _new) external onlyOwner {
        FREE_SUPPLY_PER_WALLET = _new;
    }

    function set_SUPPLY_PER_WALLET(uint256 _new) external onlyOwner {
        SUPPLY_PER_WALLET = _new;
    }

    function set_MAX_BATCH_SIZE(uint256 _new) external onlyOwner {
        MAX_BATCH_SIZE = _new;
    }

    function transferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator {
        super.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public payable override (ERC721A, IERC721A) onlyAllowedOperator {
        super.safeTransferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public payable
        override (ERC721A, IERC721A)
        onlyAllowedOperator
    {
        super.safeTransferFrom(from, to, tokenId, data);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override (ERC721A, IERC721A)
        returns (string memory)
    {
        if (REVEALED) {
            return
                string(abi.encodePacked(BASE_URI, Strings.toString(_tokenId)));
        } else {
            return UNREVEALED_URI;
        }
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BASE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"COLLECTION_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"FreeMintVip","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REVEALED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"UNREVEALED_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"isPublicMintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_COLLECTION_SIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_FREE_SUPPLY_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_MAX_BATCH_SIZE","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"set_SUPPLY_PER_WALLET","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userHasMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806060016040528060218152602001620048fe60219139600a90816200002e9190620006fd565b50604051806060016040528060218152602001620048fe60219139600d9081620000599190620006fd565b50604051806060016040528060218152602001620048fe60219139600e9081620000849190620006fd565b506000600f60006101000a81548160ff02191690831515021790555061115c6010556605dcaa8fe12000601155601560125560156013556001601455348015620000cd57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600d81526020017f42616420436174732047616e67000000000000000000000000000000000000008152506040518060400160405280600381526020017f42434700000000000000000000000000000000000000000000000000000000008152506200017162000165620003b260201b60201c565b620003ba60201b60201c565b8160039081620001829190620006fd565b508060049081620001949190620006fd565b50620001a56200047e60201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115620003aa57801562000270576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200023692919062000829565b600060405180830381600087803b1580156200025157600080fd5b505af115801562000266573d6000803e3d6000fd5b50505050620003a9565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200032a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002f092919062000829565b600060405180830381600087803b1580156200030b57600080fd5b505af115801562000320573d6000803e3d6000fd5b50505050620003a8565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000373919062000856565b600060405180830381600087803b1580156200038e57600080fd5b505af1158015620003a3573d6000803e3d6000fd5b505050505b5b5b505062000873565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200050557607f821691505b6020821081036200051b576200051a620004bd565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000546565b62000591868362000546565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005de620005d8620005d284620005a9565b620005b3565b620005a9565b9050919050565b6000819050919050565b620005fa83620005bd565b620006126200060982620005e5565b84845462000553565b825550505050565b600090565b620006296200061a565b62000636818484620005ef565b505050565b5b818110156200065e57620006526000826200061f565b6001810190506200063c565b5050565b601f821115620006ad57620006778162000521565b620006828462000536565b8101602085101562000692578190505b620006aa620006a18562000536565b8301826200063b565b50505b505050565b600082821c905092915050565b6000620006d260001984600802620006b2565b1980831691505092915050565b6000620006ed8383620006bf565b9150826002028217905092915050565b620007088262000483565b67ffffffffffffffff8111156200072457620007236200048e565b5b620007308254620004ec565b6200073d82828562000662565b600060209050601f83116001811462000775576000841562000760578287015190505b6200076c8582620006df565b865550620007dc565b601f198416620007858662000521565b60005b82811015620007af5784890151825560018201915060208501945060208101905062000788565b86831015620007cf5784890151620007cb601f891682620006bf565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200081182620007e4565b9050919050565b620008238162000804565b82525050565b600060408201905062000840600083018562000818565b6200084f602083018462000818565b9392505050565b60006020820190506200086d600083018462000818565b92915050565b61407b80620008836000396000f3fe6080604052600436106102515760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063dbddb26a1161007a578063dbddb26a14610835578063e113ad9514610860578063e757223014610889578063e8a3d485146108c6578063e985e9c5146108f1578063f2fde38b1461092e57610251565b8063b88d4fde1461075b578063c002d23d14610777578063c87b56dd146107a2578063cfdbf254146107df578063d8258d951461080a57610251565b8063a0712d68116100fd578063a0712d68146106ab578063a22cb465146106c7578063a4cdd719146106f0578063a76a958714610707578063a9527e821461073257610251565b80638da5cb5b146105da57806391b7f5ed14610605578063938e3d7b1461062e57806395d89b41146106575780639e1f39d61461068257610251565b8063336f5ec3116101d25780635fe75587116101965780635fe75587146104cc5780636352211e146104f757806363fa5bde14610534578063696576321461055d57806370a0823114610586578063715018a6146105c357610251565b8063336f5ec31461040857806342842e0e1461043157806342966c681461044d578063507862d11461047657806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b6040516102789190612c96565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612d1d565b61096a565b6040516102b59190612c96565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612dda565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e32565b610a8e565b60405161031d9190612ea0565b60405180910390f35b610340600480360381019061033b9190612ee7565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612f36565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612f36565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612f51565b610c6e565b6040516103cc9190612f36565b60405180910390f35b6103ef60048036038101906103ea9190612f7e565b610c86565b005b3480156103fd57600080fd5b50610406610d92565b005b34801561041457600080fd5b5061042f600480360381019061042a9190612e32565b610e9e565b005b61044b60048036038101906104469190612f7e565b610eb0565b005b34801561045957600080fd5b50610474600480360381019061046f9190612e32565b610fbc565b005b34801561048257600080fd5b5061048b610fca565b6040516104989190612dda565b60405180910390f35b3480156104ad57600080fd5b506104b6611058565b6040516104c39190612dda565b60405180910390f35b3480156104d857600080fd5b506104e16110e6565b6040516104ee9190612f36565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190612e32565b6110ec565b60405161052b9190612ea0565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612e32565b6110fe565b005b34801561056957600080fd5b50610584600480360381019061057f9190612fd1565b611110565b005b34801561059257600080fd5b506105ad60048036038101906105a89190612f51565b61117d565b6040516105ba9190612f36565b60405180910390f35b3480156105cf57600080fd5b506105d8611235565b005b3480156105e657600080fd5b506105ef611249565b6040516105fc9190612ea0565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190612e32565b611272565b005b34801561063a57600080fd5b5061065560048036038101906106509190613146565b611284565b005b34801561066357600080fd5b5061066c61129f565b6040516106799190612dda565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906131bb565b611331565b005b6106c560048036038101906106c09190612e32565b611367565b005b3480156106d357600080fd5b506106ee60048036038101906106e99190613217565b6117b4565b005b3480156106fc57600080fd5b506107056118bf565b005b34801561071357600080fd5b5061071c6118f3565b6040516107299190612c96565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190612e32565b611906565b005b610775600480360381019061077091906132f8565b611918565b005b34801561078357600080fd5b5061078c611a26565b6040516107999190612f36565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c49190612e32565b611a2c565b6040516107d69190612dda565b60405180910390f35b3480156107eb57600080fd5b506107f4611b08565b6040516108019190612f36565b60405180910390f35b34801561081657600080fd5b5061081f611b0e565b60405161082c9190612f36565b60405180910390f35b34801561084157600080fd5b5061084a611b14565b6040516108579190612dda565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190612e32565b611ba2565b005b34801561089557600080fd5b506108b060048036038101906108ab9190612e32565b611bb4565b6040516108bd9190612f36565b60405180910390f35b3480156108d257600080fd5b506108db611c3e565b6040516108e89190612dda565b60405180910390f35b3480156108fd57600080fd5b506109186004803603810190610913919061337b565b611cd0565b6040516109259190612c96565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190612f51565b611d64565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133ea565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611de7565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b18826110ec565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611e46565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611e46565b611cd0565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611e4e565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cfd92919061341b565b6020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613459565b610d8157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d789190612ea0565b60405180910390fd5b5b610d8d838383611e53565b505050565b610d9a612175565b600260095403610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906134d2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e0d90613523565b60006040518083038185875af1925050503d8060008114610e4a576040519150601f19603f3d011682016040523d82523d6000602084013e610e4f565b606091505b5050905080610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613584565b60405180910390fd5b506001600981905550565b610ea6612175565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fac576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f2792919061341b565b6020604051808303816000875af1158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613459565b610fab57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fa29190612ea0565b60405180910390fd5b5b610fb78383836121f3565b505050565b610fc7816001612213565b50565b600d8054610fd7906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611003906133ea565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b505050505081565b600a8054611065906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906133ea565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b505050505081565b60135481565b60006110f782612465565b9050919050565b611106612175565b8060108190555050565b611118612175565b60105482611124610c57565b61112e91906135d3565b111561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690613653565b60405180910390fd5b6111798183612531565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111e4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61123d612175565b611247600061254f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61127a612175565b8060118190555050565b61128c612175565b80600a908161129b919061381f565b5050565b6060600480546112ae906133ea565b80601f01602080910402602001604051908101604052809291908181526020018280546112da906133ea565b80156113275780601f106112fc57610100808354040283529160200191611327565b820191906000526020600020905b81548152906001019060200180831161130a57829003601f168201915b5050505050905090565b611339612175565b80600e9081611348919061381f565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061393d565b60405180910390fd5b60026009540361141a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611411906134d2565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611472919061395d565b9050808310611529578083611487919061395d565b6011546114949190613991565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114e191906135d3565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115bc565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461157891906135d3565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff1661160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290613a37565b60405180910390fd5b60105483611617610c57565b61162191906135d3565b1115611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990613aa3565b60405180910390fd5b6013548361166f3361117d565b61167991906135d3565b11156116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190613b35565b60405180910390fd5b6012548311156116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613bc7565b60405180910390fd5b81341015611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613c59565b60405180910390fd5b61174c3384612531565b813411156117a7573373ffffffffffffffffffffffffffffffffffffffff166108fc833461177a919061395d565b9081150290604051600060405180830381858888f193505050501580156117a5573d6000803e3d6000fd5b505b5050600160098190555050565b80600860006117c1611e46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661186e611e46565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118b39190612c96565b60405180910390a35050565b6118c7612175565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b61190e612175565b8060148190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a14576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161198f92919061341b565b6020604051808303816000875af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d29190613459565b611a1357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a0a9190612ea0565b60405180910390fd5b5b611a2084848484612613565b50505050565b60115481565b6060600c60009054906101000a900460ff1615611a7557600e611a4e83612686565b604051602001611a5f929190613d38565b6040516020818303038152906040529050611b03565b600d8054611a82906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611aae906133ea565b8015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611b21906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4d906133ea565b8015611b9a5780601f10611b6f57610100808354040283529160200191611b9a565b820191906000526020600020905b815481529060010190602001808311611b7d57829003601f168201915b505050505081565b611baa612175565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611c06919061395d565b9050808410611c2f578084611c1b919061395d565b601154611c289190613991565b9150611c34565b600091505b8192505050919050565b6060600a8054611c4d906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c79906133ea565b8015611cc65780601f10611c9b57610100808354040283529160200191611cc6565b820191906000526020600020905b815481529060010190602001808311611ca957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d6c612175565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290613dce565b60405180910390fd5b611de48161254f565b50565b600081611df2611e4e565b11158015611e01575060015482105b8015611e3f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611e5e82612465565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ed1846127e6565b91509150611ee78187611ee2611e46565b61280d565b611f3357611efc86611ef7611e46565b611cd0565b611f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f99576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa68686866001612851565b8015611fb157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061207f8561205b888887612857565b7c02000000000000000000000000000000000000000000000000000000001761287f565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121055760006001850190506000600560008381526020019081526020016000205403612103576001548114612102578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216d86868660016128aa565b505050505050565b61217d6128b0565b73ffffffffffffffffffffffffffffffffffffffff1661219b611249565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890613e3a565b60405180910390fd5b565b61220e83838360405180602001604052806000815250611918565b505050565b600061221e83612465565b90506000819050600080612231866127e6565b91509150841561229a5761224d8184612248611e46565b61280d565b612299576122628361225d611e46565b611cd0565b612298576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6122a8836000886001612851565b80156122b357600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061235b8361231885600088612857565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761287f565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036123e157600060018701905060006005600083815260200190815260200160002054036123df5760015481146123de578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244b8360008860016128aa565b600260008154809291906001019190505550505050505050565b60008082905080612474611e4e565b116124fa576001548110156124f95760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036124f7575b600081036124ed5760056000836001900393508381526020019081526020016000205490506124c3565b809250505061252c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61254b8282604051806020016040528060008152506128b8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61261e848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126805761264984848484612956565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e1565b600082905060005b600082146126ff5780806126e890613e5a565b915050600a826126f89190613ed1565b91506126d5565b60008167ffffffffffffffff81111561271b5761271a61301b565b5b6040519080825280601f01601f19166020018201604052801561274d5781602001600182028036833780820191505090505b5090505b600085146127da57600182612766919061395d565b9150600a856127759190613f02565b603061278191906135d3565b60f81b81838151811061279757612796613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d39190613ed1565b9450612751565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861286e868684612aa6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6128c28383612aaf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129515760006001549050600083820390505b6129036000868380600101945086612956565b612939576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128f057816001541461294e57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261297c611e46565b8786866040518563ffffffff1660e01b815260040161299e9493929190613fb7565b6020604051808303816000875af19250505080156129da57506040513d601f19601f820116820180604052508101906129d79190614018565b60015b612a53573d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b506000815103612a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612af0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612afd6000848385612851565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b7483612b656000866000612857565b612b6e85612c6b565b1761287f565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c1557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bda565b5060008203612c50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c6660008483856128aa565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612c9081612c7b565b82525050565b6000602082019050612cab6000830184612c87565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cfa81612cc5565b8114612d0557600080fd5b50565b600081359050612d1781612cf1565b92915050565b600060208284031215612d3357612d32612cbb565b5b6000612d4184828501612d08565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d84578082015181840152602081019050612d69565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dac82612d4a565b612db68185612d55565b9350612dc6818560208601612d66565b612dcf81612d90565b840191505092915050565b60006020820190508181036000830152612df48184612da1565b905092915050565b6000819050919050565b612e0f81612dfc565b8114612e1a57600080fd5b50565b600081359050612e2c81612e06565b92915050565b600060208284031215612e4857612e47612cbb565b5b6000612e5684828501612e1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e8a82612e5f565b9050919050565b612e9a81612e7f565b82525050565b6000602082019050612eb56000830184612e91565b92915050565b612ec481612e7f565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612cbb565b5b6000612f0c85828601612ed2565b9250506020612f1d85828601612e1d565b9150509250929050565b612f3081612dfc565b82525050565b6000602082019050612f4b6000830184612f27565b92915050565b600060208284031215612f6757612f66612cbb565b5b6000612f7584828501612ed2565b91505092915050565b600080600060608486031215612f9757612f96612cbb565b5b6000612fa586828701612ed2565b9350506020612fb686828701612ed2565b9250506040612fc786828701612e1d565b9150509250925092565b60008060408385031215612fe857612fe7612cbb565b5b6000612ff685828601612e1d565b925050602061300785828601612ed2565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61305382612d90565b810181811067ffffffffffffffff821117156130725761307161301b565b5b80604052505050565b6000613085612cb1565b9050613091828261304a565b919050565b600067ffffffffffffffff8211156130b1576130b061301b565b5b6130ba82612d90565b9050602081019050919050565b82818337600083830152505050565b60006130e96130e484613096565b61307b565b90508281526020810184848401111561310557613104613016565b5b6131108482856130c7565b509392505050565b600082601f83011261312d5761312c613011565b5b813561313d8482602086016130d6565b91505092915050565b60006020828403121561315c5761315b612cbb565b5b600082013567ffffffffffffffff81111561317a57613179612cc0565b5b61318684828501613118565b91505092915050565b61319881612c7b565b81146131a357600080fd5b50565b6000813590506131b58161318f565b92915050565b600080604083850312156131d2576131d1612cbb565b5b60006131e0858286016131a6565b925050602083013567ffffffffffffffff81111561320157613200612cc0565b5b61320d85828601613118565b9150509250929050565b6000806040838503121561322e5761322d612cbb565b5b600061323c85828601612ed2565b925050602061324d858286016131a6565b9150509250929050565b600067ffffffffffffffff8211156132725761327161301b565b5b61327b82612d90565b9050602081019050919050565b600061329b61329684613257565b61307b565b9050828152602081018484840111156132b7576132b6613016565b5b6132c28482856130c7565b509392505050565b600082601f8301126132df576132de613011565b5b81356132ef848260208601613288565b91505092915050565b6000806000806080858703121561331257613311612cbb565b5b600061332087828801612ed2565b945050602061333187828801612ed2565b935050604061334287828801612e1d565b925050606085013567ffffffffffffffff81111561336357613362612cc0565b5b61336f878288016132ca565b91505092959194509250565b6000806040838503121561339257613391612cbb565b5b60006133a085828601612ed2565b92505060206133b185828601612ed2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340257607f821691505b602082108103613415576134146133bb565b5b50919050565b60006040820190506134306000830185612e91565b61343d6020830184612e91565b9392505050565b6000815190506134538161318f565b92915050565b60006020828403121561346f5761346e612cbb565b5b600061347d84828501613444565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134bc601f83612d55565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b50565b600061350d6000836134f2565b9150613518826134fd565b600082019050919050565b600061352e82613500565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061356e601083612d55565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135de82612dfc565b91506135e983612dfc565b9250828201905080821115613601576136006135a4565b5b92915050565b7f4e6f206d6f7265204361747320696e2073746f636b2100000000000000000000600082015250565b600061363d601683612d55565b915061364882613607565b602082019050919050565b6000602082019050818103600083015261366c81613630565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613698565b6136df8683613698565b95508019841693508086168417925050509392505050565b6000819050919050565b600061371c61371761371284612dfc565b6136f7565b612dfc565b9050919050565b6000819050919050565b61373683613701565b61374a61374282613723565b8484546136a5565b825550505050565b600090565b61375f613752565b61376a81848461372d565b505050565b5b8181101561378e57613783600082613757565b600181019050613770565b5050565b601f8211156137d3576137a481613673565b6137ad84613688565b810160208510156137bc578190505b6137d06137c885613688565b83018261376f565b50505b505050565b600082821c905092915050565b60006137f6600019846008026137d8565b1980831691505092915050565b600061380f83836137e5565b9150826002028217905092915050565b61382882612d4a565b67ffffffffffffffff8111156138415761384061301b565b5b61384b82546133ea565b613856828285613792565b600060209050601f8311600181146138895760008415613877578287015190505b6138818582613803565b8655506138e9565b601f19841661389786613673565b60005b828110156138bf5784890151825560018201915060208501945060208101905061389a565b868310156138dc57848901516138d8601f8916826137e5565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613927601e83612d55565b9150613932826138f1565b602082019050919050565b600060208201905081810360008301526139568161391a565b9050919050565b600061396882612dfc565b915061397383612dfc565b925082820390508181111561398b5761398a6135a4565b5b92915050565b600061399c82612dfc565b91506139a783612dfc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139e0576139df6135a4565b5b828202905092915050565b7f43617473206e6f74207265616479207965742100000000000000000000000000600082015250565b6000613a21601383612d55565b9150613a2c826139eb565b602082019050919050565b60006020820190508181036000830152613a5081613a14565b9050919050565b7f4e6f206d6f726520426164204361747321000000000000000000000000000000600082015250565b6000613a8d601183612d55565b9150613a9882613a57565b602082019050919050565b60006020820190508181036000830152613abc81613a80565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e697479207065722060008201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b6000613b1f603183612d55565b9150613b2a82613ac3565b604082019050919050565b60006020820190508181036000830152613b4e81613b12565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d697460008201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b6000613bb1603d83612d55565b9150613bbc82613b55565b604082019050919050565b60006020820190508181036000830152613be081613ba4565b9050919050565b7f4d7573742073656e6420656e6f7567682065746820746f2061646f707420636160008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c43602183612d55565b9150613c4e82613be7565b604082019050919050565b60006020820190508181036000830152613c7281613c36565b9050919050565b600081905092915050565b60008154613c91816133ea565b613c9b8186613c79565b94506001821660008114613cb65760018114613ccb57613cfe565b60ff1983168652811515820286019350613cfe565b613cd485613673565b60005b83811015613cf657815481890152600182019150602081019050613cd7565b838801955050505b50505092915050565b6000613d1282612d4a565b613d1c8185613c79565b9350613d2c818560208601612d66565b80840191505092915050565b6000613d448285613c84565b9150613d508284613d07565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db8602683612d55565b9150613dc382613d5c565b604082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e24602083612d55565b9150613e2f82613dee565b602082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b6000613e6582612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e9757613e966135a4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613edc82612dfc565b9150613ee783612dfc565b925082613ef757613ef6613ea2565b5b828204905092915050565b6000613f0d82612dfc565b9150613f1883612dfc565b925082613f2857613f27613ea2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f8982613f62565b613f938185613f6d565b9350613fa3818560208601612d66565b613fac81612d90565b840191505092915050565b6000608082019050613fcc6000830187612e91565b613fd96020830186612e91565b613fe66040830185612f27565b8181036060830152613ff88184613f7e565b905095945050505050565b60008151905061401281612cf1565b92915050565b60006020828403121561402e5761402d612cbb565b5b600061403c84828501614003565b9150509291505056fea2646970667358221220c978fd5744856d15f76ef469e8f20443d559b98cc5c620b92170671dc38728a064736f6c6343000810003368747470733a2f2f6f70656e7365612e6261646361747367616e672e636c75622f

Deployed Bytecode

0x6080604052600436106102515760003560e01c80638da5cb5b11610139578063b88d4fde116100b6578063dbddb26a1161007a578063dbddb26a14610835578063e113ad9514610860578063e757223014610889578063e8a3d485146108c6578063e985e9c5146108f1578063f2fde38b1461092e57610251565b8063b88d4fde1461075b578063c002d23d14610777578063c87b56dd146107a2578063cfdbf254146107df578063d8258d951461080a57610251565b8063a0712d68116100fd578063a0712d68146106ab578063a22cb465146106c7578063a4cdd719146106f0578063a76a958714610707578063a9527e821461073257610251565b80638da5cb5b146105da57806391b7f5ed14610605578063938e3d7b1461062e57806395d89b41146106575780639e1f39d61461068257610251565b8063336f5ec3116101d25780635fe75587116101965780635fe75587146104cc5780636352211e146104f757806363fa5bde14610534578063696576321461055d57806370a0823114610586578063715018a6146105c357610251565b8063336f5ec31461040857806342842e0e1461043157806342966c681461044d578063507862d11461047657806356b4f673146104a157610251565b80631422374f116102195780631422374f1461034257806318160ddd1461036d5780631d9857781461039857806323b872dd146103d557806324600fc3146103f157610251565b80630116bc2d1461025657806301ffc9a71461028157806306fdde03146102be578063081812fc146102e9578063095ea7b314610326575b600080fd5b34801561026257600080fd5b5061026b610957565b6040516102789190612c96565b60405180910390f35b34801561028d57600080fd5b506102a860048036038101906102a39190612d1d565b61096a565b6040516102b59190612c96565b60405180910390f35b3480156102ca57600080fd5b506102d36109fc565b6040516102e09190612dda565b60405180910390f35b3480156102f557600080fd5b50610310600480360381019061030b9190612e32565b610a8e565b60405161031d9190612ea0565b60405180910390f35b610340600480360381019061033b9190612ee7565b610b0d565b005b34801561034e57600080fd5b50610357610c51565b6040516103649190612f36565b60405180910390f35b34801561037957600080fd5b50610382610c57565b60405161038f9190612f36565b60405180910390f35b3480156103a457600080fd5b506103bf60048036038101906103ba9190612f51565b610c6e565b6040516103cc9190612f36565b60405180910390f35b6103ef60048036038101906103ea9190612f7e565b610c86565b005b3480156103fd57600080fd5b50610406610d92565b005b34801561041457600080fd5b5061042f600480360381019061042a9190612e32565b610e9e565b005b61044b60048036038101906104469190612f7e565b610eb0565b005b34801561045957600080fd5b50610474600480360381019061046f9190612e32565b610fbc565b005b34801561048257600080fd5b5061048b610fca565b6040516104989190612dda565b60405180910390f35b3480156104ad57600080fd5b506104b6611058565b6040516104c39190612dda565b60405180910390f35b3480156104d857600080fd5b506104e16110e6565b6040516104ee9190612f36565b60405180910390f35b34801561050357600080fd5b5061051e60048036038101906105199190612e32565b6110ec565b60405161052b9190612ea0565b60405180910390f35b34801561054057600080fd5b5061055b60048036038101906105569190612e32565b6110fe565b005b34801561056957600080fd5b50610584600480360381019061057f9190612fd1565b611110565b005b34801561059257600080fd5b506105ad60048036038101906105a89190612f51565b61117d565b6040516105ba9190612f36565b60405180910390f35b3480156105cf57600080fd5b506105d8611235565b005b3480156105e657600080fd5b506105ef611249565b6040516105fc9190612ea0565b60405180910390f35b34801561061157600080fd5b5061062c60048036038101906106279190612e32565b611272565b005b34801561063a57600080fd5b5061065560048036038101906106509190613146565b611284565b005b34801561066357600080fd5b5061066c61129f565b6040516106799190612dda565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a491906131bb565b611331565b005b6106c560048036038101906106c09190612e32565b611367565b005b3480156106d357600080fd5b506106ee60048036038101906106e99190613217565b6117b4565b005b3480156106fc57600080fd5b506107056118bf565b005b34801561071357600080fd5b5061071c6118f3565b6040516107299190612c96565b60405180910390f35b34801561073e57600080fd5b5061075960048036038101906107549190612e32565b611906565b005b610775600480360381019061077091906132f8565b611918565b005b34801561078357600080fd5b5061078c611a26565b6040516107999190612f36565b60405180910390f35b3480156107ae57600080fd5b506107c960048036038101906107c49190612e32565b611a2c565b6040516107d69190612dda565b60405180910390f35b3480156107eb57600080fd5b506107f4611b08565b6040516108019190612f36565b60405180910390f35b34801561081657600080fd5b5061081f611b0e565b60405161082c9190612f36565b60405180910390f35b34801561084157600080fd5b5061084a611b14565b6040516108579190612dda565b60405180910390f35b34801561086c57600080fd5b5061088760048036038101906108829190612e32565b611ba2565b005b34801561089557600080fd5b506108b060048036038101906108ab9190612e32565b611bb4565b6040516108bd9190612f36565b60405180910390f35b3480156108d257600080fd5b506108db611c3e565b6040516108e89190612dda565b60405180910390f35b3480156108fd57600080fd5b506109186004803603810190610913919061337b565b611cd0565b6040516109259190612c96565b60405180910390f35b34801561093a57600080fd5b5061095560048036038101906109509190612f51565b611d64565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109c557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109f55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a0b906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054610a37906133ea565b8015610a845780601f10610a5957610100808354040283529160200191610a84565b820191906000526020600020905b815481529060010190602001808311610a6757829003601f168201915b5050505050905090565b6000610a9982611de7565b610acf576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b18826110ec565b90508073ffffffffffffffffffffffffffffffffffffffff16610b39611e46565b73ffffffffffffffffffffffffffffffffffffffff1614610b9c57610b6581610b60611e46565b611cd0565b610b9b576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c61611e4e565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d82576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610cfd92919061341b565b6020604051808303816000875af1158015610d1c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d409190613459565b610d8157336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d789190612ea0565b60405180910390fd5b5b610d8d838383611e53565b505050565b610d9a612175565b600260095403610ddf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd6906134d2565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e0d90613523565b60006040518083038185875af1925050503d8060008114610e4a576040519150601f19603f3d011682016040523d82523d6000602084013e610e4f565b606091505b5050905080610e93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e8a90613584565b60405180910390fd5b506001600981905550565b610ea6612175565b8060128190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610fac576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f2792919061341b565b6020604051808303816000875af1158015610f46573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f6a9190613459565b610fab57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610fa29190612ea0565b60405180910390fd5b5b610fb78383836121f3565b505050565b610fc7816001612213565b50565b600d8054610fd7906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611003906133ea565b80156110505780601f1061102557610100808354040283529160200191611050565b820191906000526020600020905b81548152906001019060200180831161103357829003601f168201915b505050505081565b600a8054611065906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611091906133ea565b80156110de5780601f106110b3576101008083540402835291602001916110de565b820191906000526020600020905b8154815290600101906020018083116110c157829003601f168201915b505050505081565b60135481565b60006110f782612465565b9050919050565b611106612175565b8060108190555050565b611118612175565b60105482611124610c57565b61112e91906135d3565b111561116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690613653565b60405180910390fd5b6111798183612531565b5050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036111e4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61123d612175565b611247600061254f565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61127a612175565b8060118190555050565b61128c612175565b80600a908161129b919061381f565b5050565b6060600480546112ae906133ea565b80601f01602080910402602001604051908101604052809291908181526020018280546112da906133ea565b80156113275780601f106112fc57610100808354040283529160200191611327565b820191906000526020600020905b81548152906001019060200180831161130a57829003601f168201915b5050505050905090565b611339612175565b80600e9081611348919061381f565b5081600c60006101000a81548160ff0219169083151502179055505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc9061393d565b60405180910390fd5b60026009540361141a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611411906134d2565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611472919061395d565b9050808310611529578083611487919061395d565b6011546114949190613991565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546114e191906135d3565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506115bc565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461157891906135d3565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff1661160b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160290613a37565b60405180910390fd5b60105483611617610c57565b61162191906135d3565b1115611662576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165990613aa3565b60405180910390fd5b6013548361166f3361117d565b61167991906135d3565b11156116ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b190613b35565b60405180910390fd5b6012548311156116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690613bc7565b60405180910390fd5b81341015611742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173990613c59565b60405180910390fd5b61174c3384612531565b813411156117a7573373ffffffffffffffffffffffffffffffffffffffff166108fc833461177a919061395d565b9081150290604051600060405180830381858888f193505050501580156117a5573d6000803e3d6000fd5b505b5050600160098190555050565b80600860006117c1611e46565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661186e611e46565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118b39190612c96565b60405180910390a35050565b6118c7612175565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b61190e612175565b8060148190555050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611a14576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b815260040161198f92919061341b565b6020604051808303816000875af11580156119ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d29190613459565b611a1357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611a0a9190612ea0565b60405180910390fd5b5b611a2084848484612613565b50505050565b60115481565b6060600c60009054906101000a900460ff1615611a7557600e611a4e83612686565b604051602001611a5f929190613d38565b6040516020818303038152906040529050611b03565b600d8054611a82906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611aae906133ea565b8015611afb5780601f10611ad057610100808354040283529160200191611afb565b820191906000526020600020905b815481529060010190602001808311611ade57829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611b21906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611b4d906133ea565b8015611b9a5780601f10611b6f57610100808354040283529160200191611b9a565b820191906000526020600020905b815481529060010190602001808311611b7d57829003601f168201915b505050505081565b611baa612175565b8060138190555050565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054601454611c06919061395d565b9050808410611c2f578084611c1b919061395d565b601154611c289190613991565b9150611c34565b600091505b8192505050919050565b6060600a8054611c4d906133ea565b80601f0160208091040260200160405190810160405280929190818152602001828054611c79906133ea565b8015611cc65780601f10611c9b57610100808354040283529160200191611cc6565b820191906000526020600020905b815481529060010190602001808311611ca957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d6c612175565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd290613dce565b60405180910390fd5b611de48161254f565b50565b600081611df2611e4e565b11158015611e01575060015482105b8015611e3f575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b6000611e5e82612465565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611ec5576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080611ed1846127e6565b91509150611ee78187611ee2611e46565b61280d565b611f3357611efc86611ef7611e46565b611cd0565b611f32576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603611f99576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611fa68686866001612851565b8015611fb157600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001019190508190555061207f8561205b888887612857565b7c02000000000000000000000000000000000000000000000000000000001761287f565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036121055760006001850190506000600560008381526020019081526020016000205403612103576001548114612102578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461216d86868660016128aa565b505050505050565b61217d6128b0565b73ffffffffffffffffffffffffffffffffffffffff1661219b611249565b73ffffffffffffffffffffffffffffffffffffffff16146121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e890613e3a565b60405180910390fd5b565b61220e83838360405180602001604052806000815250611918565b505050565b600061221e83612465565b90506000819050600080612231866127e6565b91509150841561229a5761224d8184612248611e46565b61280d565b612299576122628361225d611e46565b611cd0565b612298576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b6122a8836000886001612851565b80156122b357600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061235b8361231885600088612857565b7c02000000000000000000000000000000000000000000000000000000007c0100000000000000000000000000000000000000000000000000000000171761287f565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036123e157600060018701905060006005600083815260200190815260200160002054036123df5760015481146123de578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461244b8360008860016128aa565b600260008154809291906001019190505550505050505050565b60008082905080612474611e4e565b116124fa576001548110156124f95760006005600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216036124f7575b600081036124ed5760056000836001900393508381526020019081526020016000205490506124c3565b809250505061252c565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b61254b8282604051806020016040528060008152506128b8565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61261e848484610c86565b60008373ffffffffffffffffffffffffffffffffffffffff163b146126805761264984848484612956565b61267f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600082036126cd576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127e1565b600082905060005b600082146126ff5780806126e890613e5a565b915050600a826126f89190613ed1565b91506126d5565b60008167ffffffffffffffff81111561271b5761271a61301b565b5b6040519080825280601f01601f19166020018201604052801561274d5781602001600182028036833780820191505090505b5090505b600085146127da57600182612766919061395d565b9150600a856127759190613f02565b603061278191906135d3565b60f81b81838151811061279757612796613f33565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127d39190613ed1565b9450612751565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861286e868684612aa6565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b6128c28383612aaf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146129515760006001549050600083820390505b6129036000868380600101945086612956565b612939576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106128f057816001541461294e57600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261297c611e46565b8786866040518563ffffffff1660e01b815260040161299e9493929190613fb7565b6020604051808303816000875af19250505080156129da57506040513d601f19601f820116820180604052508101906129d79190614018565b60015b612a53573d8060008114612a0a576040519150601f19603f3d011682016040523d82523d6000602084013e612a0f565b606091505b506000815103612a4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612af0576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612afd6000848385612851565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612b7483612b656000866000612857565b612b6e85612c6b565b1761287f565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612c1557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612bda565b5060008203612c50576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806001819055505050612c6660008483856128aa565b505050565b60006001821460e11b9050919050565b60008115159050919050565b612c9081612c7b565b82525050565b6000602082019050612cab6000830184612c87565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cfa81612cc5565b8114612d0557600080fd5b50565b600081359050612d1781612cf1565b92915050565b600060208284031215612d3357612d32612cbb565b5b6000612d4184828501612d08565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d84578082015181840152602081019050612d69565b60008484015250505050565b6000601f19601f8301169050919050565b6000612dac82612d4a565b612db68185612d55565b9350612dc6818560208601612d66565b612dcf81612d90565b840191505092915050565b60006020820190508181036000830152612df48184612da1565b905092915050565b6000819050919050565b612e0f81612dfc565b8114612e1a57600080fd5b50565b600081359050612e2c81612e06565b92915050565b600060208284031215612e4857612e47612cbb565b5b6000612e5684828501612e1d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612e8a82612e5f565b9050919050565b612e9a81612e7f565b82525050565b6000602082019050612eb56000830184612e91565b92915050565b612ec481612e7f565b8114612ecf57600080fd5b50565b600081359050612ee181612ebb565b92915050565b60008060408385031215612efe57612efd612cbb565b5b6000612f0c85828601612ed2565b9250506020612f1d85828601612e1d565b9150509250929050565b612f3081612dfc565b82525050565b6000602082019050612f4b6000830184612f27565b92915050565b600060208284031215612f6757612f66612cbb565b5b6000612f7584828501612ed2565b91505092915050565b600080600060608486031215612f9757612f96612cbb565b5b6000612fa586828701612ed2565b9350506020612fb686828701612ed2565b9250506040612fc786828701612e1d565b9150509250925092565b60008060408385031215612fe857612fe7612cbb565b5b6000612ff685828601612e1d565b925050602061300785828601612ed2565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61305382612d90565b810181811067ffffffffffffffff821117156130725761307161301b565b5b80604052505050565b6000613085612cb1565b9050613091828261304a565b919050565b600067ffffffffffffffff8211156130b1576130b061301b565b5b6130ba82612d90565b9050602081019050919050565b82818337600083830152505050565b60006130e96130e484613096565b61307b565b90508281526020810184848401111561310557613104613016565b5b6131108482856130c7565b509392505050565b600082601f83011261312d5761312c613011565b5b813561313d8482602086016130d6565b91505092915050565b60006020828403121561315c5761315b612cbb565b5b600082013567ffffffffffffffff81111561317a57613179612cc0565b5b61318684828501613118565b91505092915050565b61319881612c7b565b81146131a357600080fd5b50565b6000813590506131b58161318f565b92915050565b600080604083850312156131d2576131d1612cbb565b5b60006131e0858286016131a6565b925050602083013567ffffffffffffffff81111561320157613200612cc0565b5b61320d85828601613118565b9150509250929050565b6000806040838503121561322e5761322d612cbb565b5b600061323c85828601612ed2565b925050602061324d858286016131a6565b9150509250929050565b600067ffffffffffffffff8211156132725761327161301b565b5b61327b82612d90565b9050602081019050919050565b600061329b61329684613257565b61307b565b9050828152602081018484840111156132b7576132b6613016565b5b6132c28482856130c7565b509392505050565b600082601f8301126132df576132de613011565b5b81356132ef848260208601613288565b91505092915050565b6000806000806080858703121561331257613311612cbb565b5b600061332087828801612ed2565b945050602061333187828801612ed2565b935050604061334287828801612e1d565b925050606085013567ffffffffffffffff81111561336357613362612cc0565b5b61336f878288016132ca565b91505092959194509250565b6000806040838503121561339257613391612cbb565b5b60006133a085828601612ed2565b92505060206133b185828601612ed2565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061340257607f821691505b602082108103613415576134146133bb565b5b50919050565b60006040820190506134306000830185612e91565b61343d6020830184612e91565b9392505050565b6000815190506134538161318f565b92915050565b60006020828403121561346f5761346e612cbb565b5b600061347d84828501613444565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60006134bc601f83612d55565b91506134c782613486565b602082019050919050565b600060208201905081810360008301526134eb816134af565b9050919050565b600081905092915050565b50565b600061350d6000836134f2565b9150613518826134fd565b600082019050919050565b600061352e82613500565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b600061356e601083612d55565b915061357982613538565b602082019050919050565b6000602082019050818103600083015261359d81613561565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006135de82612dfc565b91506135e983612dfc565b9250828201905080821115613601576136006135a4565b5b92915050565b7f4e6f206d6f7265204361747320696e2073746f636b2100000000000000000000600082015250565b600061363d601683612d55565b915061364882613607565b602082019050919050565b6000602082019050818103600083015261366c81613630565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026136d57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613698565b6136df8683613698565b95508019841693508086168417925050509392505050565b6000819050919050565b600061371c61371761371284612dfc565b6136f7565b612dfc565b9050919050565b6000819050919050565b61373683613701565b61374a61374282613723565b8484546136a5565b825550505050565b600090565b61375f613752565b61376a81848461372d565b505050565b5b8181101561378e57613783600082613757565b600181019050613770565b5050565b601f8211156137d3576137a481613673565b6137ad84613688565b810160208510156137bc578190505b6137d06137c885613688565b83018261376f565b50505b505050565b600082821c905092915050565b60006137f6600019846008026137d8565b1980831691505092915050565b600061380f83836137e5565b9150826002028217905092915050565b61382882612d4a565b67ffffffffffffffff8111156138415761384061301b565b5b61384b82546133ea565b613856828285613792565b600060209050601f8311600181146138895760008415613877578287015190505b6138818582613803565b8655506138e9565b601f19841661389786613673565b60005b828110156138bf5784890151825560018201915060208501945060208101905061389a565b868310156138dc57848901516138d8601f8916826137e5565b8355505b6001600288020188555050505b505050505050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613927601e83612d55565b9150613932826138f1565b602082019050919050565b600060208201905081810360008301526139568161391a565b9050919050565b600061396882612dfc565b915061397383612dfc565b925082820390508181111561398b5761398a6135a4565b5b92915050565b600061399c82612dfc565b91506139a783612dfc565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139e0576139df6135a4565b5b828202905092915050565b7f43617473206e6f74207265616479207965742100000000000000000000000000600082015250565b6000613a21601383612d55565b9150613a2c826139eb565b602082019050919050565b60006020820190508181036000830152613a5081613a14565b9050919050565b7f4e6f206d6f726520426164204361747321000000000000000000000000000000600082015250565b6000613a8d601183612d55565b9150613a9882613a57565b602082019050919050565b60006020820190508181036000830152613abc81613a80565b9050919050565b7f547269656420746f20746f74616c206d696e74207175616e697479207065722060008201527f77616c6c6574206f766572206c696d6974000000000000000000000000000000602082015250565b6000613b1f603183612d55565b9150613b2a82613ac3565b604082019050919050565b60006020820190508181036000830152613b4e81613b12565b9050919050565b7f547269656420746f206d696e74207175616e697479206f766572206c696d697460008201527f2c20726574727920776974682072656475636564207175616e74697479000000602082015250565b6000613bb1603d83612d55565b9150613bbc82613b55565b604082019050919050565b60006020820190508181036000830152613be081613ba4565b9050919050565b7f4d7573742073656e6420656e6f7567682065746820746f2061646f707420636160008201527f7400000000000000000000000000000000000000000000000000000000000000602082015250565b6000613c43602183612d55565b9150613c4e82613be7565b604082019050919050565b60006020820190508181036000830152613c7281613c36565b9050919050565b600081905092915050565b60008154613c91816133ea565b613c9b8186613c79565b94506001821660008114613cb65760018114613ccb57613cfe565b60ff1983168652811515820286019350613cfe565b613cd485613673565b60005b83811015613cf657815481890152600182019150602081019050613cd7565b838801955050505b50505092915050565b6000613d1282612d4a565b613d1c8185613c79565b9350613d2c818560208601612d66565b80840191505092915050565b6000613d448285613c84565b9150613d508284613d07565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613db8602683612d55565b9150613dc382613d5c565b604082019050919050565b60006020820190508181036000830152613de781613dab565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613e24602083612d55565b9150613e2f82613dee565b602082019050919050565b60006020820190508181036000830152613e5381613e17565b9050919050565b6000613e6582612dfc565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e9757613e966135a4565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613edc82612dfc565b9150613ee783612dfc565b925082613ef757613ef6613ea2565b5b828204905092915050565b6000613f0d82612dfc565b9150613f1883612dfc565b925082613f2857613f27613ea2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613f8982613f62565b613f938185613f6d565b9350613fa3818560208601612d66565b613fac81612d90565b840191505092915050565b6000608082019050613fcc6000830187612e91565b613fd96020830186612e91565b613fe66040830185612f27565b8181036060830152613ff88184613f7e565b905095945050505050565b60008151905061401281612cf1565b92915050565b60006020828403121561402e5761402d612cbb565b5b600061403c84828501614003565b9150509291505056fea2646970667358221220c978fd5744856d15f76ef469e8f20443d559b98cc5c620b92170671dc38728a064736f6c63430008100033

Deployed Bytecode Sourcemap

36888:4831:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37282:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17385:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17637:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21213:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20797:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37493:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15748:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37063:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40721:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39457:191;;;;;;;;;;;;;:::i;:::-;;40612:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40914:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36761:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37142:66;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36992:64;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37452:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18285:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40156:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37594:258;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16213:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3497:103;;;;;;;;;;;;;:::i;:::-;;3262:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40267:97;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40033:115;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17745:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39774:146;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38321:1128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21439:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39656:110;;;;;;;;;;;;;:::i;:::-;;37115:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40372:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41115:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37369:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41373:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37414:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37328:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37215:60;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40497:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37989:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39928:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21681:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3610:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37282:39;;;;;;;;;;;;;:::o;17385:244::-;17470:4;17524:10;17509:25;;:11;:25;;;;:68;;;;17567:10;17552:25;;:11;:25;;;;17509:68;:111;;;;17610:10;17595:25;;:11;:25;;;;17509:111;17489:131;;17385:244;;;:::o;17637:100::-;17691:13;17724:5;17717:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17637:100;:::o;21213:218::-;21289:7;21314:16;21322:7;21314;:16::i;:::-;21309:64;;21339:34;;;;;;;;;;;;;;21309:64;21393:15;:24;21409:7;21393:24;;;;;;;;;;;:30;;;;;;;;;;;;21386:37;;21213:218;;;:::o;20797:408::-;20886:13;20902:16;20910:7;20902;:16::i;:::-;20886:32;;20958:5;20935:28;;:19;:17;:19::i;:::-;:28;;;20931:175;;20983:44;21000:5;21007:19;:17;:19::i;:::-;20983:16;:44::i;:::-;20978:128;;21055:35;;;;;;;;;;;;;;20978:128;20931:175;21151:2;21118:15;:24;21134:7;21118:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;21189:7;21185:2;21169:28;;21178:5;21169:28;;;;;;;;;;;;20875:330;20797:408;;:::o;37493:38::-;;;;:::o;15748:180::-;15809:7;15894:15;:13;:15::i;:::-;15879:12;;15863:13;;:28;:46;15856:53;;15748:180;:::o;37063:45::-;;;;;;;;;;;;;;;;;:::o;40721:185::-;33997:1;33208:42;33951:43;;;:47;33947:225;;;33208:42;34020:40;;;34069:4;34076:10;34020:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34015:146;;34134:10;34115:30;;;;;;;;;;;:::i;:::-;;;;;;;;34015:146;33947:225;40861:37:::1;40880:4;40886:2;40890:7;40861:18;:37::i;:::-;40721:185:::0;;;:::o;39457:191::-;3221:13;:11;:13::i;:::-;4171:1:::1;4391:7;;:19:::0;4383:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4171:1;4524:7;:18;;;;39526:12:::2;39544:10;:15;;39567:21;39544:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39525:68;;;39612:7;39604:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;39514:134;4127:1:::1;4569:7;:22;;;;39457:191::o:0;40612:101::-;3221:13;:11;:13::i;:::-;40701:4:::1;40684:14;:21;;;;40612:101:::0;:::o;40914:193::-;33997:1;33208:42;33951:43;;;:47;33947:225;;;33208:42;34020:40;;;34069:4;34076:10;34020:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34015:146;;34134:10;34115:30;;;;;;;;;;;:::i;:::-;;;;;;;;34015:146;33947:225;41058:41:::1;41081:4;41087:2;41091:7;41058:22;:41::i;:::-;40914:193:::0;;;:::o;36761:94::-;36827:20;36833:7;36842:4;36827:5;:20::i;:::-;36761:94;:::o;37142:66::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36992:64::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;37452:34::-;;;;:::o;18285:152::-;18357:7;18400:27;18419:7;18400:18;:27::i;:::-;18377:52;;18285:152;;;:::o;40156:103::-;3221:13;:11;:13::i;:::-;40247:4:::1;40229:15;:22;;;;40156:103:::0;:::o;37594:258::-;3221:13;:11;:13::i;:::-;37729:15:::1;;37717:8;37701:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37679:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;37815:29;37825:8;37835;37815:9;:29::i;:::-;37594:258:::0;;:::o;16213:233::-;16285:7;16326:1;16309:19;;:5;:19;;;16305:60;;16337:28;;;;;;;;;;;;;;16305:60;14021:13;16383:18;:25;16402:5;16383:25;;;;;;;;;;;;;;;;:55;16376:62;;16213:233;;;:::o;3497:103::-;3221:13;:11;:13::i;:::-;3562:30:::1;3589:1;3562:18;:30::i;:::-;3497:103::o:0;3262:87::-;3308:7;3335:6;;;;;;;;;;;3328:13;;3262:87;:::o;40267:97::-;3221:13;:11;:13::i;:::-;40347:9:::1;40334:10;:22;;;;40267:97:::0;:::o;40033:115::-;3221:13;:11;:13::i;:::-;40128:12:::1;40113;:27;;;;;;:::i;:::-;;40033:115:::0;:::o;17745:104::-;17801:13;17834:7;17827:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17745:104;:::o;39774:146::-;3221:13;:11;:13::i;:::-;39873:8:::1;39862;:19;;;;;;:::i;:::-;;39903:9;39892:8;;:20;;;;;;;;;;;;;;;;;;39774:146:::0;;:::o;38321:1128::-;37916:10;37903:23;;:9;:23;;;37895:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;4171:1:::1;4391:7;;:19:::0;4383:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;4171:1;4524:7;:18;;;;38446:10:::2;38467:9:::0;38504:13:::2;:25;38518:10;38504:25;;;;;;;;;;;;;;;;38479:22;;:50;;;;:::i;:::-;38467:62;;38556:4;38544:8;:16;38540:285;;38612:4;38601:8;:15;;;;:::i;:::-;38586:10;;38585:32;;;;:::i;:::-;38577:40;;38688:4;38660:13;:25;38674:10;38660:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;38632:13;:25;38646:10;38632:25;;;;;;;;;;;;;;;:60;;;;38540:285;;;38733:1;38725:9;;38805:8;38777:13;:25;38791:10;38777:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;38749:13;:25;38763:10;38749:25;;;;;;;;;;;;;;;:64;;;;38540:285;38845:19;;;;;;;;;;;38837:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;38935:15;;38923:8;38907:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;38899:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39029:17;;39017:8;38993:21;39003:10;38993:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;38985:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;39133:14;;39121:8;:26;;39113:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;39245:5;39232:9;:18;;39224:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;39301:31;39311:10;39323:8;39301:9;:31::i;:::-;39361:5;39349:9;:17;39345:97;;;39391:10;39383:28;;:47;39424:5;39412:9;:17;;;;:::i;:::-;39383:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;39345:97;38435:1014;;4127:1:::1;4569:7;:22;;;;38321:1128:::0;:::o;21439:234::-;21586:8;21534:18;:39;21553:19;:17;:19::i;:::-;21534:39;;;;;;;;;;;;;;;:49;21574:8;21534:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;21646:8;21610:55;;21625:19;:17;:19::i;:::-;21610:55;;;21656:8;21610:55;;;;;;:::i;:::-;;;;;;;;21439:234;;:::o;39656:110::-;3221:13;:11;:13::i;:::-;39739:19:::1;;;;;;;;;;;39738:20;39716:19;;:42;;;;;;;;;;;;;;;;;;39656:110::o:0;37115:20::-;;;;;;;;;;;;;:::o;40372:117::-;3221:13;:11;:13::i;:::-;40477:4:::1;40452:22;:29;;;;40372:117:::0;:::o;41115:250::-;33997:1;33208:42;33951:43;;;:47;33947:225;;;33208:42;34020:40;;;34069:4;34076:10;34020:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34015:146;;34134:10;34115:30;;;;;;;;;;;:::i;:::-;;;;;;;;34015:146;33947:225;41310:47:::1;41333:4;41339:2;41343:7;41352:4;41310:22;:47::i;:::-;41115:250:::0;;;;:::o;37369:38::-;;;;:::o;41373:341::-;41495:13;41530:8;;;;;;;;;;;41526:181;;;41603:8;41613:26;41630:8;41613:16;:26::i;:::-;41586:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;41555:86;;;;41526:181;41681:14;41674:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41373:341;;;;:::o;37414:31::-;;;;:::o;37328:34::-;;;;:::o;37215:60::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40497:107::-;3221:13;:11;:13::i;:::-;40592:4:::1;40572:17;:24;;;;40497:107:::0;:::o;37989:324::-;38042:4;38058:10;38079:9;38116:13;:25;38130:10;38116:25;;;;;;;;;;;;;;;;38091:22;;:50;;;;:::i;:::-;38079:62;;38168:4;38156:8;:16;38152:131;;38224:4;38213:8;:15;;;;:::i;:::-;38198:10;;38197:32;;;;:::i;:::-;38189:40;;38152:131;;;38270:1;38262:9;;38152:131;38300:5;38293:12;;;;37989:324;;;:::o;39928:97::-;39972:13;40005:12;39998:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39928:97;:::o;21681:164::-;21778:4;21802:18;:25;21821:5;21802:25;;;;;;;;;;;;;;;:35;21828:8;21802:35;;;;;;;;;;;;;;;;;;;;;;;;;21795:42;;21681:164;;;;:::o;3610:201::-;3221:13;:11;:13::i;:::-;3719:1:::1;3699:22;;:8;:22;;::::0;3691:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3775:28;3794:8;3775:18;:28::i;:::-;3610:201:::0;:::o;21853:282::-;21918:4;21974:7;21955:15;:13;:15::i;:::-;:26;;:66;;;;;22008:13;;21998:7;:23;21955:66;:153;;;;;22107:1;14395:8;22059:17;:26;22077:7;22059:26;;;;;;;;;;;;:44;:49;21955:153;21935:173;;21853:282;;;:::o;32233:105::-;32293:7;32320:10;32313:17;;32233:105;:::o;15537:92::-;15593:7;15537:92;:::o;22948:1651::-;23090:27;23120;23139:7;23120:18;:27::i;:::-;23090:57;;23205:4;23164:45;;23180:19;23164:45;;;23160:86;;23218:28;;;;;;;;;;;;;;23160:86;23260:27;23289:23;23316:35;23343:7;23316:26;:35::i;:::-;23259:92;;;;23369:68;23394:15;23411:4;23417:19;:17;:19::i;:::-;23369:24;:68::i;:::-;23364:180;;23457:43;23474:4;23480:19;:17;:19::i;:::-;23457:16;:43::i;:::-;23452:92;;23509:35;;;;;;;;;;;;;;23452:92;23364:180;23575:1;23561:16;;:2;:16;;;23557:52;;23586:23;;;;;;;;;;;;;;23557:52;23622:43;23644:4;23650:2;23654:7;23663:1;23622:21;:43::i;:::-;23705:15;23702:85;;;23770:1;23749:19;23742:30;23702:85;23839:18;:24;23858:4;23839:24;;;;;;;;;;;;;;;;23837:26;;;;;;;;;;;;23881:18;:22;23900:2;23881:22;;;;;;;;;;;;;;;;23879:24;;;;;;;;;;;23950:146;23987:2;24036:45;24051:4;24057:2;24061:19;24036:14;:45::i;:::-;14529:8;24008:73;23950:18;:146::i;:::-;23921:17;:26;23939:7;23921:26;;;;;;;;;;;:175;;;;24168:1;14529:8;24117:19;:47;:52;24113:370;;24190:19;24222:1;24212:7;:11;24190:33;;24282:1;24248:17;:30;24266:11;24248:30;;;;;;;;;;;;:35;24244:224;;24329:13;;24314:11;:28;24310:139;;24406:19;24373:17;:30;24391:11;24373:30;;;;;;;;;;;:52;;;;24310:139;24244:224;24171:312;24113:370;24530:7;24526:2;24511:27;;24520:4;24511:27;;;;;;;;;;;;24549:42;24570:4;24576:2;24580:7;24589:1;24549:20;:42::i;:::-;23079:1520;;;22948:1651;;;:::o;3357:132::-;3432:12;:10;:12::i;:::-;3421:23;;:7;:5;:7::i;:::-;:23;;;3413:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3357:132::o;24607:193::-;24753:39;24770:4;24776:2;24780:7;24753:39;;;;;;;;;;;;:16;:39::i;:::-;24607:193;;;:::o;29603:1679::-;29683:27;29713;29732:7;29713:18;:27::i;:::-;29683:57;;29753:12;29784:19;29753:52;;29819:27;29848:23;29875:35;29902:7;29875:26;:35::i;:::-;29818:92;;;;29927:13;29923:244;;;29976:68;30001:15;30018:4;30024:19;:17;:19::i;:::-;29976:24;:68::i;:::-;29971:184;;30068:43;30085:4;30091:19;:17;:19::i;:::-;30068:16;:43::i;:::-;30063:92;;30120:35;;;;;;;;;;;;;;30063:92;29971:184;29923:244;30179:51;30201:4;30215:1;30219:7;30228:1;30179:21;:51::i;:::-;30270:15;30267:101;;;30351:1;30330:19;30323:30;30267:101;30477:1;14152:3;30447:1;:26;;30446:32;30418:18;:24;30437:4;30418:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;30524:176;30561:4;30632:53;30647:4;30661:1;30665:19;30632:14;:53::i;:::-;14529:8;14395;30585:43;30584:101;30524:18;:176::i;:::-;30495:17;:26;30513:7;30495:26;;;;;;;;;;;:205;;;;30772:1;14529:8;30721:19;:47;:52;30717:370;;30794:19;30826:1;30816:7;:11;30794:33;;30886:1;30852:17;:30;30870:11;30852:30;;;;;;;;;;;;:35;30848:224;;30933:13;;30918:11;:28;30914:139;;31010:19;30977:17;:30;30995:11;30977:30;;;;;;;;;;;:52;;;;30914:139;30848:224;30775:312;30717:370;31142:7;31138:1;31115:35;;31124:4;31115:35;;;;;;;;;;;;31161:50;31182:4;31196:1;31200:7;31209:1;31161:20;:50::i;:::-;31249:12;;:14;;;;;;;;;;;;;29672:1610;;;;29603:1679;;:::o;18992:633::-;19059:7;19079:12;19094:7;19079:22;;19162:4;19143:15;:13;:15::i;:::-;:23;19139:419;;19196:13;;19189:4;:20;19185:373;;;19234:14;19251:17;:23;19269:4;19251:23;;;;;;;;;;;;19234:40;;19331:1;14395:8;19303:6;:24;:29;19299:240;;19363:113;19380:1;19370:6;:11;19363:113;;19423:17;:25;19441:6;;;;;;;19423:25;;;;;;;;;;;;19414:34;;19363:113;;;19509:6;19502:13;;;;;;19299:240;19211:347;19185:373;19139:419;19586:31;;;;;;;;;;;;;;18992:633;;;;:::o;29386:112::-;29463:27;29473:2;29477:8;29463:27;;;;;;;;;;;;:9;:27::i;:::-;29386:112;;:::o;3819:191::-;3893:16;3912:6;;;;;;;;;;;3893:25;;3938:8;3929:6;;:17;;;;;;;;;;;;;;;;;;3993:8;3962:40;;3983:8;3962:40;;;;;;;;;;;;3882:128;3819:191;:::o;24808:407::-;24983:31;24996:4;25002:2;25006:7;24983:12;:31::i;:::-;25047:1;25029:2;:14;;;:19;25025:183;;25068:56;25099:4;25105:2;25109:7;25118:5;25068:30;:56::i;:::-;25063:145;;25152:40;;;;;;;;;;;;;;25063:145;25025:183;24808:407;;;;:::o;4773:534::-;4829:13;4870:1;4861:5;:10;4857:53;;4888:10;;;;;;;;;;;;;;;;;;;;;4857:53;4920:12;4935:5;4920:20;;4951:14;4976:78;4991:1;4983:4;:9;4976:78;;5009:8;;;;;:::i;:::-;;;;5040:2;5032:10;;;;;:::i;:::-;;;4976:78;;;5064:19;5096:6;5086:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5064:39;;5114:154;5130:1;5121:5;:10;5114:154;;5158:1;5148:11;;;;;:::i;:::-;;;5225:2;5217:5;:10;;;;:::i;:::-;5204:2;:24;;;;:::i;:::-;5191:39;;5174:6;5181;5174:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5254:2;5245:11;;;;;:::i;:::-;;;5114:154;;;5292:6;5278:21;;;;;4773:534;;;;:::o;22548:392::-;22650:27;22679:23;22720:38;22761:15;:24;22777:7;22761:24;;;;;;;;;;;22720:65;;22845:18;22822:41;;22902:19;22896:26;22877:45;;22807:126;22548:392;;;:::o;22143:397::-;22292:11;22362:16;22355:5;22351:28;22342:37;;22423:16;22412:9;22408:32;22395:45;;22505:15;22494:9;22491:30;22483:5;22472:9;22469:20;22466:56;22456:66;;22143:397;;;;;:::o;25223:159::-;;;;;:::o;31914:311::-;32049:7;32069:16;14592:3;32095:19;:41;;32069:68;;14592:3;32163:31;32174:4;32180:2;32184:9;32163:10;:31::i;:::-;32155:40;;:62;;32148:69;;;31914:311;;;;;:::o;20007:450::-;20087:14;20255:16;20248:5;20244:28;20235:37;;20432:5;20418:11;20393:23;20389:41;20386:52;20379:5;20376:63;20366:73;;20007:450;;;;:::o;25390:158::-;;;;;:::o;2708:98::-;2761:7;2788:10;2781:17;;2708:98;:::o;28689:689::-;28820:19;28826:2;28830:8;28820:5;:19::i;:::-;28899:1;28881:2;:14;;;:19;28877:483;;28921:11;28935:13;;28921:27;;28967:13;28989:8;28983:3;:14;28967:30;;29016:233;29047:62;29086:1;29090:2;29094:7;;;;;;29103:5;29047:30;:62::i;:::-;29042:167;;29145:40;;;;;;;;;;;;;;29042:167;29244:3;29236:5;:11;29016:233;;29331:3;29314:13;;:20;29310:34;;29336:8;;;29310:34;28902:458;;28877:483;28689:689;;;:::o;25556:716::-;25719:4;25765:2;25740:45;;;25786:19;:17;:19::i;:::-;25807:4;25813:7;25822:5;25740:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;25736:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26040:1;26023:6;:13;:18;26019:235;;26069:40;;;;;;;;;;;;;;26019:235;26212:6;26206:13;26197:6;26193:2;26189:15;26182:38;25736:529;25909:54;;;25899:64;;;:6;:64;;;;25892:71;;;25556:716;;;;;;:::o;31759:147::-;31896:6;31759:147;;;;;:::o;26280:1442::-;26353:20;26376:13;;26353:36;;26416:1;26404:8;:13;26400:44;;26426:18;;;;;;;;;;;;;;26400:44;26457:61;26487:1;26491:2;26495:12;26509:8;26457:21;:61::i;:::-;26627:1;14092:2;26597:1;:26;;26596:32;26584:8;:45;26558:18;:22;26577:2;26558:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;26680:139;26717:2;26771:33;26794:1;26798:2;26802:1;26771:14;:33::i;:::-;26738:30;26759:8;26738:20;:30::i;:::-;:66;26680:18;:139::i;:::-;26646:17;:31;26664:12;26646:31;;;;;;;;;;;:173;;;;26836:16;26867:11;26896:8;26881:12;:23;26867:37;;26971:16;26967:2;26963:25;26951:37;;27191:12;27159:8;27134:1;27085:25;27060:1;27035;27008:215;27303:1;27289:12;27285:20;27243:279;27344:3;27335:7;27332:16;27243:279;;27495:7;27485:8;27482:1;27455:25;27452:1;27449;27444:59;27397:1;27388:7;27384:15;27373:26;;27243:279;;;27247:77;27567:1;27555:8;:13;27551:45;;27577:19;;;;;;;;;;;;;;27551:45;27629:3;27613:13;:19;;;;26531:1113;;27654:60;27683:1;27687:2;27691:12;27705:8;27654:20;:60::i;:::-;26342:1380;26280:1442;;:::o;20465:324::-;20535:14;20768:1;20758:8;20755:15;20729:24;20725:46;20715:56;;20465:324;;;:::o;7:90:1:-;41:7;84:5;77:13;70:21;59:32;;7:90;;;:::o;103:109::-;184:21;199:5;184:21;:::i;:::-;179:3;172:34;103:109;;:::o;218:210::-;305:4;343:2;332:9;328:18;320:26;;356:65;418:1;407:9;403:17;394:6;356:65;:::i;:::-;218:210;;;;:::o;434:75::-;467:6;500:2;494:9;484:19;;434:75;:::o;515:117::-;624:1;621;614:12;638:117;747:1;744;737:12;761:149;797:7;837:66;830:5;826:78;815:89;;761:149;;;:::o;916:120::-;988:23;1005:5;988:23;:::i;:::-;981:5;978:34;968:62;;1026:1;1023;1016:12;968:62;916:120;:::o;1042:137::-;1087:5;1125:6;1112:20;1103:29;;1141:32;1167:5;1141:32;:::i;:::-;1042:137;;;;:::o;1185:327::-;1243:6;1292:2;1280:9;1271:7;1267:23;1263:32;1260:119;;;1298:79;;:::i;:::-;1260:119;1418:1;1443:52;1487:7;1478:6;1467:9;1463:22;1443:52;:::i;:::-;1433:62;;1389:116;1185:327;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:329::-;5301:6;5350:2;5338:9;5329:7;5325:23;5321:32;5318:119;;;5356:79;;:::i;:::-;5318:119;5476:1;5501:53;5546:7;5537:6;5526:9;5522:22;5501:53;:::i;:::-;5491:63;;5447:117;5242:329;;;;:::o;5577:619::-;5654:6;5662;5670;5719:2;5707:9;5698:7;5694:23;5690:32;5687:119;;;5725:79;;:::i;:::-;5687:119;5845:1;5870:53;5915:7;5906:6;5895:9;5891:22;5870:53;:::i;:::-;5860:63;;5816:117;5972:2;5998:53;6043:7;6034:6;6023:9;6019:22;5998:53;:::i;:::-;5988:63;;5943:118;6100:2;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6071:118;5577:619;;;;;:::o;6202:474::-;6270:6;6278;6327:2;6315:9;6306:7;6302:23;6298:32;6295:119;;;6333:79;;:::i;:::-;6295:119;6453:1;6478:53;6523:7;6514:6;6503:9;6499:22;6478:53;:::i;:::-;6468:63;;6424:117;6580:2;6606:53;6651:7;6642:6;6631:9;6627:22;6606:53;:::i;:::-;6596:63;;6551:118;6202:474;;;;;:::o;6682:117::-;6791:1;6788;6781:12;6805:117;6914:1;6911;6904:12;6928:180;6976:77;6973:1;6966:88;7073:4;7070:1;7063:15;7097:4;7094:1;7087:15;7114:281;7197:27;7219:4;7197:27;:::i;:::-;7189:6;7185:40;7327:6;7315:10;7312:22;7291:18;7279:10;7276:34;7273:62;7270:88;;;7338:18;;:::i;:::-;7270:88;7378:10;7374:2;7367:22;7157:238;7114:281;;:::o;7401:129::-;7435:6;7462:20;;:::i;:::-;7452:30;;7491:33;7519:4;7511:6;7491:33;:::i;:::-;7401:129;;;:::o;7536:308::-;7598:4;7688:18;7680:6;7677:30;7674:56;;;7710:18;;:::i;:::-;7674:56;7748:29;7770:6;7748:29;:::i;:::-;7740:37;;7832:4;7826;7822:15;7814:23;;7536:308;;;:::o;7850:146::-;7947:6;7942:3;7937;7924:30;7988:1;7979:6;7974:3;7970:16;7963:27;7850:146;;;:::o;8002:425::-;8080:5;8105:66;8121:49;8163:6;8121:49;:::i;:::-;8105:66;:::i;:::-;8096:75;;8194:6;8187:5;8180:21;8232:4;8225:5;8221:16;8270:3;8261:6;8256:3;8252:16;8249:25;8246:112;;;8277:79;;:::i;:::-;8246:112;8367:54;8414:6;8409:3;8404;8367:54;:::i;:::-;8086:341;8002:425;;;;;:::o;8447:340::-;8503:5;8552:3;8545:4;8537:6;8533:17;8529:27;8519:122;;8560:79;;:::i;:::-;8519:122;8677:6;8664:20;8702:79;8777:3;8769:6;8762:4;8754:6;8750:17;8702:79;:::i;:::-;8693:88;;8509:278;8447:340;;;;:::o;8793:509::-;8862:6;8911:2;8899:9;8890:7;8886:23;8882:32;8879:119;;;8917:79;;:::i;:::-;8879:119;9065:1;9054:9;9050:17;9037:31;9095:18;9087:6;9084:30;9081:117;;;9117:79;;:::i;:::-;9081:117;9222:63;9277:7;9268:6;9257:9;9253:22;9222:63;:::i;:::-;9212:73;;9008:287;8793:509;;;;:::o;9308:116::-;9378:21;9393:5;9378:21;:::i;:::-;9371:5;9368:32;9358:60;;9414:1;9411;9404:12;9358:60;9308:116;:::o;9430:133::-;9473:5;9511:6;9498:20;9489:29;;9527:30;9551:5;9527:30;:::i;:::-;9430:133;;;;:::o;9569:648::-;9644:6;9652;9701:2;9689:9;9680:7;9676:23;9672:32;9669:119;;;9707:79;;:::i;:::-;9669:119;9827:1;9852:50;9894:7;9885:6;9874:9;9870:22;9852:50;:::i;:::-;9842:60;;9798:114;9979:2;9968:9;9964:18;9951:32;10010:18;10002:6;9999:30;9996:117;;;10032:79;;:::i;:::-;9996:117;10137:63;10192:7;10183:6;10172:9;10168:22;10137:63;:::i;:::-;10127:73;;9922:288;9569:648;;;;;:::o;10223:468::-;10288:6;10296;10345:2;10333:9;10324:7;10320:23;10316:32;10313:119;;;10351:79;;:::i;:::-;10313:119;10471:1;10496:53;10541:7;10532:6;10521:9;10517:22;10496:53;:::i;:::-;10486:63;;10442:117;10598:2;10624:50;10666:7;10657:6;10646:9;10642:22;10624:50;:::i;:::-;10614:60;;10569:115;10223:468;;;;;:::o;10697:307::-;10758:4;10848:18;10840:6;10837:30;10834:56;;;10870:18;;:::i;:::-;10834:56;10908:29;10930:6;10908:29;:::i;:::-;10900:37;;10992:4;10986;10982:15;10974:23;;10697:307;;;:::o;11010:423::-;11087:5;11112:65;11128:48;11169:6;11128:48;:::i;:::-;11112:65;:::i;:::-;11103:74;;11200:6;11193:5;11186:21;11238:4;11231:5;11227:16;11276:3;11267:6;11262:3;11258:16;11255:25;11252:112;;;11283:79;;:::i;:::-;11252:112;11373:54;11420:6;11415:3;11410;11373:54;:::i;:::-;11093:340;11010:423;;;;;:::o;11452:338::-;11507:5;11556:3;11549:4;11541:6;11537:17;11533:27;11523:122;;11564:79;;:::i;:::-;11523:122;11681:6;11668:20;11706:78;11780:3;11772:6;11765:4;11757:6;11753:17;11706:78;:::i;:::-;11697:87;;11513:277;11452:338;;;;:::o;11796:943::-;11891:6;11899;11907;11915;11964:3;11952:9;11943:7;11939:23;11935:33;11932:120;;;11971:79;;:::i;:::-;11932:120;12091:1;12116:53;12161:7;12152:6;12141:9;12137:22;12116:53;:::i;:::-;12106:63;;12062:117;12218:2;12244:53;12289:7;12280:6;12269:9;12265:22;12244:53;:::i;:::-;12234:63;;12189:118;12346:2;12372:53;12417:7;12408:6;12397:9;12393:22;12372:53;:::i;:::-;12362:63;;12317:118;12502:2;12491:9;12487:18;12474:32;12533:18;12525:6;12522:30;12519:117;;;12555:79;;:::i;:::-;12519:117;12660:62;12714:7;12705:6;12694:9;12690:22;12660:62;:::i;:::-;12650:72;;12445:287;11796:943;;;;;;;:::o;12745:474::-;12813:6;12821;12870:2;12858:9;12849:7;12845:23;12841:32;12838:119;;;12876:79;;:::i;:::-;12838:119;12996:1;13021:53;13066:7;13057:6;13046:9;13042:22;13021:53;:::i;:::-;13011:63;;12967:117;13123:2;13149:53;13194:7;13185:6;13174:9;13170:22;13149:53;:::i;:::-;13139:63;;13094:118;12745:474;;;;;:::o;13225:180::-;13273:77;13270:1;13263:88;13370:4;13367:1;13360:15;13394:4;13391:1;13384:15;13411:320;13455:6;13492:1;13486:4;13482:12;13472:22;;13539:1;13533:4;13529:12;13560:18;13550:81;;13616:4;13608:6;13604:17;13594:27;;13550:81;13678:2;13670:6;13667:14;13647:18;13644:38;13641:84;;13697:18;;:::i;:::-;13641:84;13462:269;13411:320;;;:::o;13737:332::-;13858:4;13896:2;13885:9;13881:18;13873:26;;13909:71;13977:1;13966:9;13962:17;13953:6;13909:71;:::i;:::-;13990:72;14058:2;14047:9;14043:18;14034:6;13990:72;:::i;:::-;13737:332;;;;;:::o;14075:137::-;14129:5;14160:6;14154:13;14145:22;;14176:30;14200:5;14176:30;:::i;:::-;14075:137;;;;:::o;14218:345::-;14285:6;14334:2;14322:9;14313:7;14309:23;14305:32;14302:119;;;14340:79;;:::i;:::-;14302:119;14460:1;14485:61;14538:7;14529:6;14518:9;14514:22;14485:61;:::i;:::-;14475:71;;14431:125;14218:345;;;;:::o;14569:181::-;14709:33;14705:1;14697:6;14693:14;14686:57;14569:181;:::o;14756:366::-;14898:3;14919:67;14983:2;14978:3;14919:67;:::i;:::-;14912:74;;14995:93;15084:3;14995:93;:::i;:::-;15113:2;15108:3;15104:12;15097:19;;14756:366;;;:::o;15128:419::-;15294:4;15332:2;15321:9;15317:18;15309:26;;15381:9;15375:4;15371:20;15367:1;15356:9;15352:17;15345:47;15409:131;15535:4;15409:131;:::i;:::-;15401:139;;15128:419;;;:::o;15553:147::-;15654:11;15691:3;15676:18;;15553:147;;;;:::o;15706:114::-;;:::o;15826:398::-;15985:3;16006:83;16087:1;16082:3;16006:83;:::i;:::-;15999:90;;16098:93;16187:3;16098:93;:::i;:::-;16216:1;16211:3;16207:11;16200:18;;15826:398;;;:::o;16230:379::-;16414:3;16436:147;16579:3;16436:147;:::i;:::-;16429:154;;16600:3;16593:10;;16230:379;;;:::o;16615:166::-;16755:18;16751:1;16743:6;16739:14;16732:42;16615:166;:::o;16787:366::-;16929:3;16950:67;17014:2;17009:3;16950:67;:::i;:::-;16943:74;;17026:93;17115:3;17026:93;:::i;:::-;17144:2;17139:3;17135:12;17128:19;;16787:366;;;:::o;17159:419::-;17325:4;17363:2;17352:9;17348:18;17340:26;;17412:9;17406:4;17402:20;17398:1;17387:9;17383:17;17376:47;17440:131;17566:4;17440:131;:::i;:::-;17432:139;;17159:419;;;:::o;17584:180::-;17632:77;17629:1;17622:88;17729:4;17726:1;17719:15;17753:4;17750:1;17743:15;17770:191;17810:3;17829:20;17847:1;17829:20;:::i;:::-;17824:25;;17863:20;17881:1;17863:20;:::i;:::-;17858:25;;17906:1;17903;17899:9;17892:16;;17927:3;17924:1;17921:10;17918:36;;;17934:18;;:::i;:::-;17918:36;17770:191;;;;:::o;17967:172::-;18107:24;18103:1;18095:6;18091:14;18084:48;17967:172;:::o;18145:366::-;18287:3;18308:67;18372:2;18367:3;18308:67;:::i;:::-;18301:74;;18384:93;18473:3;18384:93;:::i;:::-;18502:2;18497:3;18493:12;18486:19;;18145:366;;;:::o;18517:419::-;18683:4;18721:2;18710:9;18706:18;18698:26;;18770:9;18764:4;18760:20;18756:1;18745:9;18741:17;18734:47;18798:131;18924:4;18798:131;:::i;:::-;18790:139;;18517:419;;;:::o;18942:141::-;18991:4;19014:3;19006:11;;19037:3;19034:1;19027:14;19071:4;19068:1;19058:18;19050:26;;18942:141;;;:::o;19089:93::-;19126:6;19173:2;19168;19161:5;19157:14;19153:23;19143:33;;19089:93;;;:::o;19188:107::-;19232:8;19282:5;19276:4;19272:16;19251:37;;19188:107;;;;:::o;19301:393::-;19370:6;19420:1;19408:10;19404:18;19443:97;19473:66;19462:9;19443:97;:::i;:::-;19561:39;19591:8;19580:9;19561:39;:::i;:::-;19549:51;;19633:4;19629:9;19622:5;19618:21;19609:30;;19682:4;19672:8;19668:19;19661:5;19658:30;19648:40;;19377:317;;19301:393;;;;;:::o;19700:60::-;19728:3;19749:5;19742:12;;19700:60;;;:::o;19766:142::-;19816:9;19849:53;19867:34;19876:24;19894:5;19876:24;:::i;:::-;19867:34;:::i;:::-;19849:53;:::i;:::-;19836:66;;19766:142;;;:::o;19914:75::-;19957:3;19978:5;19971:12;;19914:75;;;:::o;19995:269::-;20105:39;20136:7;20105:39;:::i;:::-;20166:91;20215:41;20239:16;20215:41;:::i;:::-;20207:6;20200:4;20194:11;20166:91;:::i;:::-;20160:4;20153:105;20071:193;19995:269;;;:::o;20270:73::-;20315:3;20270:73;:::o;20349:189::-;20426:32;;:::i;:::-;20467:65;20525:6;20517;20511:4;20467:65;:::i;:::-;20402:136;20349:189;;:::o;20544:186::-;20604:120;20621:3;20614:5;20611:14;20604:120;;;20675:39;20712:1;20705:5;20675:39;:::i;:::-;20648:1;20641:5;20637:13;20628:22;;20604:120;;;20544:186;;:::o;20736:543::-;20837:2;20832:3;20829:11;20826:446;;;20871:38;20903:5;20871:38;:::i;:::-;20955:29;20973:10;20955:29;:::i;:::-;20945:8;20941:44;21138:2;21126:10;21123:18;21120:49;;;21159:8;21144:23;;21120:49;21182:80;21238:22;21256:3;21238:22;:::i;:::-;21228:8;21224:37;21211:11;21182:80;:::i;:::-;20841:431;;20826:446;20736:543;;;:::o;21285:117::-;21339:8;21389:5;21383:4;21379:16;21358:37;;21285:117;;;;:::o;21408:169::-;21452:6;21485:51;21533:1;21529:6;21521:5;21518:1;21514:13;21485:51;:::i;:::-;21481:56;21566:4;21560;21556:15;21546:25;;21459:118;21408:169;;;;:::o;21582:295::-;21658:4;21804:29;21829:3;21823:4;21804:29;:::i;:::-;21796:37;;21866:3;21863:1;21859:11;21853:4;21850:21;21842:29;;21582:295;;;;:::o;21882:1395::-;21999:37;22032:3;21999:37;:::i;:::-;22101:18;22093:6;22090:30;22087:56;;;22123:18;;:::i;:::-;22087:56;22167:38;22199:4;22193:11;22167:38;:::i;:::-;22252:67;22312:6;22304;22298:4;22252:67;:::i;:::-;22346:1;22370:4;22357:17;;22402:2;22394:6;22391:14;22419:1;22414:618;;;;23076:1;23093:6;23090:77;;;23142:9;23137:3;23133:19;23127:26;23118:35;;23090:77;23193:67;23253:6;23246:5;23193:67;:::i;:::-;23187:4;23180:81;23049:222;22384:887;;22414:618;22466:4;22462:9;22454:6;22450:22;22500:37;22532:4;22500:37;:::i;:::-;22559:1;22573:208;22587:7;22584:1;22581:14;22573:208;;;22666:9;22661:3;22657:19;22651:26;22643:6;22636:42;22717:1;22709:6;22705:14;22695:24;;22764:2;22753:9;22749:18;22736:31;;22610:4;22607:1;22603:12;22598:17;;22573:208;;;22809:6;22800:7;22797:19;22794:179;;;22867:9;22862:3;22858:19;22852:26;22910:48;22952:4;22944:6;22940:17;22929:9;22910:48;:::i;:::-;22902:6;22895:64;22817:156;22794:179;23019:1;23015;23007:6;23003:14;22999:22;22993:4;22986:36;22421:611;;;22384:887;;21974:1303;;;21882:1395;;:::o;23283:180::-;23423:32;23419:1;23411:6;23407:14;23400:56;23283:180;:::o;23469:366::-;23611:3;23632:67;23696:2;23691:3;23632:67;:::i;:::-;23625:74;;23708:93;23797:3;23708:93;:::i;:::-;23826:2;23821:3;23817:12;23810:19;;23469:366;;;:::o;23841:419::-;24007:4;24045:2;24034:9;24030:18;24022:26;;24094:9;24088:4;24084:20;24080:1;24069:9;24065:17;24058:47;24122:131;24248:4;24122:131;:::i;:::-;24114:139;;23841:419;;;:::o;24266:194::-;24306:4;24326:20;24344:1;24326:20;:::i;:::-;24321:25;;24360:20;24378:1;24360:20;:::i;:::-;24355:25;;24404:1;24401;24397:9;24389:17;;24428:1;24422:4;24419:11;24416:37;;;24433:18;;:::i;:::-;24416:37;24266:194;;;;:::o;24466:348::-;24506:7;24529:20;24547:1;24529:20;:::i;:::-;24524:25;;24563:20;24581:1;24563:20;:::i;:::-;24558:25;;24751:1;24683:66;24679:74;24676:1;24673:81;24668:1;24661:9;24654:17;24650:105;24647:131;;;24758:18;;:::i;:::-;24647:131;24806:1;24803;24799:9;24788:20;;24466:348;;;;:::o;24820:169::-;24960:21;24956:1;24948:6;24944:14;24937:45;24820:169;:::o;24995:366::-;25137:3;25158:67;25222:2;25217:3;25158:67;:::i;:::-;25151:74;;25234:93;25323:3;25234:93;:::i;:::-;25352:2;25347:3;25343:12;25336:19;;24995:366;;;:::o;25367:419::-;25533:4;25571:2;25560:9;25556:18;25548:26;;25620:9;25614:4;25610:20;25606:1;25595:9;25591:17;25584:47;25648:131;25774:4;25648:131;:::i;:::-;25640:139;;25367:419;;;:::o;25792:167::-;25932:19;25928:1;25920:6;25916:14;25909:43;25792:167;:::o;25965:366::-;26107:3;26128:67;26192:2;26187:3;26128:67;:::i;:::-;26121:74;;26204:93;26293:3;26204:93;:::i;:::-;26322:2;26317:3;26313:12;26306:19;;25965:366;;;:::o;26337:419::-;26503:4;26541:2;26530:9;26526:18;26518:26;;26590:9;26584:4;26580:20;26576:1;26565:9;26561:17;26554:47;26618:131;26744:4;26618:131;:::i;:::-;26610:139;;26337:419;;;:::o;26762:236::-;26902:34;26898:1;26890:6;26886:14;26879:58;26971:19;26966:2;26958:6;26954:15;26947:44;26762:236;:::o;27004:366::-;27146:3;27167:67;27231:2;27226:3;27167:67;:::i;:::-;27160:74;;27243:93;27332:3;27243:93;:::i;:::-;27361:2;27356:3;27352:12;27345:19;;27004:366;;;:::o;27376:419::-;27542:4;27580:2;27569:9;27565:18;27557:26;;27629:9;27623:4;27619:20;27615:1;27604:9;27600:17;27593:47;27657:131;27783:4;27657:131;:::i;:::-;27649:139;;27376:419;;;:::o;27801:248::-;27941:34;27937:1;27929:6;27925:14;27918:58;28010:31;28005:2;27997:6;27993:15;27986:56;27801:248;:::o;28055:366::-;28197:3;28218:67;28282:2;28277:3;28218:67;:::i;:::-;28211:74;;28294:93;28383:3;28294:93;:::i;:::-;28412:2;28407:3;28403:12;28396:19;;28055:366;;;:::o;28427:419::-;28593:4;28631:2;28620:9;28616:18;28608:26;;28680:9;28674:4;28670:20;28666:1;28655:9;28651:17;28644:47;28708:131;28834:4;28708:131;:::i;:::-;28700:139;;28427:419;;;:::o;28852:220::-;28992:34;28988:1;28980:6;28976:14;28969:58;29061:3;29056:2;29048:6;29044:15;29037:28;28852:220;:::o;29078:366::-;29220:3;29241:67;29305:2;29300:3;29241:67;:::i;:::-;29234:74;;29317:93;29406:3;29317:93;:::i;:::-;29435:2;29430:3;29426:12;29419:19;;29078:366;;;:::o;29450:419::-;29616:4;29654:2;29643:9;29639:18;29631:26;;29703:9;29697:4;29693:20;29689:1;29678:9;29674:17;29667:47;29731:131;29857:4;29731:131;:::i;:::-;29723:139;;29450:419;;;:::o;29875:148::-;29977:11;30014:3;29999:18;;29875:148;;;;:::o;30053:874::-;30156:3;30193:5;30187:12;30222:36;30248:9;30222:36;:::i;:::-;30274:89;30356:6;30351:3;30274:89;:::i;:::-;30267:96;;30394:1;30383:9;30379:17;30410:1;30405:166;;;;30585:1;30580:341;;;;30372:549;;30405:166;30489:4;30485:9;30474;30470:25;30465:3;30458:38;30551:6;30544:14;30537:22;30529:6;30525:35;30520:3;30516:45;30509:52;;30405:166;;30580:341;30647:38;30679:5;30647:38;:::i;:::-;30707:1;30721:154;30735:6;30732:1;30729:13;30721:154;;;30809:7;30803:14;30799:1;30794:3;30790:11;30783:35;30859:1;30850:7;30846:15;30835:26;;30757:4;30754:1;30750:12;30745:17;;30721:154;;;30904:6;30899:3;30895:16;30888:23;;30587:334;;30372:549;;30160:767;;30053:874;;;;:::o;30933:390::-;31039:3;31067:39;31100:5;31067:39;:::i;:::-;31122:89;31204:6;31199:3;31122:89;:::i;:::-;31115:96;;31220:65;31278:6;31273:3;31266:4;31259:5;31255:16;31220:65;:::i;:::-;31310:6;31305:3;31301:16;31294:23;;31043:280;30933:390;;;;:::o;31329:429::-;31506:3;31528:92;31616:3;31607:6;31528:92;:::i;:::-;31521:99;;31637:95;31728:3;31719:6;31637:95;:::i;:::-;31630:102;;31749:3;31742:10;;31329:429;;;;;:::o;31764:225::-;31904:34;31900:1;31892:6;31888:14;31881:58;31973:8;31968:2;31960:6;31956:15;31949:33;31764:225;:::o;31995:366::-;32137:3;32158:67;32222:2;32217:3;32158:67;:::i;:::-;32151:74;;32234:93;32323:3;32234:93;:::i;:::-;32352:2;32347:3;32343:12;32336:19;;31995:366;;;:::o;32367:419::-;32533:4;32571:2;32560:9;32556:18;32548:26;;32620:9;32614:4;32610:20;32606:1;32595:9;32591:17;32584:47;32648:131;32774:4;32648:131;:::i;:::-;32640:139;;32367:419;;;:::o;32792:182::-;32932:34;32928:1;32920:6;32916:14;32909:58;32792:182;:::o;32980:366::-;33122:3;33143:67;33207:2;33202:3;33143:67;:::i;:::-;33136:74;;33219:93;33308:3;33219:93;:::i;:::-;33337:2;33332:3;33328:12;33321:19;;32980:366;;;:::o;33352:419::-;33518:4;33556:2;33545:9;33541:18;33533:26;;33605:9;33599:4;33595:20;33591:1;33580:9;33576:17;33569:47;33633:131;33759:4;33633:131;:::i;:::-;33625:139;;33352:419;;;:::o;33777:233::-;33816:3;33839:24;33857:5;33839:24;:::i;:::-;33830:33;;33885:66;33878:5;33875:77;33872:103;;33955:18;;:::i;:::-;33872:103;34002:1;33995:5;33991:13;33984:20;;33777:233;;;:::o;34016:180::-;34064:77;34061:1;34054:88;34161:4;34158:1;34151:15;34185:4;34182:1;34175:15;34202:185;34242:1;34259:20;34277:1;34259:20;:::i;:::-;34254:25;;34293:20;34311:1;34293:20;:::i;:::-;34288:25;;34332:1;34322:35;;34337:18;;:::i;:::-;34322:35;34379:1;34376;34372:9;34367:14;;34202:185;;;;:::o;34393:176::-;34425:1;34442:20;34460:1;34442:20;:::i;:::-;34437:25;;34476:20;34494:1;34476:20;:::i;:::-;34471:25;;34515:1;34505:35;;34520:18;;:::i;:::-;34505:35;34561:1;34558;34554:9;34549:14;;34393:176;;;;:::o;34575:180::-;34623:77;34620:1;34613:88;34720:4;34717:1;34710:15;34744:4;34741:1;34734:15;34761:98;34812:6;34846:5;34840:12;34830:22;;34761:98;;;:::o;34865:168::-;34948:11;34982:6;34977:3;34970:19;35022:4;35017:3;35013:14;34998:29;;34865:168;;;;:::o;35039:373::-;35125:3;35153:38;35185:5;35153:38;:::i;:::-;35207:70;35270:6;35265:3;35207:70;:::i;:::-;35200:77;;35286:65;35344:6;35339:3;35332:4;35325:5;35321:16;35286:65;:::i;:::-;35376:29;35398:6;35376:29;:::i;:::-;35371:3;35367:39;35360:46;;35129:283;35039:373;;;;:::o;35418:640::-;35613:4;35651:3;35640:9;35636:19;35628:27;;35665:71;35733:1;35722:9;35718:17;35709:6;35665:71;:::i;:::-;35746:72;35814:2;35803:9;35799:18;35790:6;35746:72;:::i;:::-;35828;35896:2;35885:9;35881:18;35872:6;35828:72;:::i;:::-;35947:9;35941:4;35937:20;35932:2;35921:9;35917:18;35910:48;35975:76;36046:4;36037:6;35975:76;:::i;:::-;35967:84;;35418:640;;;;;;;:::o;36064:141::-;36120:5;36151:6;36145:13;36136:22;;36167:32;36193:5;36167:32;:::i;:::-;36064:141;;;;:::o;36211:349::-;36280:6;36329:2;36317:9;36308:7;36304:23;36300:32;36297:119;;;36335:79;;:::i;:::-;36297:119;36455:1;36480:63;36535:7;36526:6;36515:9;36511:22;36480:63;:::i;:::-;36470:73;;36426:127;36211:349;;;;:::o

Swarm Source

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