ETH Price: $3,389.71 (-2.01%)
Gas: 5 Gwei

Token

OvoGen (OVOGEN)
 

Overview

Max Total Supply

263 OVOGEN

Holders

53

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
thephotograbbear.eth
Balance
5 OVOGEN
0x8c8b692ee84fc1370163151d53edf13529a296a5
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
OvoGen

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-21
*/

// SPDX-License-Identifier: MIT     

//
//
//  ██████  ██    ██  ██████   ██████  ███████ ███    ██ 
// ██    ██ ██    ██ ██    ██ ██       ██      ████   ██ 
// ██    ██ ██    ██ ██    ██ ██   ███ █████   ██ ██  ██ 
// ██    ██  ██  ██  ██    ██ ██    ██ ██      ██  ██ ██ 
//  ██████    ████    ██████   ██████  ███████ ██   ████ 
//                                                                                           
// Eggs rule the world!

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

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

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() {
        
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

            set._values.pop();

            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 OvoGen is Ownable, ERC721A, ReentrancyGuard, ERC721ABurnable, DefaultOperatorFilterer{
string public CONTRACT_URI = "";
mapping(address => uint) public userHasMinted;
bool public REVEALED;
string public UNREVEALED_URI = "";
string public BASE_URI = "";
bool public isPublicMintEnabled = false;
uint public COLLECTION_SIZE = 4444; 
uint public MINT_PRICE = 0.0025 ether; 
uint public MAX_BATCH_SIZE = 25;
uint public SUPPLY_PER_WALLET = 50;
uint public FREE_SUPPLY_PER_WALLET = 1;
constructor() ERC721A("OvoGen", "OVOGEN") {}


    function Claim(uint256 quantity, address receiver) public onlyOwner {
        require(
            totalSupply() + quantity <= COLLECTION_SIZE,
            "No more Eggs 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 MintEgg(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, "Eggs not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more Eggs left!");

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

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint Eggs over limit, retry with reduced quantity");
        require(msg.value >= price, "Must send more money!");

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - 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, "Mint not ready yet!");
        require(totalSupply() + quantity <= COLLECTION_SIZE, "No more tokens left!");

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

        require(quantity <= MAX_BATCH_SIZE, "Tried to mint tokens over limit, retry with reduced quantity");
        require(msg.value >= price, "Must send more money!");

        _safeMint(msg.sender, quantity);

        if (msg.value > price) {
            payable(msg.sender).transfer(msg.value - price);
        }
    }
    function setPublicMintEnabled() public onlyOwner {
        isPublicMintEnabled = !isPublicMintEnabled;
    }

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

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

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

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

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

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

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

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

    function SetMaxBatchSize(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":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeCollectionSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeFreePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"ChangePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"ChangeSupplyPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"}],"name":"Claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"CollectionUrI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"FREE_SUPPLY_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"MintEgg","outputs":[],"stateMutability":"payable","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":[{"internalType":"uint256","name":"_new","type":"uint256"}],"name":"SetMaxBatchSize","outputs":[],"stateMutability":"nonpayable","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":"string","name":"_contractURI","type":"string"}],"name":"setContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPublicMintEnabled","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"}]

608060405260405180602001604052806000815250600a9081620000249190620006df565b5060405180602001604052806000815250600d9081620000459190620006df565b5060405180602001604052806000815250600e9081620000669190620006df565b506000600f60006101000a81548160ff02191690831515021790555061115c6010556608e1bc9bf04000601155601960125560326013556001601455348015620000af57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600681526020017f4f766f47656e00000000000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f4f564f47454e000000000000000000000000000000000000000000000000000081525062000153620001476200039460201b60201c565b6200039c60201b60201c565b8160039081620001649190620006df565b508060049081620001769190620006df565b50620001876200046060201b60201c565b6001819055505050600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200038c57801562000252576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620002189291906200080b565b600060405180830381600087803b1580156200023357600080fd5b505af115801562000248573d6000803e3d6000fd5b505050506200038b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200030c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002d29291906200080b565b600060405180830381600087803b158015620002ed57600080fd5b505af115801562000302573d6000803e3d6000fd5b505050506200038a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000355919062000838565b600060405180830381600087803b1580156200037057600080fd5b505af115801562000385573d6000803e3d6000fd5b505050505b5b5b505062000855565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004e757607f821691505b602082108103620004fd57620004fc6200049f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620005677fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000528565b62000573868362000528565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005c0620005ba620005b4846200058b565b62000595565b6200058b565b9050919050565b6000819050919050565b620005dc836200059f565b620005f4620005eb82620005c7565b84845462000535565b825550505050565b600090565b6200060b620005fc565b62000618818484620005d1565b505050565b5b8181101562000640576200063460008262000601565b6001810190506200061e565b5050565b601f8211156200068f57620006598162000503565b620006648462000518565b8101602085101562000674578190505b6200068c620006838562000518565b8301826200061d565b50505b505050565b600082821c905092915050565b6000620006b46000198460080262000694565b1980831691505092915050565b6000620006cf8383620006a1565b9150826002028217905092915050565b620006ea8262000465565b67ffffffffffffffff81111562000706576200070562000470565b5b620007128254620004ce565b6200071f82828562000644565b600060209050601f83116001811462000757576000841562000742578287015190505b6200074e8582620006c1565b865550620007be565b601f198416620007678662000503565b60005b8281101562000791578489015182556001820191506020850194506020810190506200076a565b86831015620007b15784890151620007ad601f891682620006a1565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007f382620007c6565b9050919050565b6200080581620007e6565b82525050565b6000604082019050620008226000830185620007fa565b620008316020830184620007fa565b9392505050565b60006020820190506200084f6000830184620007fa565b92915050565b6146ad80620008656000396000f3fe60806040526004361061025c5760003560e01c80637304ff6c11610144578063c144a4ba116100b6578063e75722301161007a578063e75722301461085e578063e8a3d4851461089b578063e985e9c5146108c6578063f2fde38b14610903578063f814943d1461092c578063fb92488b146109555761025c565b8063c144a4ba14610777578063c87b56dd146107a0578063cfdbf254146107dd578063d8258d9514610808578063dbddb26a146108335761025c565b8063a1db246e11610108578063a1db246e1461069c578063a22cb465146106c5578063a4cdd719146106ee578063a76a958714610705578063b88d4fde14610730578063c002d23d1461074c5761025c565b80637304ff6c146105d857806375b64471146106015780638da5cb5b1461062a57806395d89b4114610655578063a0712d68146106805761025c565b806335538759116101dd57806356b48d63116101a157806356b48d63146104c857806356b4f673146104f15780635fe755871461051c5780636352211e1461054757806370a0823114610584578063715018a6146105c15761025c565b8063355387591461041357806342842e0e1461043c57806342966c6814610458578063507862d114610481578063552bfd38146104ac5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661097e565b604051610283919061310a565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613191565b610991565b6040516102c0919061310a565b60405180910390f35b3480156102d557600080fd5b506102de610a23565b6040516102eb919061324e565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906132a6565b610ab5565b6040516103289190613314565b60405180910390f35b61034b6004803603810190610346919061335b565b610b34565b005b34801561035957600080fd5b50610362610c78565b60405161036f91906133aa565b60405180910390f35b34801561038457600080fd5b5061038d610c7e565b60405161039a91906133aa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906133c5565b610c95565b6040516103d791906133aa565b60405180910390f35b6103fa60048036038101906103f591906133f2565b610cad565b005b34801561040857600080fd5b50610411610db9565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613445565b610ec5565b005b610456600480360381019061045191906133f2565b610f32565b005b34801561046457600080fd5b5061047f600480360381019061047a91906132a6565b61103e565b005b34801561048d57600080fd5b5061049661104c565b6040516104a3919061324e565b60405180910390f35b6104c660048036038101906104c191906132a6565b6110da565b005b3480156104d457600080fd5b506104ef60048036038101906104ea91906135ba565b611527565b005b3480156104fd57600080fd5b50610506611542565b604051610513919061324e565b60405180910390f35b34801561052857600080fd5b506105316115d0565b60405161053e91906133aa565b60405180910390f35b34801561055357600080fd5b5061056e600480360381019061056991906132a6565b6115d6565b60405161057b9190613314565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a691906133c5565b6115e8565b6040516105b891906133aa565b60405180910390f35b3480156105cd57600080fd5b506105d66116a0565b005b3480156105e457600080fd5b506105ff60048036038101906105fa919061362f565b6116b4565b005b34801561060d57600080fd5b50610628600480360381019061062391906132a6565b6116ea565b005b34801561063657600080fd5b5061063f6116fc565b60405161064c9190613314565b60405180910390f35b34801561066157600080fd5b5061066a611725565b604051610677919061324e565b60405180910390f35b61069a600480360381019061069591906132a6565b6117b7565b005b3480156106a857600080fd5b506106c360048036038101906106be91906132a6565b611c04565b005b3480156106d157600080fd5b506106ec60048036038101906106e7919061368b565b611c16565b005b3480156106fa57600080fd5b50610703611d21565b005b34801561071157600080fd5b5061071a611d55565b604051610727919061310a565b60405180910390f35b61074a6004803603810190610745919061376c565b611d68565b005b34801561075857600080fd5b50610761611e76565b60405161076e91906133aa565b60405180910390f35b34801561078357600080fd5b5061079e600480360381019061079991906132a6565b611e7c565b005b3480156107ac57600080fd5b506107c760048036038101906107c291906132a6565b611e8e565b6040516107d4919061324e565b60405180910390f35b3480156107e957600080fd5b506107f2611f6a565b6040516107ff91906133aa565b60405180910390f35b34801561081457600080fd5b5061081d611f70565b60405161082a91906133aa565b60405180910390f35b34801561083f57600080fd5b50610848611f76565b604051610855919061324e565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906132a6565b612004565b60405161089291906133aa565b60405180910390f35b3480156108a757600080fd5b506108b061208e565b6040516108bd919061324e565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906137ef565b612120565b6040516108fa919061310a565b60405180910390f35b34801561090f57600080fd5b5061092a600480360381019061092591906133c5565b6121b4565b005b34801561093857600080fd5b50610953600480360381019061094e91906132a6565b612237565b005b34801561096157600080fd5b5061097c600480360381019061097791906132a6565b612249565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a329061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e9061385e565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac08261225b565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3f826115d6565b90508073ffffffffffffffffffffffffffffffffffffffff16610b606122ba565b73ffffffffffffffffffffffffffffffffffffffff1614610bc357610b8c81610b876122ba565b612120565b610bc2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c886122c2565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610da9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d2492919061388f565b6020604051808303816000875af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6791906138cd565b610da857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d9f9190613314565b60405180910390fd5b5b610db48383836122c7565b505050565b610dc16125e9565b600260095403610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613946565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e3490613997565b60006040518083038185875af1925050503d8060008114610e71576040519150601f19603f3d011682016040523d82523d6000602084013e610e76565b606091505b5050905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb1906139f8565b60405180910390fd5b506001600981905550565b610ecd6125e9565b60105482610ed9610c7e565b610ee39190613a47565b1115610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613ac7565b60405180910390fd5b610f2e8183612667565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561102e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fa992919061388f565b6020604051808303816000875af1158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec91906138cd565b61102d57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110249190613314565b60405180910390fd5b5b611039838383612685565b505050565b6110498160016126a5565b50565b600d80546110599061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546110859061385e565b80156110d25780601f106110a7576101008083540402835291602001916110d2565b820191906000526020600020905b8154815290600101906020018083116110b557829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613b33565b60405180910390fd5b60026009540361118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546111e59190613b53565b905080831061129c5780836111fa9190613b53565b6011546112079190613b87565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112549190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061132f565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112eb9190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff1661137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590613c15565b60405180910390fd5b6010548361138a610c7e565b6113949190613a47565b11156113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc90613c81565b60405180910390fd5b601354836113e2336115e8565b6113ec9190613a47565b111561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490613d13565b60405180910390fd5b601254831115611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613da5565b60405180910390fd5b813410156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613e11565b60405180910390fd5b6114bf3384612667565b8134111561151a573373ffffffffffffffffffffffffffffffffffffffff166108fc83346114ed9190613b53565b9081150290604051600060405180830381858888f19350505050158015611518573d6000803e3d6000fd5b505b5050600160098190555050565b61152f6125e9565b80600a908161153e9190613fdd565b5050565b600a805461154f9061385e565b80601f016020809104026020016040519081016040528092919081815260200182805461157b9061385e565b80156115c85780601f1061159d576101008083540402835291602001916115c8565b820191906000526020600020905b8154815290600101906020018083116115ab57829003601f168201915b505050505081565b60135481565b60006115e1826128f7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361164f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116a86125e9565b6116b260006129c3565b565b6116bc6125e9565b80600e90816116cb9190613fdd565b5081600c60006101000a81548160ff0219169083151502179055505050565b6116f26125e9565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117349061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546117609061385e565b80156117ad5780601f10611782576101008083540402835291602001916117ad565b820191906000526020600020905b81548152906001019060200180831161179057829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613b33565b60405180910390fd5b60026009540361186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186190613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546118c29190613b53565b90508083106119795780836118d79190613b53565b6011546118e49190613b87565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119319190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0c565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119c89190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a52906140fb565b60405180910390fd5b60105483611a67610c7e565b611a719190613a47565b1115611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990614167565b60405180910390fd5b60135483611abf336115e8565b611ac99190613a47565b1115611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b01906141f9565b60405180910390fd5b601254831115611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b469061428b565b60405180910390fd5b81341015611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990613e11565b60405180910390fd5b611b9c3384612667565b81341115611bf7573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611bca9190613b53565b9081150290604051600060405180830381858888f19350505050158015611bf5573d6000803e3d6000fd5b505b5050600160098190555050565b611c0c6125e9565b8060148190555050565b8060086000611c236122ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cd06122ba565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d15919061310a565b60405180910390a35050565b611d296125e9565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e64576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611ddf92919061388f565b6020604051808303816000875af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906138cd565b611e6357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e5a9190613314565b60405180910390fd5b5b611e7084848484612a87565b50505050565b60115481565b611e846125e9565b8060128190555050565b6060600c60009054906101000a900460ff1615611ed757600e611eb083612afa565b604051602001611ec192919061436a565b6040516020818303038152906040529050611f65565b600d8054611ee49061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f109061385e565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611f839061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611faf9061385e565b8015611ffc5780601f10611fd157610100808354040283529160200191611ffc565b820191906000526020600020905b815481529060010190602001808311611fdf57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546120569190613b53565b905080841061207f57808461206b9190613b53565b6011546120789190613b87565b9150612084565b600091505b8192505050919050565b6060600a805461209d9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546120c99061385e565b80156121165780601f106120eb57610100808354040283529160200191612116565b820191906000526020600020905b8154815290600101906020018083116120f957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121bc6125e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614400565b60405180910390fd5b612234816129c3565b50565b61223f6125e9565b8060138190555050565b6122516125e9565b8060118190555050565b6000816122666122c2565b11158015612275575060015482105b80156122b3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006122d2826128f7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612339576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061234584612c5a565b9150915061235b81876123566122ba565b612c81565b6123a7576123708661236b6122ba565b612120565b6123a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361240d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61241a8686866001612cc5565b801561242557600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124f3856124cf888887612ccb565b7c020000000000000000000000000000000000000000000000000000000017612cf3565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125795760006001850190506000600560008381526020019081526020016000205403612577576001548114612576578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125e18686866001612d1e565b505050505050565b6125f1612d24565b73ffffffffffffffffffffffffffffffffffffffff1661260f6116fc565b73ffffffffffffffffffffffffffffffffffffffff1614612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c9061446c565b60405180910390fd5b565b612681828260405180602001604052806000815250612d2c565b5050565b6126a083838360405180602001604052806000815250611d68565b505050565b60006126b0836128f7565b905060008190506000806126c386612c5a565b91509150841561272c576126df81846126da6122ba565b612c81565b61272b576126f4836126ef6122ba565b612120565b61272a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61273a836000886001612cc5565b801561274557600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127ed836127aa85600088612ccb565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612cf3565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128735760006001870190506000600560008381526020019081526020016000205403612871576001548114612870578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128dd836000886001612d1e565b600260008154809291906001019190505550505050505050565b600080829050806129066122c2565b1161298c5760015481101561298b5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612989575b6000810361297f576005600083600190039350838152602001908152602001600020549050612955565b80925050506129be565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a92848484610cad565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612af457612abd84848484612dca565b612af3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c55565b600082905060005b60008214612b73578080612b5c9061448c565b915050600a82612b6c9190614503565b9150612b49565b60008167ffffffffffffffff811115612b8f57612b8e61348f565b5b6040519080825280601f01601f191660200182016040528015612bc15781602001600182028036833780820191505090505b5090505b60008514612c4e57600182612bda9190613b53565b9150600a85612be99190614534565b6030612bf59190613a47565b60f81b818381518110612c0b57612c0a614565565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c479190614503565b9450612bc5565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612ce2868684612f1a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612d368383612f23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612dc55760006001549050600083820390505b612d776000868380600101945086612dca565b612dad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d64578160015414612dc257600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df06122ba565b8786866040518563ffffffff1660e01b8152600401612e1294939291906145e9565b6020604051808303816000875af1925050508015612e4e57506040513d601f19601f82011682018060405250810190612e4b919061464a565b60015b612ec7573d8060008114612e7e576040519150601f19603f3d011682016040523d82523d6000602084013e612e83565b606091505b506000815103612ebf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612f64576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f716000848385612cc5565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fe883612fd96000866000612ccb565b612fe2856130df565b17612cf3565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461308957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061304e565b50600082036130c4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506130da6000848385612d1e565b505050565b60006001821460e11b9050919050565b60008115159050919050565b613104816130ef565b82525050565b600060208201905061311f60008301846130fb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61316e81613139565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a661312f565b5b60006131b58482850161317c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb61312f565b5b60006132ca84828501613291565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132fe826132d3565b9050919050565b61330e816132f3565b82525050565b60006020820190506133296000830184613305565b92915050565b613338816132f3565b811461334357600080fd5b50565b6000813590506133558161332f565b92915050565b600080604083850312156133725761337161312f565b5b600061338085828601613346565b925050602061339185828601613291565b9150509250929050565b6133a481613270565b82525050565b60006020820190506133bf600083018461339b565b92915050565b6000602082840312156133db576133da61312f565b5b60006133e984828501613346565b91505092915050565b60008060006060848603121561340b5761340a61312f565b5b600061341986828701613346565b935050602061342a86828701613346565b925050604061343b86828701613291565b9150509250925092565b6000806040838503121561345c5761345b61312f565b5b600061346a85828601613291565b925050602061347b85828601613346565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134c782613204565b810181811067ffffffffffffffff821117156134e6576134e561348f565b5b80604052505050565b60006134f9613125565b905061350582826134be565b919050565b600067ffffffffffffffff8211156135255761352461348f565b5b61352e82613204565b9050602081019050919050565b82818337600083830152505050565b600061355d6135588461350a565b6134ef565b9050828152602081018484840111156135795761357861348a565b5b61358484828561353b565b509392505050565b600082601f8301126135a1576135a0613485565b5b81356135b184826020860161354a565b91505092915050565b6000602082840312156135d0576135cf61312f565b5b600082013567ffffffffffffffff8111156135ee576135ed613134565b5b6135fa8482850161358c565b91505092915050565b61360c816130ef565b811461361757600080fd5b50565b60008135905061362981613603565b92915050565b600080604083850312156136465761364561312f565b5b60006136548582860161361a565b925050602083013567ffffffffffffffff81111561367557613674613134565b5b6136818582860161358c565b9150509250929050565b600080604083850312156136a2576136a161312f565b5b60006136b085828601613346565b92505060206136c18582860161361a565b9150509250929050565b600067ffffffffffffffff8211156136e6576136e561348f565b5b6136ef82613204565b9050602081019050919050565b600061370f61370a846136cb565b6134ef565b90508281526020810184848401111561372b5761372a61348a565b5b61373684828561353b565b509392505050565b600082601f83011261375357613752613485565b5b81356137638482602086016136fc565b91505092915050565b600080600080608085870312156137865761378561312f565b5b600061379487828801613346565b94505060206137a587828801613346565b93505060406137b687828801613291565b925050606085013567ffffffffffffffff8111156137d7576137d6613134565b5b6137e38782880161373e565b91505092959194509250565b600080604083850312156138065761380561312f565b5b600061381485828601613346565b925050602061382585828601613346565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081036138895761388861382f565b5b50919050565b60006040820190506138a46000830185613305565b6138b16020830184613305565b9392505050565b6000815190506138c781613603565b92915050565b6000602082840312156138e3576138e261312f565b5b60006138f1848285016138b8565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613930601f836131c9565b915061393b826138fa565b602082019050919050565b6000602082019050818103600083015261395f81613923565b9050919050565b600081905092915050565b50565b6000613981600083613966565b915061398c82613971565b600082019050919050565b60006139a282613974565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006139e26010836131c9565b91506139ed826139ac565b602082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a5282613270565b9150613a5d83613270565b9250828201905080821115613a7557613a74613a18565b5b92915050565b7f4e6f206d6f7265204567677320696e2073746f636b2100000000000000000000600082015250565b6000613ab16016836131c9565b9150613abc82613a7b565b602082019050919050565b60006020820190508181036000830152613ae081613aa4565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613b1d601e836131c9565b9150613b2882613ae7565b602082019050919050565b60006020820190508181036000830152613b4c81613b10565b9050919050565b6000613b5e82613270565b9150613b6983613270565b9250828203905081811115613b8157613b80613a18565b5b92915050565b6000613b9282613270565b9150613b9d83613270565b9250828202613bab81613270565b91508282048414831517613bc257613bc1613a18565b5b5092915050565b7f45676773206e6f74207265616479207965742100000000000000000000000000600082015250565b6000613bff6013836131c9565b9150613c0a82613bc9565b602082019050919050565b60006020820190508181036000830152613c2e81613bf2565b9050919050565b7f4e6f206d6f72652045676773206c656674210000000000000000000000000000600082015250565b6000613c6b6012836131c9565b9150613c7682613c35565b602082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f547269656420746f206d696e742045676773206f766572206f766572206c696d60008201527f6974000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cfd6022836131c9565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b9050919050565b7f547269656420746f206d696e742045676773206f766572206c696d69742c207260008201527f6574727920776974682072656475636564207175616e74697479000000000000602082015250565b6000613d8f603a836131c9565b9150613d9a82613d33565b604082019050919050565b60006020820190508181036000830152613dbe81613d82565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613dfb6015836131c9565b9150613e0682613dc5565b602082019050919050565b60006020820190508181036000830152613e2a81613dee565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e56565b613e9d8683613e56565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613eda613ed5613ed084613270565b613eb5565b613270565b9050919050565b6000819050919050565b613ef483613ebf565b613f08613f0082613ee1565b848454613e63565b825550505050565b600090565b613f1d613f10565b613f28818484613eeb565b505050565b5b81811015613f4c57613f41600082613f15565b600181019050613f2e565b5050565b601f821115613f9157613f6281613e31565b613f6b84613e46565b81016020851015613f7a578190505b613f8e613f8685613e46565b830182613f2d565b50505b505050565b600082821c905092915050565b6000613fb460001984600802613f96565b1980831691505092915050565b6000613fcd8383613fa3565b9150826002028217905092915050565b613fe6826131be565b67ffffffffffffffff811115613fff57613ffe61348f565b5b614009825461385e565b614014828285613f50565b600060209050601f8311600181146140475760008415614035578287015190505b61403f8582613fc1565b8655506140a7565b601f19841661405586613e31565b60005b8281101561407d57848901518255600182019150602085019450602081019050614058565b8683101561409a5784890151614096601f891682613fa3565b8355505b6001600288020188555050505b505050505050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006140e56013836131c9565b91506140f0826140af565b602082019050919050565b60006020820190508181036000830152614114816140d8565b9050919050565b7f4e6f206d6f726520746f6b656e73206c65667421000000000000000000000000600082015250565b60006141516014836131c9565b915061415c8261411b565b602082019050919050565b6000602082019050818103600083015261418081614144565b9050919050565b7f547269656420746f206d696e7420746f6b656e73206f766572206f766572206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b60006141e36024836131c9565b91506141ee82614187565b604082019050919050565b60006020820190508181036000830152614212816141d6565b9050919050565b7f547269656420746f206d696e7420746f6b656e73206f766572206c696d69742c60008201527f20726574727920776974682072656475636564207175616e7469747900000000602082015250565b6000614275603c836131c9565b915061428082614219565b604082019050919050565b600060208201905081810360008301526142a481614268565b9050919050565b600081905092915050565b600081546142c38161385e565b6142cd81866142ab565b945060018216600081146142e857600181146142fd57614330565b60ff1983168652811515820286019350614330565b61430685613e31565b60005b8381101561432857815481890152600182019150602081019050614309565b838801955050505b50505092915050565b6000614344826131be565b61434e81856142ab565b935061435e8185602086016131da565b80840191505092915050565b600061437682856142b6565b91506143828284614339565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143ea6026836131c9565b91506143f58261438e565b604082019050919050565b60006020820190508181036000830152614419816143dd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144566020836131c9565b915061446182614420565b602082019050919050565b6000602082019050818103600083015261448581614449565b9050919050565b600061449782613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144c9576144c8613a18565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061450e82613270565b915061451983613270565b925082614529576145286144d4565b5b828204905092915050565b600061453f82613270565b915061454a83613270565b92508261455a576145596144d4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006145bb82614594565b6145c5818561459f565b93506145d58185602086016131da565b6145de81613204565b840191505092915050565b60006080820190506145fe6000830187613305565b61460b6020830186613305565b614618604083018561339b565b818103606083015261462a81846145b0565b905095945050505050565b60008151905061464481613165565b92915050565b6000602082840312156146605761465f61312f565b5b600061466e84828501614635565b9150509291505056fea2646970667358221220dae6fd7f02f953d672e4683089ebdb54f1cd8a779e6217e9020a198032484df064736f6c63430008120033

Deployed Bytecode

0x60806040526004361061025c5760003560e01c80637304ff6c11610144578063c144a4ba116100b6578063e75722301161007a578063e75722301461085e578063e8a3d4851461089b578063e985e9c5146108c6578063f2fde38b14610903578063f814943d1461092c578063fb92488b146109555761025c565b8063c144a4ba14610777578063c87b56dd146107a0578063cfdbf254146107dd578063d8258d9514610808578063dbddb26a146108335761025c565b8063a1db246e11610108578063a1db246e1461069c578063a22cb465146106c5578063a4cdd719146106ee578063a76a958714610705578063b88d4fde14610730578063c002d23d1461074c5761025c565b80637304ff6c146105d857806375b64471146106015780638da5cb5b1461062a57806395d89b4114610655578063a0712d68146106805761025c565b806335538759116101dd57806356b48d63116101a157806356b48d63146104c857806356b4f673146104f15780635fe755871461051c5780636352211e1461054757806370a0823114610584578063715018a6146105c15761025c565b8063355387591461041357806342842e0e1461043c57806342966c6814610458578063507862d114610481578063552bfd38146104ac5761025c565b80631422374f116102245780631422374f1461034d57806318160ddd146103785780631d985778146103a357806323b872dd146103e057806324600fc3146103fc5761025c565b80630116bc2d1461026157806301ffc9a71461028c57806306fdde03146102c9578063081812fc146102f4578063095ea7b314610331575b600080fd5b34801561026d57600080fd5b5061027661097e565b604051610283919061310a565b60405180910390f35b34801561029857600080fd5b506102b360048036038101906102ae9190613191565b610991565b6040516102c0919061310a565b60405180910390f35b3480156102d557600080fd5b506102de610a23565b6040516102eb919061324e565b60405180910390f35b34801561030057600080fd5b5061031b600480360381019061031691906132a6565b610ab5565b6040516103289190613314565b60405180910390f35b61034b6004803603810190610346919061335b565b610b34565b005b34801561035957600080fd5b50610362610c78565b60405161036f91906133aa565b60405180910390f35b34801561038457600080fd5b5061038d610c7e565b60405161039a91906133aa565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c591906133c5565b610c95565b6040516103d791906133aa565b60405180910390f35b6103fa60048036038101906103f591906133f2565b610cad565b005b34801561040857600080fd5b50610411610db9565b005b34801561041f57600080fd5b5061043a60048036038101906104359190613445565b610ec5565b005b610456600480360381019061045191906133f2565b610f32565b005b34801561046457600080fd5b5061047f600480360381019061047a91906132a6565b61103e565b005b34801561048d57600080fd5b5061049661104c565b6040516104a3919061324e565b60405180910390f35b6104c660048036038101906104c191906132a6565b6110da565b005b3480156104d457600080fd5b506104ef60048036038101906104ea91906135ba565b611527565b005b3480156104fd57600080fd5b50610506611542565b604051610513919061324e565b60405180910390f35b34801561052857600080fd5b506105316115d0565b60405161053e91906133aa565b60405180910390f35b34801561055357600080fd5b5061056e600480360381019061056991906132a6565b6115d6565b60405161057b9190613314565b60405180910390f35b34801561059057600080fd5b506105ab60048036038101906105a691906133c5565b6115e8565b6040516105b891906133aa565b60405180910390f35b3480156105cd57600080fd5b506105d66116a0565b005b3480156105e457600080fd5b506105ff60048036038101906105fa919061362f565b6116b4565b005b34801561060d57600080fd5b50610628600480360381019061062391906132a6565b6116ea565b005b34801561063657600080fd5b5061063f6116fc565b60405161064c9190613314565b60405180910390f35b34801561066157600080fd5b5061066a611725565b604051610677919061324e565b60405180910390f35b61069a600480360381019061069591906132a6565b6117b7565b005b3480156106a857600080fd5b506106c360048036038101906106be91906132a6565b611c04565b005b3480156106d157600080fd5b506106ec60048036038101906106e7919061368b565b611c16565b005b3480156106fa57600080fd5b50610703611d21565b005b34801561071157600080fd5b5061071a611d55565b604051610727919061310a565b60405180910390f35b61074a6004803603810190610745919061376c565b611d68565b005b34801561075857600080fd5b50610761611e76565b60405161076e91906133aa565b60405180910390f35b34801561078357600080fd5b5061079e600480360381019061079991906132a6565b611e7c565b005b3480156107ac57600080fd5b506107c760048036038101906107c291906132a6565b611e8e565b6040516107d4919061324e565b60405180910390f35b3480156107e957600080fd5b506107f2611f6a565b6040516107ff91906133aa565b60405180910390f35b34801561081457600080fd5b5061081d611f70565b60405161082a91906133aa565b60405180910390f35b34801561083f57600080fd5b50610848611f76565b604051610855919061324e565b60405180910390f35b34801561086a57600080fd5b50610885600480360381019061088091906132a6565b612004565b60405161089291906133aa565b60405180910390f35b3480156108a757600080fd5b506108b061208e565b6040516108bd919061324e565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906137ef565b612120565b6040516108fa919061310a565b60405180910390f35b34801561090f57600080fd5b5061092a600480360381019061092591906133c5565b6121b4565b005b34801561093857600080fd5b50610953600480360381019061094e91906132a6565b612237565b005b34801561096157600080fd5b5061097c600480360381019061097791906132a6565b612249565b005b600f60009054906101000a900460ff1681565b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109ec57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a1c5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060038054610a329061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5e9061385e565b8015610aab5780601f10610a8057610100808354040283529160200191610aab565b820191906000526020600020905b815481529060010190602001808311610a8e57829003601f168201915b5050505050905090565b6000610ac08261225b565b610af6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3f826115d6565b90508073ffffffffffffffffffffffffffffffffffffffff16610b606122ba565b73ffffffffffffffffffffffffffffffffffffffff1614610bc357610b8c81610b876122ba565b612120565b610bc2576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60145481565b6000610c886122c2565b6002546001540303905090565b600b6020528060005260406000206000915090505481565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610da9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d2492919061388f565b6020604051808303816000875af1158015610d43573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6791906138cd565b610da857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d9f9190613314565b60405180910390fd5b5b610db48383836122c7565b505050565b610dc16125e9565b600260095403610e06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfd90613946565b60405180910390fd5b600260098190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610e3490613997565b60006040518083038185875af1925050503d8060008114610e71576040519150601f19603f3d011682016040523d82523d6000602084013e610e76565b606091505b5050905080610eba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb1906139f8565b60405180910390fd5b506001600981905550565b610ecd6125e9565b60105482610ed9610c7e565b610ee39190613a47565b1115610f24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1b90613ac7565b60405180910390fd5b610f2e8183612667565b5050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b111561102e576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fa992919061388f565b6020604051808303816000875af1158015610fc8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fec91906138cd565b61102d57336040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016110249190613314565b60405180910390fd5b5b611039838383612685565b505050565b6110498160016126a5565b50565b600d80546110599061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546110859061385e565b80156110d25780601f106110a7576101008083540402835291602001916110d2565b820191906000526020600020905b8154815290600101906020018083116110b557829003601f168201915b505050505081565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f90613b33565b60405180910390fd5b60026009540361118d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118490613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546111e59190613b53565b905080831061129c5780836111fa9190613b53565b6011546112079190613b87565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112549190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061132f565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546112eb9190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff1661137e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137590613c15565b60405180910390fd5b6010548361138a610c7e565b6113949190613a47565b11156113d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113cc90613c81565b60405180910390fd5b601354836113e2336115e8565b6113ec9190613a47565b111561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490613d13565b60405180910390fd5b601254831115611472576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146990613da5565b60405180910390fd5b813410156114b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ac90613e11565b60405180910390fd5b6114bf3384612667565b8134111561151a573373ffffffffffffffffffffffffffffffffffffffff166108fc83346114ed9190613b53565b9081150290604051600060405180830381858888f19350505050158015611518573d6000803e3d6000fd5b505b5050600160098190555050565b61152f6125e9565b80600a908161153e9190613fdd565b5050565b600a805461154f9061385e565b80601f016020809104026020016040519081016040528092919081815260200182805461157b9061385e565b80156115c85780601f1061159d576101008083540402835291602001916115c8565b820191906000526020600020905b8154815290600101906020018083116115ab57829003601f168201915b505050505081565b60135481565b60006115e1826128f7565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361164f576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6116a86125e9565b6116b260006129c3565b565b6116bc6125e9565b80600e90816116cb9190613fdd565b5081600c60006101000a81548160ff0219169083151502179055505050565b6116f26125e9565b8060108190555050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600480546117349061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546117609061385e565b80156117ad5780601f10611782576101008083540402835291602001916117ad565b820191906000526020600020905b81548152906001019060200180831161179057829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90613b33565b60405180910390fd5b60026009540361186a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161186190613946565b60405180910390fd5b6002600981905550600080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546118c29190613b53565b90508083106119795780836118d79190613b53565b6011546118e49190613b87565b915080600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119319190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611a0c565b6000915082600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546119c89190613a47565b600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b600f60009054906101000a900460ff16611a5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a52906140fb565b60405180910390fd5b60105483611a67610c7e565b611a719190613a47565b1115611ab2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aa990614167565b60405180910390fd5b60135483611abf336115e8565b611ac99190613a47565b1115611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b01906141f9565b60405180910390fd5b601254831115611b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b469061428b565b60405180910390fd5b81341015611b92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8990613e11565b60405180910390fd5b611b9c3384612667565b81341115611bf7573373ffffffffffffffffffffffffffffffffffffffff166108fc8334611bca9190613b53565b9081150290604051600060405180830381858888f19350505050158015611bf5573d6000803e3d6000fd5b505b5050600160098190555050565b611c0c6125e9565b8060148190555050565b8060086000611c236122ba565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611cd06122ba565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611d15919061310a565b60405180910390a35050565b611d296125e9565b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600c60009054906101000a900460ff1681565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e64576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611ddf92919061388f565b6020604051808303816000875af1158015611dfe573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e2291906138cd565b611e6357336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e5a9190613314565b60405180910390fd5b5b611e7084848484612a87565b50505050565b60115481565b611e846125e9565b8060128190555050565b6060600c60009054906101000a900460ff1615611ed757600e611eb083612afa565b604051602001611ec192919061436a565b6040516020818303038152906040529050611f65565b600d8054611ee49061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611f109061385e565b8015611f5d5780601f10611f3257610100808354040283529160200191611f5d565b820191906000526020600020905b815481529060010190602001808311611f4057829003601f168201915b505050505090505b919050565b60125481565b60105481565b600e8054611f839061385e565b80601f0160208091040260200160405190810160405280929190818152602001828054611faf9061385e565b8015611ffc5780601f10611fd157610100808354040283529160200191611ffc565b820191906000526020600020905b815481529060010190602001808311611fdf57829003601f168201915b505050505081565b6000806000600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546014546120569190613b53565b905080841061207f57808461206b9190613b53565b6011546120789190613b87565b9150612084565b600091505b8192505050919050565b6060600a805461209d9061385e565b80601f01602080910402602001604051908101604052809291908181526020018280546120c99061385e565b80156121165780601f106120eb57610100808354040283529160200191612116565b820191906000526020600020905b8154815290600101906020018083116120f957829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6121bc6125e9565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361222b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161222290614400565b60405180910390fd5b612234816129c3565b50565b61223f6125e9565b8060138190555050565b6122516125e9565b8060118190555050565b6000816122666122c2565b11158015612275575060015482105b80156122b3575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b60006122d2826128f7565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612339576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061234584612c5a565b9150915061235b81876123566122ba565b612c81565b6123a7576123708661236b6122ba565b612120565b6123a6576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361240d576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61241a8686866001612cc5565b801561242557600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124f3856124cf888887612ccb565b7c020000000000000000000000000000000000000000000000000000000017612cf3565b600560008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125795760006001850190506000600560008381526020019081526020016000205403612577576001548114612576578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125e18686866001612d1e565b505050505050565b6125f1612d24565b73ffffffffffffffffffffffffffffffffffffffff1661260f6116fc565b73ffffffffffffffffffffffffffffffffffffffff1614612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c9061446c565b60405180910390fd5b565b612681828260405180602001604052806000815250612d2c565b5050565b6126a083838360405180602001604052806000815250611d68565b505050565b60006126b0836128f7565b905060008190506000806126c386612c5a565b91509150841561272c576126df81846126da6122ba565b612c81565b61272b576126f4836126ef6122ba565b612120565b61272a576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b61273a836000886001612cc5565b801561274557600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127ed836127aa85600088612ccb565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717612cf3565b600560008881526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008516036128735760006001870190506000600560008381526020019081526020016000205403612871576001548114612870578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46128dd836000886001612d1e565b600260008154809291906001019190505550505050505050565b600080829050806129066122c2565b1161298c5760015481101561298b5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612989575b6000810361297f576005600083600190039350838152602001908152602001600020549050612955565b80925050506129be565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612a92848484610cad565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612af457612abd84848484612dca565b612af3576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060008203612b41576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c55565b600082905060005b60008214612b73578080612b5c9061448c565b915050600a82612b6c9190614503565b9150612b49565b60008167ffffffffffffffff811115612b8f57612b8e61348f565b5b6040519080825280601f01601f191660200182016040528015612bc15781602001600182028036833780820191505090505b5090505b60008514612c4e57600182612bda9190613b53565b9150600a85612be99190614534565b6030612bf59190613a47565b60f81b818381518110612c0b57612c0a614565565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c479190614503565b9450612bc5565b8093505050505b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612ce2868684612f1a565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b600033905090565b612d368383612f23565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612dc55760006001549050600083820390505b612d776000868380600101945086612dca565b612dad576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612d64578160015414612dc257600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612df06122ba565b8786866040518563ffffffff1660e01b8152600401612e1294939291906145e9565b6020604051808303816000875af1925050508015612e4e57506040513d601f19601f82011682018060405250810190612e4b919061464a565b60015b612ec7573d8060008114612e7e576040519150601f19603f3d011682016040523d82523d6000602084013e612e83565b606091505b506000815103612ebf576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b6000600154905060008203612f64576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612f716000848385612cc5565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612fe883612fd96000866000612ccb565b612fe2856130df565b17612cf3565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461308957808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a460018101905061304e565b50600082036130c4576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506130da6000848385612d1e565b505050565b60006001821460e11b9050919050565b60008115159050919050565b613104816130ef565b82525050565b600060208201905061311f60008301846130fb565b92915050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61316e81613139565b811461317957600080fd5b50565b60008135905061318b81613165565b92915050565b6000602082840312156131a7576131a661312f565b5b60006131b58482850161317c565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156131f85780820151818401526020810190506131dd565b60008484015250505050565b6000601f19601f8301169050919050565b6000613220826131be565b61322a81856131c9565b935061323a8185602086016131da565b61324381613204565b840191505092915050565b600060208201905081810360008301526132688184613215565b905092915050565b6000819050919050565b61328381613270565b811461328e57600080fd5b50565b6000813590506132a08161327a565b92915050565b6000602082840312156132bc576132bb61312f565b5b60006132ca84828501613291565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132fe826132d3565b9050919050565b61330e816132f3565b82525050565b60006020820190506133296000830184613305565b92915050565b613338816132f3565b811461334357600080fd5b50565b6000813590506133558161332f565b92915050565b600080604083850312156133725761337161312f565b5b600061338085828601613346565b925050602061339185828601613291565b9150509250929050565b6133a481613270565b82525050565b60006020820190506133bf600083018461339b565b92915050565b6000602082840312156133db576133da61312f565b5b60006133e984828501613346565b91505092915050565b60008060006060848603121561340b5761340a61312f565b5b600061341986828701613346565b935050602061342a86828701613346565b925050604061343b86828701613291565b9150509250925092565b6000806040838503121561345c5761345b61312f565b5b600061346a85828601613291565b925050602061347b85828601613346565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6134c782613204565b810181811067ffffffffffffffff821117156134e6576134e561348f565b5b80604052505050565b60006134f9613125565b905061350582826134be565b919050565b600067ffffffffffffffff8211156135255761352461348f565b5b61352e82613204565b9050602081019050919050565b82818337600083830152505050565b600061355d6135588461350a565b6134ef565b9050828152602081018484840111156135795761357861348a565b5b61358484828561353b565b509392505050565b600082601f8301126135a1576135a0613485565b5b81356135b184826020860161354a565b91505092915050565b6000602082840312156135d0576135cf61312f565b5b600082013567ffffffffffffffff8111156135ee576135ed613134565b5b6135fa8482850161358c565b91505092915050565b61360c816130ef565b811461361757600080fd5b50565b60008135905061362981613603565b92915050565b600080604083850312156136465761364561312f565b5b60006136548582860161361a565b925050602083013567ffffffffffffffff81111561367557613674613134565b5b6136818582860161358c565b9150509250929050565b600080604083850312156136a2576136a161312f565b5b60006136b085828601613346565b92505060206136c18582860161361a565b9150509250929050565b600067ffffffffffffffff8211156136e6576136e561348f565b5b6136ef82613204565b9050602081019050919050565b600061370f61370a846136cb565b6134ef565b90508281526020810184848401111561372b5761372a61348a565b5b61373684828561353b565b509392505050565b600082601f83011261375357613752613485565b5b81356137638482602086016136fc565b91505092915050565b600080600080608085870312156137865761378561312f565b5b600061379487828801613346565b94505060206137a587828801613346565b93505060406137b687828801613291565b925050606085013567ffffffffffffffff8111156137d7576137d6613134565b5b6137e38782880161373e565b91505092959194509250565b600080604083850312156138065761380561312f565b5b600061381485828601613346565b925050602061382585828601613346565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061387657607f821691505b6020821081036138895761388861382f565b5b50919050565b60006040820190506138a46000830185613305565b6138b16020830184613305565b9392505050565b6000815190506138c781613603565b92915050565b6000602082840312156138e3576138e261312f565b5b60006138f1848285016138b8565b91505092915050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613930601f836131c9565b915061393b826138fa565b602082019050919050565b6000602082019050818103600083015261395f81613923565b9050919050565b600081905092915050565b50565b6000613981600083613966565b915061398c82613971565b600082019050919050565b60006139a282613974565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006139e26010836131c9565b91506139ed826139ac565b602082019050919050565b60006020820190508181036000830152613a11816139d5565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a5282613270565b9150613a5d83613270565b9250828201905080821115613a7557613a74613a18565b5b92915050565b7f4e6f206d6f7265204567677320696e2073746f636b2100000000000000000000600082015250565b6000613ab16016836131c9565b9150613abc82613a7b565b602082019050919050565b60006020820190508181036000830152613ae081613aa4565b9050919050565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b6000613b1d601e836131c9565b9150613b2882613ae7565b602082019050919050565b60006020820190508181036000830152613b4c81613b10565b9050919050565b6000613b5e82613270565b9150613b6983613270565b9250828203905081811115613b8157613b80613a18565b5b92915050565b6000613b9282613270565b9150613b9d83613270565b9250828202613bab81613270565b91508282048414831517613bc257613bc1613a18565b5b5092915050565b7f45676773206e6f74207265616479207965742100000000000000000000000000600082015250565b6000613bff6013836131c9565b9150613c0a82613bc9565b602082019050919050565b60006020820190508181036000830152613c2e81613bf2565b9050919050565b7f4e6f206d6f72652045676773206c656674210000000000000000000000000000600082015250565b6000613c6b6012836131c9565b9150613c7682613c35565b602082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f547269656420746f206d696e742045676773206f766572206f766572206c696d60008201527f6974000000000000000000000000000000000000000000000000000000000000602082015250565b6000613cfd6022836131c9565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b9050919050565b7f547269656420746f206d696e742045676773206f766572206c696d69742c207260008201527f6574727920776974682072656475636564207175616e74697479000000000000602082015250565b6000613d8f603a836131c9565b9150613d9a82613d33565b604082019050919050565b60006020820190508181036000830152613dbe81613d82565b9050919050565b7f4d7573742073656e64206d6f7265206d6f6e6579210000000000000000000000600082015250565b6000613dfb6015836131c9565b9150613e0682613dc5565b602082019050919050565b60006020820190508181036000830152613e2a81613dee565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e937fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613e56565b613e9d8683613e56565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613eda613ed5613ed084613270565b613eb5565b613270565b9050919050565b6000819050919050565b613ef483613ebf565b613f08613f0082613ee1565b848454613e63565b825550505050565b600090565b613f1d613f10565b613f28818484613eeb565b505050565b5b81811015613f4c57613f41600082613f15565b600181019050613f2e565b5050565b601f821115613f9157613f6281613e31565b613f6b84613e46565b81016020851015613f7a578190505b613f8e613f8685613e46565b830182613f2d565b50505b505050565b600082821c905092915050565b6000613fb460001984600802613f96565b1980831691505092915050565b6000613fcd8383613fa3565b9150826002028217905092915050565b613fe6826131be565b67ffffffffffffffff811115613fff57613ffe61348f565b5b614009825461385e565b614014828285613f50565b600060209050601f8311600181146140475760008415614035578287015190505b61403f8582613fc1565b8655506140a7565b601f19841661405586613e31565b60005b8281101561407d57848901518255600182019150602085019450602081019050614058565b8683101561409a5784890151614096601f891682613fa3565b8355505b6001600288020188555050505b505050505050565b7f4d696e74206e6f74207265616479207965742100000000000000000000000000600082015250565b60006140e56013836131c9565b91506140f0826140af565b602082019050919050565b60006020820190508181036000830152614114816140d8565b9050919050565b7f4e6f206d6f726520746f6b656e73206c65667421000000000000000000000000600082015250565b60006141516014836131c9565b915061415c8261411b565b602082019050919050565b6000602082019050818103600083015261418081614144565b9050919050565b7f547269656420746f206d696e7420746f6b656e73206f766572206f766572206c60008201527f696d697400000000000000000000000000000000000000000000000000000000602082015250565b60006141e36024836131c9565b91506141ee82614187565b604082019050919050565b60006020820190508181036000830152614212816141d6565b9050919050565b7f547269656420746f206d696e7420746f6b656e73206f766572206c696d69742c60008201527f20726574727920776974682072656475636564207175616e7469747900000000602082015250565b6000614275603c836131c9565b915061428082614219565b604082019050919050565b600060208201905081810360008301526142a481614268565b9050919050565b600081905092915050565b600081546142c38161385e565b6142cd81866142ab565b945060018216600081146142e857600181146142fd57614330565b60ff1983168652811515820286019350614330565b61430685613e31565b60005b8381101561432857815481890152600182019150602081019050614309565b838801955050505b50505092915050565b6000614344826131be565b61434e81856142ab565b935061435e8185602086016131da565b80840191505092915050565b600061437682856142b6565b91506143828284614339565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006143ea6026836131c9565b91506143f58261438e565b604082019050919050565b60006020820190508181036000830152614419816143dd565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144566020836131c9565b915061446182614420565b602082019050919050565b6000602082019050818103600083015261448581614449565b9050919050565b600061449782613270565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144c9576144c8613a18565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061450e82613270565b915061451983613270565b925082614529576145286144d4565b5b828204905092915050565b600061453f82613270565b915061454a83613270565b92508261455a576145596144d4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006145bb82614594565b6145c5818561459f565b93506145d58185602086016131da565b6145de81613204565b840191505092915050565b60006080820190506145fe6000830187613305565b61460b6020830186613305565b614618604083018561339b565b818103606083015261462a81846145b0565b905095945050505050565b60008151905061464481613165565b92915050565b6000602082840312156146605761465f61312f565b5b600061466e84828501614635565b9150509291505056fea2646970667358221220dae6fd7f02f953d672e4683089ebdb54f1cd8a779e6217e9020a198032484df064736f6c63430008120033

Deployed Bytecode Sourcemap

34741:5753:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35009:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15238:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15490:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19066:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18650:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35201:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13601:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34872:45;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39496:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38354:191;;;;;;;;;;;;;:::i;:::-;;35296:252;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39689:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34614:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34943:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36017:1102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38815:112;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34838:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35164:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16138:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;14066:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1596:103;;;;;;;;;;;;;:::i;:::-;;38553:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38935:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1361:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15598:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37125:1105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39157:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19292:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38236:110;;;;;;;;;;;;;:::i;:::-;;34920:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39890:250;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35089:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39390:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40148:341;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35130:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35051:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34979:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35685:324;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38710:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19534:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1709:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39275:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39049:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35009:39;;;;;;;;;;;;;:::o;15238:244::-;15323:4;15377:10;15362:25;;:11;:25;;;;:68;;;;15420:10;15405:25;;:11;:25;;;;15362:68;:111;;;;15463:10;15448:25;;:11;:25;;;;15362:111;15342:131;;15238:244;;;:::o;15490:100::-;15544:13;15577:5;15570:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15490:100;:::o;19066:218::-;19142:7;19167:16;19175:7;19167;:16::i;:::-;19162:64;;19192:34;;;;;;;;;;;;;;19162:64;19246:15;:24;19262:7;19246:24;;;;;;;;;;;:30;;;;;;;;;;;;19239:37;;19066:218;;;:::o;18650:408::-;18739:13;18755:16;18763:7;18755;:16::i;:::-;18739:32;;18811:5;18788:28;;:19;:17;:19::i;:::-;:28;;;18784:175;;18836:44;18853:5;18860:19;:17;:19::i;:::-;18836:16;:44::i;:::-;18831:128;;18908:35;;;;;;;;;;;;;;18831:128;18784:175;19004:2;18971:15;:24;18987:7;18971:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;19042:7;19038:2;19022:28;;19031:5;19022:28;;;;;;;;;;;;18728:330;18650:408;;:::o;35201:38::-;;;;:::o;13601:180::-;13662:7;13747:15;:13;:15::i;:::-;13732:12;;13716:13;;:28;:46;13709:53;;13601:180;:::o;34872:45::-;;;;;;;;;;;;;;;;;:::o;39496:185::-;31850:1;31061:42;31804:43;;;:47;31800:225;;;31061:42;31873:40;;;31922:4;31929:10;31873:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31868:146;;31987:10;31968:30;;;;;;;;;;;:::i;:::-;;;;;;;;31868:146;31800:225;39636:37:::1;39655:4;39661:2;39665:7;39636:18;:37::i;:::-;39496:185:::0;;;:::o;38354:191::-;1320:13;:11;:13::i;:::-;2270:1:::1;2428:7;;:19:::0;2420:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2270:1;2496:7;:18;;;;38423:12:::2;38441:10;:15;;38464:21;38441:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38422:68;;;38509:7;38501:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;38411:134;2226:1:::1;2541:7;:22;;;;38354:191::o:0;35296:252::-;1320:13;:11;:13::i;:::-;35425:15:::1;;35413:8;35397:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;35375:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;35511:29;35521:8;35531;35511:9;:29::i;:::-;35296:252:::0;;:::o;39689:193::-;31850:1;31061:42;31804:43;;;:47;31800:225;;;31061:42;31873:40;;;31922:4;31929:10;31873:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31868:146;;31987:10;31968:30;;;;;;;;;;;:::i;:::-;;;;;;;;31868:146;31800:225;39833:41:::1;39856:4;39862:2;39866:7;39833:22;:41::i;:::-;39689:193:::0;;;:::o;34614:94::-;34680:20;34686:7;34695:4;34680:5;:20::i;:::-;34614:94;:::o;34943:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;36017:1102::-;35612:10;35599:23;;:9;:23;;;35591:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2270:1:::1;2428:7;;:19:::0;2420:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2270:1;2496:7;:18;;;;36145:10:::2;36166:9:::0;36203:13:::2;:25;36217:10;36203:25;;;;;;;;;;;;;;;;36178:22;;:50;;;;:::i;:::-;36166:62;;36255:4;36243:8;:16;36239:285;;36311:4;36300:8;:15;;;;:::i;:::-;36285:10;;36284:32;;;;:::i;:::-;36276:40;;36387:4;36359:13;:25;36373:10;36359:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;36331:13;:25;36345:10;36331:25;;;;;;;;;;;;;;;:60;;;;36239:285;;;36432:1;36424:9;;36504:8;36476:13;:25;36490:10;36476:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;36448:13;:25;36462:10;36448:25;;;;;;;;;;;;;;;:64;;;;36239:285;36544:19;;;;;;;;;;;36536:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;36634:15;;36622:8;36606:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;36598:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;36729:17;;36717:8;36693:21;36703:10;36693:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;36685:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;36818:14;;36806:8;:26;;36798:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;36927:5;36914:9;:18;;36906:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;36971:31;36981:10;36993:8;36971:9;:31::i;:::-;37031:5;37019:9;:17;37015:97;;;37061:10;37053:28;;:47;37094:5;37082:9;:17;;;;:::i;:::-;37053:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;37015:97;36134:985;;2226:1:::1;2541:7;:22;;;;36017:1102:::0;:::o;38815:112::-;1320:13;:11;:13::i;:::-;38907:12:::1;38892;:27;;;;;;:::i;:::-;;38815:112:::0;:::o;34838:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35164:34::-;;;;:::o;16138:152::-;16210:7;16253:27;16272:7;16253:18;:27::i;:::-;16230:52;;16138:152;;;:::o;14066:233::-;14138:7;14179:1;14162:19;;:5;:19;;;14158:60;;14190:28;;;;;;;;;;;;;;14158:60;11874:13;14236:18;:25;14255:5;14236:25;;;;;;;;;;;;;;;;:55;14229:62;;14066:233;;;:::o;1596:103::-;1320:13;:11;:13::i;:::-;1661:30:::1;1688:1;1661:18;:30::i;:::-;1596:103::o:0;38553:149::-;1320:13;:11;:13::i;:::-;38655:8:::1;38644;:19;;;;;;:::i;:::-;;38685:9;38674:8;;:20;;;;;;;;;;;;;;;;;;38553:149:::0;;:::o;38935:106::-;1320:13;:11;:13::i;:::-;39029:4:::1;39011:15;:22;;;;38935:106:::0;:::o;1361:87::-;1407:7;1434:6;;;;;;;;;;;1427:13;;1361:87;:::o;15598:104::-;15654:13;15687:7;15680:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15598:104;:::o;37125:1105::-;35612:10;35599:23;;:9;:23;;;35591:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;2270:1:::1;2428:7;;:19:::0;2420:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;2270:1;2496:7;:18;;;;37250:10:::2;37271:9:::0;37308:13:::2;:25;37322:10;37308:25;;;;;;;;;;;;;;;;37283:22;;:50;;;;:::i;:::-;37271:62;;37360:4;37348:8;:16;37344:285;;37416:4;37405:8;:15;;;;:::i;:::-;37390:10;;37389:32;;;;:::i;:::-;37381:40;;37492:4;37464:13;:25;37478:10;37464:25;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;37436:13;:25;37450:10;37436:25;;;;;;;;;;;;;;;:60;;;;37344:285;;;37537:1;37529:9;;37609:8;37581:13;:25;37595:10;37581:25;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;37553:13;:25;37567:10;37553:25;;;;;;;;;;;;;;;:64;;;;37344:285;37649:19;;;;;;;;;;;37641:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;37739:15;;37727:8;37711:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:43;;37703:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;37836:17;;37824:8;37800:21;37810:10;37800:9;:21::i;:::-;:32;;;;:::i;:::-;:53;;37792:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;37927:14;;37915:8;:26;;37907:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;38038:5;38025:9;:18;;38017:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;38082:31;38092:10;38104:8;38082:9;:31::i;:::-;38142:5;38130:9;:17;38126:97;;;38172:10;38164:28;;:47;38205:5;38193:9;:17;;;;:::i;:::-;38164:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;38126:97;37239:991;;2226:1:::1;2541:7;:22;;;;37125:1105:::0;:::o;39157:110::-;1320:13;:11;:13::i;:::-;39255:4:::1;39230:22;:29;;;;39157:110:::0;:::o;19292:234::-;19439:8;19387:18;:39;19406:19;:17;:19::i;:::-;19387:39;;;;;;;;;;;;;;;:49;19427:8;19387:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;19499:8;19463:55;;19478:19;:17;:19::i;:::-;19463:55;;;19509:8;19463:55;;;;;;:::i;:::-;;;;;;;;19292:234;;:::o;38236:110::-;1320:13;:11;:13::i;:::-;38319:19:::1;;;;;;;;;;;38318:20;38296:19;;:42;;;;;;;;;;;;;;;;;;38236:110::o:0;34920:20::-;;;;;;;;;;;;;:::o;39890:250::-;31850:1;31061:42;31804:43;;;:47;31800:225;;;31061:42;31873:40;;;31922:4;31929:10;31873:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31868:146;;31987:10;31968:30;;;;;;;;;;;:::i;:::-;;;;;;;;31868:146;31800:225;40085:47:::1;40108:4;40114:2;40118:7;40127:4;40085:22;:47::i;:::-;39890:250:::0;;;;:::o;35089:37::-;;;;:::o;39390:98::-;1320:13;:11;:13::i;:::-;39476:4:::1;39459:14;:21;;;;39390:98:::0;:::o;40148:341::-;40270:13;40305:8;;;;;;;;;;;40301:181;;;40378:8;40388:26;40405:8;40388:16;:26::i;:::-;40361:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40330:86;;;;40301:181;40456:14;40449:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40148:341;;;;:::o;35130:31::-;;;;:::o;35051:34::-;;;;:::o;34979:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35685:324::-;35738:4;35754:10;35775:9;35812:13;:25;35826:10;35812:25;;;;;;;;;;;;;;;;35787:22;;:50;;;;:::i;:::-;35775:62;;35864:4;35852:8;:16;35848:131;;35920:4;35909:8;:15;;;;:::i;:::-;35894:10;;35893:32;;;;:::i;:::-;35885:40;;35848:131;;;35966:1;35958:9;;35848:131;35996:5;35989:12;;;;35685:324;;;:::o;38710:97::-;38754:13;38787:12;38780:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38710:97;:::o;19534:164::-;19631:4;19655:18;:25;19674:5;19655:25;;;;;;;;;;;;;;;:35;19681:8;19655:35;;;;;;;;;;;;;;;;;;;;;;;;;19648:42;;19534:164;;;;:::o;1709:201::-;1320:13;:11;:13::i;:::-;1818:1:::1;1798:22;;:8;:22;;::::0;1790:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;1874:28;1893:8;1874:18;:28::i;:::-;1709:201:::0;:::o;39275:107::-;1320:13;:11;:13::i;:::-;39370:4:::1;39350:17;:24;;;;39275:107:::0;:::o;39049:100::-;1320:13;:11;:13::i;:::-;39132:9:::1;39119:10;:22;;;;39049:100:::0;:::o;19706:282::-;19771:4;19827:7;19808:15;:13;:15::i;:::-;:26;;:66;;;;;19861:13;;19851:7;:23;19808:66;:153;;;;;19960:1;12248:8;19912:17;:26;19930:7;19912:26;;;;;;;;;;;;:44;:49;19808:153;19788:173;;19706:282;;;:::o;30086:105::-;30146:7;30173:10;30166:17;;30086:105;:::o;13390:92::-;13446:7;13390:92;:::o;20801:1651::-;20943:27;20973;20992:7;20973:18;:27::i;:::-;20943:57;;21058:4;21017:45;;21033:19;21017:45;;;21013:86;;21071:28;;;;;;;;;;;;;;21013:86;21113:27;21142:23;21169:35;21196:7;21169:26;:35::i;:::-;21112:92;;;;21222:68;21247:15;21264:4;21270:19;:17;:19::i;:::-;21222:24;:68::i;:::-;21217:180;;21310:43;21327:4;21333:19;:17;:19::i;:::-;21310:16;:43::i;:::-;21305:92;;21362:35;;;;;;;;;;;;;;21305:92;21217:180;21428:1;21414:16;;:2;:16;;;21410:52;;21439:23;;;;;;;;;;;;;;21410:52;21475:43;21497:4;21503:2;21507:7;21516:1;21475:21;:43::i;:::-;21558:15;21555:85;;;21623:1;21602:19;21595:30;21555:85;21692:18;:24;21711:4;21692:24;;;;;;;;;;;;;;;;21690:26;;;;;;;;;;;;21734:18;:22;21753:2;21734:22;;;;;;;;;;;;;;;;21732:24;;;;;;;;;;;21803:146;21840:2;21889:45;21904:4;21910:2;21914:19;21889:14;:45::i;:::-;12382:8;21861:73;21803:18;:146::i;:::-;21774:17;:26;21792:7;21774:26;;;;;;;;;;;:175;;;;22021:1;12382:8;21970:19;:47;:52;21966:370;;22043:19;22075:1;22065:7;:11;22043:33;;22135:1;22101:17;:30;22119:11;22101:30;;;;;;;;;;;;:35;22097:224;;22182:13;;22167:11;:28;22163:139;;22259:19;22226:17;:30;22244:11;22226:30;;;;;;;;;;;:52;;;;22163:139;22097:224;22024:312;21966:370;22383:7;22379:2;22364:27;;22373:4;22364:27;;;;;;;;;;;;22402:42;22423:4;22429:2;22433:7;22442:1;22402:20;:42::i;:::-;20932:1520;;;20801:1651;;;:::o;1456:132::-;1531:12;:10;:12::i;:::-;1520:23;;:7;:5;:7::i;:::-;:23;;;1512:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1456:132::o;27239:112::-;27316:27;27326:2;27330:8;27316:27;;;;;;;;;;;;:9;:27::i;:::-;27239:112;;:::o;22460:193::-;22606:39;22623:4;22629:2;22633:7;22606:39;;;;;;;;;;;;:16;:39::i;:::-;22460:193;;;:::o;27456:1679::-;27536:27;27566;27585:7;27566:18;:27::i;:::-;27536:57;;27606:12;27637:19;27606:52;;27672:27;27701:23;27728:35;27755:7;27728:26;:35::i;:::-;27671:92;;;;27780:13;27776:244;;;27829:68;27854:15;27871:4;27877:19;:17;:19::i;:::-;27829:24;:68::i;:::-;27824:184;;27921:43;27938:4;27944:19;:17;:19::i;:::-;27921:16;:43::i;:::-;27916:92;;27973:35;;;;;;;;;;;;;;27916:92;27824:184;27776:244;28032:51;28054:4;28068:1;28072:7;28081:1;28032:21;:51::i;:::-;28123:15;28120:101;;;28204:1;28183:19;28176:30;28120:101;28330:1;12005:3;28300:1;:26;;28299:32;28271:18;:24;28290:4;28271:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;28377:176;28414:4;28485:53;28500:4;28514:1;28518:19;28485:14;:53::i;:::-;12382:8;12248;28438:43;28437:101;28377:18;:176::i;:::-;28348:17;:26;28366:7;28348:26;;;;;;;;;;;:205;;;;28625:1;12382:8;28574:19;:47;:52;28570:370;;28647:19;28679:1;28669:7;:11;28647:33;;28739:1;28705:17;:30;28723:11;28705:30;;;;;;;;;;;;:35;28701:224;;28786:13;;28771:11;:28;28767:139;;28863:19;28830:17;:30;28848:11;28830:30;;;;;;;;;;;:52;;;;28767:139;28701:224;28628:312;28570:370;28995:7;28991:1;28968:35;;28977:4;28968:35;;;;;;;;;;;;29014:50;29035:4;29049:1;29053:7;29062:1;29014:20;:50::i;:::-;29102:12;;:14;;;;;;;;;;;;;27525:1610;;;;27456:1679;;:::o;16845:633::-;16912:7;16932:12;16947:7;16932:22;;17015:4;16996:15;:13;:15::i;:::-;:23;16992:419;;17049:13;;17042:4;:20;17038:373;;;17087:14;17104:17;:23;17122:4;17104:23;;;;;;;;;;;;17087:40;;17184:1;12248:8;17156:6;:24;:29;17152:240;;17216:113;17233:1;17223:6;:11;17216:113;;17276:17;:25;17294:6;;;;;;;17276:25;;;;;;;;;;;;17267:34;;17216:113;;;17362:6;17355:13;;;;;;17152:240;17064:347;17038:373;16992:419;17439:31;;;;;;;;;;;;;;16845:633;;;;:::o;1918:191::-;1992:16;2011:6;;;;;;;;;;;1992:25;;2037:8;2028:6;;:17;;;;;;;;;;;;;;;;;;2092:8;2061:40;;2082:8;2061:40;;;;;;;;;;;;1981:128;1918:191;:::o;22661:407::-;22836:31;22849:4;22855:2;22859:7;22836:12;:31::i;:::-;22900:1;22882:2;:14;;;:19;22878:183;;22921:56;22952:4;22958:2;22962:7;22971:5;22921:30;:56::i;:::-;22916:145;;23005:40;;;;;;;;;;;;;;22916:145;22878:183;22661:407;;;;:::o;2745:534::-;2801:13;2842:1;2833:5;:10;2829:53;;2860:10;;;;;;;;;;;;;;;;;;;;;2829:53;2892:12;2907:5;2892:20;;2923:14;2948:78;2963:1;2955:4;:9;2948:78;;2981:8;;;;;:::i;:::-;;;;3012:2;3004:10;;;;;:::i;:::-;;;2948:78;;;3036:19;3068:6;3058:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3036:39;;3086:154;3102:1;3093:5;:10;3086:154;;3130:1;3120:11;;;;;:::i;:::-;;;3197:2;3189:5;:10;;;;:::i;:::-;3176:2;:24;;;;:::i;:::-;3163:39;;3146:6;3153;3146:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3226:2;3217:11;;;;;:::i;:::-;;;3086:154;;;3264:6;3250:21;;;;;2745:534;;;;:::o;20401:392::-;20503:27;20532:23;20573:38;20614:15;:24;20630:7;20614:24;;;;;;;;;;;20573:65;;20698:18;20675:41;;20755:19;20749:26;20730:45;;20660:126;20401:392;;;:::o;19996:397::-;20145:11;20215:16;20208:5;20204:28;20195:37;;20276:16;20265:9;20261:32;20248:45;;20358:15;20347:9;20344:30;20336:5;20325:9;20322:20;20319:56;20309:66;;19996:397;;;;;:::o;23076:159::-;;;;;:::o;29767:311::-;29902:7;29922:16;12445:3;29948:19;:41;;29922:68;;12445:3;30016:31;30027:4;30033:2;30037:9;30016:10;:31::i;:::-;30008:40;;:62;;30001:69;;;29767:311;;;;;:::o;17860:450::-;17940:14;18108:16;18101:5;18097:28;18088:37;;18285:5;18271:11;18246:23;18242:41;18239:52;18232:5;18229:63;18219:73;;17860:450;;;;:::o;23243:158::-;;;;;:::o;809:98::-;862:7;889:10;882:17;;809:98;:::o;26542:689::-;26673:19;26679:2;26683:8;26673:5;:19::i;:::-;26752:1;26734:2;:14;;;:19;26730:483;;26774:11;26788:13;;26774:27;;26820:13;26842:8;26836:3;:14;26820:30;;26869:233;26900:62;26939:1;26943:2;26947:7;;;;;;26956:5;26900:30;:62::i;:::-;26895:167;;26998:40;;;;;;;;;;;;;;26895:167;27097:3;27089:5;:11;26869:233;;27184:3;27167:13;;:20;27163:34;;27189:8;;;27163:34;26755:458;;26730:483;26542:689;;;:::o;23409:716::-;23572:4;23618:2;23593:45;;;23639:19;:17;:19::i;:::-;23660:4;23666:7;23675:5;23593:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;23589:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23893:1;23876:6;:13;:18;23872:235;;23922:40;;;;;;;;;;;;;;23872:235;24065:6;24059:13;24050:6;24046:2;24042:15;24035:38;23589:529;23762:54;;;23752:64;;;:6;:64;;;;23745:71;;;23409:716;;;;;;:::o;29612:147::-;29749:6;29612:147;;;;;:::o;24133:1442::-;24206:20;24229:13;;24206:36;;24269:1;24257:8;:13;24253:44;;24279:18;;;;;;;;;;;;;;24253:44;24310:61;24340:1;24344:2;24348:12;24362:8;24310:21;:61::i;:::-;24480:1;11945:2;24450:1;:26;;24449:32;24437:8;:45;24411:18;:22;24430:2;24411:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;24533:139;24570:2;24624:33;24647:1;24651:2;24655:1;24624:14;:33::i;:::-;24591:30;24612:8;24591:20;:30::i;:::-;:66;24533:18;:139::i;:::-;24499:17;:31;24517:12;24499:31;;;;;;;;;;;:173;;;;24689:16;24720:11;24749:8;24734:12;:23;24720:37;;24824:16;24820:2;24816:25;24804:37;;25044:12;25012:8;24987:1;24938:25;24913:1;24888;24861:215;25156:1;25142:12;25138:20;25096:279;25197:3;25188:7;25185:16;25096:279;;25348:7;25338:8;25335:1;25308:25;25305:1;25302;25297:59;25250:1;25241:7;25237:15;25226:26;;25096:279;;;25100:77;25420:1;25408:8;:13;25404:45;;25430:19;;;;;;;;;;;;;;25404:45;25482:3;25466:13;:19;;;;24384:1113;;25507:60;25536:1;25540:2;25544:12;25558:8;25507:20;:60::i;:::-;24195:1380;24133:1442;;:::o;18318:324::-;18388:14;18621:1;18611:8;18608:15;18582:24;18578:46;18568:56;;18318: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:180::-;19082:32;19078:1;19070:6;19066:14;19059:56;18942:180;:::o;19128:366::-;19270:3;19291:67;19355:2;19350:3;19291:67;:::i;:::-;19284:74;;19367:93;19456:3;19367:93;:::i;:::-;19485:2;19480:3;19476:12;19469:19;;19128:366;;;:::o;19500:419::-;19666:4;19704:2;19693:9;19689:18;19681:26;;19753:9;19747:4;19743:20;19739:1;19728:9;19724:17;19717:47;19781:131;19907:4;19781:131;:::i;:::-;19773:139;;19500:419;;;:::o;19925:194::-;19965:4;19985:20;20003:1;19985:20;:::i;:::-;19980:25;;20019:20;20037:1;20019:20;:::i;:::-;20014:25;;20063:1;20060;20056:9;20048:17;;20087:1;20081:4;20078:11;20075:37;;;20092:18;;:::i;:::-;20075:37;19925:194;;;;:::o;20125:410::-;20165:7;20188:20;20206:1;20188:20;:::i;:::-;20183:25;;20222:20;20240:1;20222:20;:::i;:::-;20217:25;;20277:1;20274;20270:9;20299:30;20317:11;20299:30;:::i;:::-;20288:41;;20478:1;20469:7;20465:15;20462:1;20459:22;20439:1;20432:9;20412:83;20389:139;;20508:18;;:::i;:::-;20389:139;20173:362;20125:410;;;;:::o;20541:169::-;20681:21;20677:1;20669:6;20665:14;20658:45;20541:169;:::o;20716:366::-;20858:3;20879:67;20943:2;20938:3;20879:67;:::i;:::-;20872:74;;20955:93;21044:3;20955:93;:::i;:::-;21073:2;21068:3;21064:12;21057:19;;20716:366;;;:::o;21088:419::-;21254:4;21292:2;21281:9;21277:18;21269:26;;21341:9;21335:4;21331:20;21327:1;21316:9;21312:17;21305:47;21369:131;21495:4;21369:131;:::i;:::-;21361:139;;21088:419;;;:::o;21513:168::-;21653:20;21649:1;21641:6;21637:14;21630:44;21513:168;:::o;21687:366::-;21829:3;21850:67;21914:2;21909:3;21850:67;:::i;:::-;21843:74;;21926:93;22015:3;21926:93;:::i;:::-;22044:2;22039:3;22035:12;22028:19;;21687:366;;;:::o;22059:419::-;22225:4;22263:2;22252:9;22248:18;22240:26;;22312:9;22306:4;22302:20;22298:1;22287:9;22283:17;22276:47;22340:131;22466:4;22340:131;:::i;:::-;22332:139;;22059:419;;;:::o;22484:221::-;22624:34;22620:1;22612:6;22608:14;22601:58;22693:4;22688:2;22680:6;22676:15;22669:29;22484:221;:::o;22711:366::-;22853:3;22874:67;22938:2;22933:3;22874:67;:::i;:::-;22867:74;;22950:93;23039:3;22950:93;:::i;:::-;23068:2;23063:3;23059:12;23052:19;;22711:366;;;:::o;23083:419::-;23249:4;23287:2;23276:9;23272:18;23264:26;;23336:9;23330:4;23326:20;23322:1;23311:9;23307:17;23300:47;23364:131;23490:4;23364:131;:::i;:::-;23356:139;;23083:419;;;:::o;23508:245::-;23648:34;23644:1;23636:6;23632:14;23625:58;23717:28;23712:2;23704:6;23700:15;23693:53;23508:245;:::o;23759:366::-;23901:3;23922:67;23986:2;23981:3;23922:67;:::i;:::-;23915:74;;23998:93;24087:3;23998:93;:::i;:::-;24116:2;24111:3;24107:12;24100:19;;23759:366;;;:::o;24131:419::-;24297:4;24335:2;24324:9;24320:18;24312:26;;24384:9;24378:4;24374:20;24370:1;24359:9;24355:17;24348:47;24412:131;24538:4;24412:131;:::i;:::-;24404:139;;24131:419;;;:::o;24556:171::-;24696:23;24692:1;24684:6;24680:14;24673:47;24556:171;:::o;24733:366::-;24875:3;24896:67;24960:2;24955:3;24896:67;:::i;:::-;24889:74;;24972:93;25061:3;24972:93;:::i;:::-;25090:2;25085:3;25081:12;25074:19;;24733:366;;;:::o;25105:419::-;25271:4;25309:2;25298:9;25294:18;25286:26;;25358:9;25352:4;25348:20;25344:1;25333:9;25329:17;25322:47;25386:131;25512:4;25386:131;:::i;:::-;25378:139;;25105:419;;;:::o;25530:141::-;25579:4;25602:3;25594:11;;25625:3;25622:1;25615:14;25659:4;25656:1;25646:18;25638:26;;25530:141;;;:::o;25677:93::-;25714:6;25761:2;25756;25749:5;25745:14;25741:23;25731:33;;25677:93;;;:::o;25776:107::-;25820:8;25870:5;25864:4;25860:16;25839:37;;25776:107;;;;:::o;25889:393::-;25958:6;26008:1;25996:10;25992:18;26031:97;26061:66;26050:9;26031:97;:::i;:::-;26149:39;26179:8;26168:9;26149:39;:::i;:::-;26137:51;;26221:4;26217:9;26210:5;26206:21;26197:30;;26270:4;26260:8;26256:19;26249:5;26246:30;26236:40;;25965:317;;25889:393;;;;;:::o;26288:60::-;26316:3;26337:5;26330:12;;26288:60;;;:::o;26354:142::-;26404:9;26437:53;26455:34;26464:24;26482:5;26464:24;:::i;:::-;26455:34;:::i;:::-;26437:53;:::i;:::-;26424:66;;26354:142;;;:::o;26502:75::-;26545:3;26566:5;26559:12;;26502:75;;;:::o;26583:269::-;26693:39;26724:7;26693:39;:::i;:::-;26754:91;26803:41;26827:16;26803:41;:::i;:::-;26795:6;26788:4;26782:11;26754:91;:::i;:::-;26748:4;26741:105;26659:193;26583:269;;;:::o;26858:73::-;26903:3;26858:73;:::o;26937:189::-;27014:32;;:::i;:::-;27055:65;27113:6;27105;27099:4;27055:65;:::i;:::-;26990:136;26937:189;;:::o;27132:186::-;27192:120;27209:3;27202:5;27199:14;27192:120;;;27263:39;27300:1;27293:5;27263:39;:::i;:::-;27236:1;27229:5;27225:13;27216:22;;27192:120;;;27132:186;;:::o;27324:543::-;27425:2;27420:3;27417:11;27414:446;;;27459:38;27491:5;27459:38;:::i;:::-;27543:29;27561:10;27543:29;:::i;:::-;27533:8;27529:44;27726:2;27714:10;27711:18;27708:49;;;27747:8;27732:23;;27708:49;27770:80;27826:22;27844:3;27826:22;:::i;:::-;27816:8;27812:37;27799:11;27770:80;:::i;:::-;27429:431;;27414:446;27324:543;;;:::o;27873:117::-;27927:8;27977:5;27971:4;27967:16;27946:37;;27873:117;;;;:::o;27996:169::-;28040:6;28073:51;28121:1;28117:6;28109:5;28106:1;28102:13;28073:51;:::i;:::-;28069:56;28154:4;28148;28144:15;28134:25;;28047:118;27996:169;;;;:::o;28170:295::-;28246:4;28392:29;28417:3;28411:4;28392:29;:::i;:::-;28384:37;;28454:3;28451:1;28447:11;28441:4;28438:21;28430:29;;28170:295;;;;:::o;28470:1395::-;28587:37;28620:3;28587:37;:::i;:::-;28689:18;28681:6;28678:30;28675:56;;;28711:18;;:::i;:::-;28675:56;28755:38;28787:4;28781:11;28755:38;:::i;:::-;28840:67;28900:6;28892;28886:4;28840:67;:::i;:::-;28934:1;28958:4;28945:17;;28990:2;28982:6;28979:14;29007:1;29002:618;;;;29664:1;29681:6;29678:77;;;29730:9;29725:3;29721:19;29715:26;29706:35;;29678:77;29781:67;29841:6;29834:5;29781:67;:::i;:::-;29775:4;29768:81;29637:222;28972:887;;29002:618;29054:4;29050:9;29042:6;29038:22;29088:37;29120:4;29088:37;:::i;:::-;29147:1;29161:208;29175:7;29172:1;29169:14;29161:208;;;29254:9;29249:3;29245:19;29239:26;29231:6;29224:42;29305:1;29297:6;29293:14;29283:24;;29352:2;29341:9;29337:18;29324:31;;29198:4;29195:1;29191:12;29186:17;;29161:208;;;29397:6;29388:7;29385:19;29382:179;;;29455:9;29450:3;29446:19;29440:26;29498:48;29540:4;29532:6;29528:17;29517:9;29498:48;:::i;:::-;29490:6;29483:64;29405:156;29382:179;29607:1;29603;29595:6;29591:14;29587:22;29581:4;29574:36;29009:611;;;28972:887;;28562:1303;;;28470:1395;;:::o;29871:169::-;30011:21;30007:1;29999:6;29995:14;29988:45;29871:169;:::o;30046:366::-;30188:3;30209:67;30273:2;30268:3;30209:67;:::i;:::-;30202:74;;30285:93;30374:3;30285:93;:::i;:::-;30403:2;30398:3;30394:12;30387:19;;30046:366;;;:::o;30418:419::-;30584:4;30622:2;30611:9;30607:18;30599:26;;30671:9;30665:4;30661:20;30657:1;30646:9;30642:17;30635:47;30699:131;30825:4;30699:131;:::i;:::-;30691:139;;30418:419;;;:::o;30843:170::-;30983:22;30979:1;30971:6;30967:14;30960:46;30843:170;:::o;31019:366::-;31161:3;31182:67;31246:2;31241:3;31182:67;:::i;:::-;31175:74;;31258:93;31347:3;31258:93;:::i;:::-;31376:2;31371:3;31367:12;31360:19;;31019:366;;;:::o;31391:419::-;31557:4;31595:2;31584:9;31580:18;31572:26;;31644:9;31638:4;31634:20;31630:1;31619:9;31615:17;31608:47;31672:131;31798:4;31672:131;:::i;:::-;31664:139;;31391:419;;;:::o;31816:223::-;31956:34;31952:1;31944:6;31940:14;31933:58;32025:6;32020:2;32012:6;32008:15;32001:31;31816:223;:::o;32045:366::-;32187:3;32208:67;32272:2;32267:3;32208:67;:::i;:::-;32201:74;;32284:93;32373:3;32284:93;:::i;:::-;32402:2;32397:3;32393:12;32386:19;;32045:366;;;:::o;32417:419::-;32583:4;32621:2;32610:9;32606:18;32598:26;;32670:9;32664:4;32660:20;32656:1;32645:9;32641:17;32634:47;32698:131;32824:4;32698:131;:::i;:::-;32690:139;;32417:419;;;:::o;32842:247::-;32982:34;32978:1;32970:6;32966:14;32959:58;33051:30;33046:2;33038:6;33034:15;33027:55;32842:247;:::o;33095:366::-;33237:3;33258:67;33322:2;33317:3;33258:67;:::i;:::-;33251:74;;33334:93;33423:3;33334:93;:::i;:::-;33452:2;33447:3;33443:12;33436:19;;33095:366;;;:::o;33467:419::-;33633:4;33671:2;33660:9;33656:18;33648:26;;33720:9;33714:4;33710:20;33706:1;33695:9;33691:17;33684:47;33748:131;33874:4;33748:131;:::i;:::-;33740:139;;33467:419;;;:::o;33892:148::-;33994:11;34031:3;34016:18;;33892:148;;;;:::o;34070:874::-;34173:3;34210:5;34204:12;34239:36;34265:9;34239:36;:::i;:::-;34291:89;34373:6;34368:3;34291:89;:::i;:::-;34284:96;;34411:1;34400:9;34396:17;34427:1;34422:166;;;;34602:1;34597:341;;;;34389:549;;34422:166;34506:4;34502:9;34491;34487:25;34482:3;34475:38;34568:6;34561:14;34554:22;34546:6;34542:35;34537:3;34533:45;34526:52;;34422:166;;34597:341;34664:38;34696:5;34664:38;:::i;:::-;34724:1;34738:154;34752:6;34749:1;34746:13;34738:154;;;34826:7;34820:14;34816:1;34811:3;34807:11;34800:35;34876:1;34867:7;34863:15;34852:26;;34774:4;34771:1;34767:12;34762:17;;34738:154;;;34921:6;34916:3;34912:16;34905:23;;34604:334;;34389:549;;34177:767;;34070:874;;;;:::o;34950:390::-;35056:3;35084:39;35117:5;35084:39;:::i;:::-;35139:89;35221:6;35216:3;35139:89;:::i;:::-;35132:96;;35237:65;35295:6;35290:3;35283:4;35276:5;35272:16;35237:65;:::i;:::-;35327:6;35322:3;35318:16;35311:23;;35060:280;34950:390;;;;:::o;35346:429::-;35523:3;35545:92;35633:3;35624:6;35545:92;:::i;:::-;35538:99;;35654:95;35745:3;35736:6;35654:95;:::i;:::-;35647:102;;35766:3;35759:10;;35346:429;;;;;:::o;35781:225::-;35921:34;35917:1;35909:6;35905:14;35898:58;35990:8;35985:2;35977:6;35973:15;35966:33;35781:225;:::o;36012:366::-;36154:3;36175:67;36239:2;36234:3;36175:67;:::i;:::-;36168:74;;36251:93;36340:3;36251:93;:::i;:::-;36369:2;36364:3;36360:12;36353:19;;36012:366;;;:::o;36384:419::-;36550:4;36588:2;36577:9;36573:18;36565:26;;36637:9;36631:4;36627:20;36623:1;36612:9;36608:17;36601:47;36665:131;36791:4;36665:131;:::i;:::-;36657:139;;36384:419;;;:::o;36809:182::-;36949:34;36945:1;36937:6;36933:14;36926:58;36809:182;:::o;36997:366::-;37139:3;37160:67;37224:2;37219:3;37160:67;:::i;:::-;37153:74;;37236:93;37325:3;37236:93;:::i;:::-;37354:2;37349:3;37345:12;37338:19;;36997:366;;;:::o;37369:419::-;37535:4;37573:2;37562:9;37558:18;37550:26;;37622:9;37616:4;37612:20;37608:1;37597:9;37593:17;37586:47;37650:131;37776:4;37650:131;:::i;:::-;37642:139;;37369:419;;;:::o;37794:233::-;37833:3;37856:24;37874:5;37856:24;:::i;:::-;37847:33;;37902:66;37895:5;37892:77;37889:103;;37972:18;;:::i;:::-;37889:103;38019:1;38012:5;38008:13;38001:20;;37794:233;;;:::o;38033:180::-;38081:77;38078:1;38071:88;38178:4;38175:1;38168:15;38202:4;38199:1;38192:15;38219:185;38259:1;38276:20;38294:1;38276:20;:::i;:::-;38271:25;;38310:20;38328:1;38310:20;:::i;:::-;38305:25;;38349:1;38339:35;;38354:18;;:::i;:::-;38339:35;38396:1;38393;38389:9;38384:14;;38219:185;;;;:::o;38410:176::-;38442:1;38459:20;38477:1;38459:20;:::i;:::-;38454:25;;38493:20;38511:1;38493:20;:::i;:::-;38488:25;;38532:1;38522:35;;38537:18;;:::i;:::-;38522:35;38578:1;38575;38571:9;38566:14;;38410:176;;;;:::o;38592:180::-;38640:77;38637:1;38630:88;38737:4;38734:1;38727:15;38761:4;38758:1;38751:15;38778:98;38829:6;38863:5;38857:12;38847:22;;38778:98;;;:::o;38882:168::-;38965:11;38999:6;38994:3;38987:19;39039:4;39034:3;39030:14;39015:29;;38882:168;;;;:::o;39056:373::-;39142:3;39170:38;39202:5;39170:38;:::i;:::-;39224:70;39287:6;39282:3;39224:70;:::i;:::-;39217:77;;39303:65;39361:6;39356:3;39349:4;39342:5;39338:16;39303:65;:::i;:::-;39393:29;39415:6;39393:29;:::i;:::-;39388:3;39384:39;39377:46;;39146:283;39056:373;;;;:::o;39435:640::-;39630:4;39668:3;39657:9;39653:19;39645:27;;39682:71;39750:1;39739:9;39735:17;39726:6;39682:71;:::i;:::-;39763:72;39831:2;39820:9;39816:18;39807:6;39763:72;:::i;:::-;39845;39913:2;39902:9;39898:18;39889:6;39845:72;:::i;:::-;39964:9;39958:4;39954:20;39949:2;39938:9;39934:18;39927:48;39992:76;40063:4;40054:6;39992:76;:::i;:::-;39984:84;;39435:640;;;;;;;:::o;40081:141::-;40137:5;40168:6;40162:13;40153:22;;40184:32;40210:5;40184:32;:::i;:::-;40081:141;;;;:::o;40228:349::-;40297:6;40346:2;40334:9;40325:7;40321:23;40317:32;40314:119;;;40352:79;;:::i;:::-;40314:119;40472:1;40497:63;40552:7;40543:6;40532:9;40528:22;40497:63;:::i;:::-;40487:73;;40443:127;40228:349;;;;:::o

Swarm Source

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