ETH Price: $3,916.77 (+0.86%)

Token

HangingMan NFT (HM)
 

Overview

Max Total Supply

3,333 HM

Holders

472

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
8 HM
0xa796176a8b5e861c183ff5619f65cfe6a8198888
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:
HangingMan

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;

library MerkleProof {
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    function processProof(bytes32[] memory proof, bytes32 leaf)
        internal
        pure
        returns (bytes32)
    {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b)
        private
        pure
        returns (bytes32 value)
    {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

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

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

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

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

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

abstract contract Ownable is Context {
    address private _owner;

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

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

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

    modifier onlyOwner() {
        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);
    }
}

library Address {
    function isContract(address account) internal view returns (bool) {
        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    function sendValue(address payable recipient, uint256 amount) internal {
        require(
            address(this).balance >= amount,
            "Address: insufficient balance"
        );

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

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

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

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

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

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

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

    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

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

    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            if (returndata.length > 0) {
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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

interface IERC165 {
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165).interfaceId;
    }
}

interface IERC721 is IERC165 {
    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
    ) external;

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

    function approve(address to, uint256 tokenId) external;

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

    function setApprovalForAll(address operator, bool _approved) external;

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

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

interface IERC721Enumerable is IERC721 {
    function totalSupply() external view returns (uint256);

    function tokenOfOwnerByIndex(address owner, uint256 index)
        external
        view
        returns (uint256 tokenId);

    function tokenByIndex(uint256 index) external view returns (uint256);
}

interface IERC721Metadata is IERC721 {
    function name() external view returns (string memory);

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

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

contract ERC721A is
    Context,
    ERC165,
    IERC721,
    IERC721Metadata,
    IERC721Enumerable
{
    using Address for address;
    using Strings for uint256;

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 private currentIndex = 1;

    uint256 internal immutable collectionSize;
    uint256 internal immutable maxBatchSize;
    string private _name;
    string private _symbol;
    mapping(uint256 => TokenOwnership) private _ownerships;
    mapping(address => AddressData) private _addressData;
    mapping(uint256 => address) private _tokenApprovals;
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    constructor(
        string memory name_,
        string memory symbol_,
        uint256 maxBatchSize_,
        uint256 collectionSize_
    ) {
        require(
            collectionSize_ > 0,
            "ERC721A: collection must have a nonzero supply"
        );
        require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
        _name = name_;
        _symbol = symbol_;
        maxBatchSize = maxBatchSize_;
        collectionSize = collectionSize_;
    }

    function totalSupply() public view override returns (uint256) {
        return currentIndex - 1;
    }

    function tokenByIndex(uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < totalSupply(), "ERC721A: global index out of bounds");
        return index;
    }

    function tokenOfOwnerByIndex(address owner, uint256 index)
        public
        view
        override
        returns (uint256)
    {
        require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
        uint256 numMintedSoFar = totalSupply();
        uint256 tokenIdsIdx = 0;
        address currOwnershipAddr = address(0);
        for (uint256 i = 0; i < numMintedSoFar; i++) {
            TokenOwnership memory ownership = _ownerships[i];
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                if (tokenIdsIdx == index) {
                    return i;
                }
                tokenIdsIdx++;
            }
        }
        revert("ERC721A: unable to get token of owner by index");
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(ERC165, IERC165)
        returns (bool)
    {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    function balanceOf(address owner) public view override returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: balance query for the zero address"
        );
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        require(
            owner != address(0),
            "ERC721A: number minted query for the zero address"
        );
        return uint256(_addressData[owner].numberMinted);
    }

    function ownershipOf(uint256 tokenId)
        internal
        view
        returns (TokenOwnership memory)
    {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

        uint256 lowestTokenToCheck;
        if (tokenId >= maxBatchSize) {
            lowestTokenToCheck = tokenId - maxBatchSize + 1;
        }

        for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
            TokenOwnership memory ownership = _ownerships[curr];
            if (ownership.addr != address(0)) {
                return ownership;
            }
        }

        revert("ERC721A: unable to determine the owner of token");
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

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

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

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

    function _getUriExtension() internal view virtual returns (string memory) {
        return "";
    }

    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        require(to != owner, "ERC721A: approval to current owner");

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

        _approve(to, tokenId, owner);
    }

    function getApproved(uint256 tokenId)
        public
        view
        override
        returns (address)
    {
        require(
            _exists(tokenId),
            "ERC721A: approved query for nonexistent token"
        );

        return _tokenApprovals[tokenId];
    }

    function setApprovalForAll(address operator, bool approved)
        public
        override
    {
        require(operator != _msgSender(), "ERC721A: approve to caller");

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

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

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        _transfer(from, to, tokenId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public override {
        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            "ERC721A: transfer to non ERC721Receiver implementer"
        );
    }

    function _exists(uint256 tokenId) internal view returns (bool) {
        return tokenId < currentIndex;
    }

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

    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), "ERC721A: mint to the zero address");
        require(!_exists(startTokenId), "ERC721A: token already minted");
        require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

        AddressData memory addressData = _addressData[to];
        _addressData[to] = AddressData(
            addressData.balance + uint128(quantity),
            addressData.numberMinted + uint128(quantity)
        );
        _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

        uint256 updatedIndex = startTokenId;

        for (uint256 i = 0; i < quantity; i++) {
            emit Transfer(address(0), to, updatedIndex);
            require(
                _checkOnERC721Received(address(0), to, updatedIndex, _data),
                "ERC721A: transfer to non ERC721Receiver implementer"
            );
            updatedIndex++;
        }

        currentIndex = updatedIndex;
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            getApproved(tokenId) == _msgSender() ||
            isApprovedForAll(prevOwnership.addr, _msgSender()));

        require(
            isApprovedOrOwner,
            "ERC721A: transfer caller is not owner nor approved"
        );

        require(
            prevOwnership.addr == from,
            "ERC721A: transfer from incorrect owner"
        );
        require(to != address(0), "ERC721A: transfer to the zero address");

        _beforeTokenTransfers(from, to, tokenId, 1);
        _approve(address(0), tokenId, prevOwnership.addr);

        _addressData[from].balance -= 1;
        _addressData[to].balance += 1;
        _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));
        uint256 nextTokenId = tokenId + 1;
        if (_ownerships[nextTokenId].addr == address(0)) {
            if (_exists(nextTokenId)) {
                _ownerships[nextTokenId] = TokenOwnership(
                    prevOwnership.addr,
                    prevOwnership.startTimestamp
                );
            }
        }

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

    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    uint256 public nextOwnerToExplicitlySet = 0;

    function _setOwnersExplicit(uint256 quantity) internal {
        uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
        require(quantity > 0, "quantity must be nonzero");
        uint256 endIndex = oldNextOwnerToSet + quantity - 1;
        if (endIndex > collectionSize - 1) {
            endIndex = collectionSize - 1;
        }
        require(_exists(endIndex), "not enough minted yet for this cleanup");
        for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
            if (_ownerships[i].addr == address(0)) {
                TokenOwnership memory ownership = ownershipOf(i);
                _ownerships[i] = TokenOwnership(
                    ownership.addr,
                    ownership.startTimestamp
                );
            }
        }
        nextOwnerToExplicitlySet = endIndex + 1;
    }

    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try
                IERC721Receiver(to).onERC721Received(
                    _msgSender(),
                    from,
                    tokenId,
                    _data
                )
            returns (bytes4 retval) {
                return retval == IERC721Receiver(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert(
                        "ERC721A: transfer to non ERC721Receiver implementer"
                    );
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

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

    uint256 public MAX_PER_Transaction = 20; // maximum amount that user can mint per transaction
    uint256 public MAX_PER_Address = 20;

    
    uint256 public price = 0 ether; 

    uint96 public royaltyFeesInBips;
    
    address public royaltyRecipient =
        0x2Be1466fCEFD2447Da41B4693a6356e06B450ea2;

    uint256 private constant TotalCollectionSize_ = 3333; 
    uint256 private constant MaxMintPerBatch_ = 255; //Required to reserve this amount in constructor.

    uint256 private reserveNFTs;
    uint16 private reserveLimit = 255;

    bool public whiteListIsActive = false;
    bool public privateListIsActive = false;
    
    bool public paused = false;
    bool public revealed = false;

    uint256 private whiteListSpots = 1000;
    uint256 private privateListSpots = 2000;

    string private baseTokenURI;
    string public notRevealedURI;

    address private teamWallet; 
    bytes32 public merkleRoot;

    constructor(
        string memory _uri, 
        string memory _hiddenURI, 
        uint96 _royaltyFeesInBips, 
        bytes32 _root, 
        address _teamWallet)
        ERC721A(
            "HangingMan NFT",
            "HM",
            MaxMintPerBatch_,
            TotalCollectionSize_
        )
    {
        
        setBaseURI(_uri);
        setNotRevealedURI(_hiddenURI);
        royaltyFeesInBips = _royaltyFeesInBips;
        merkleRoot = _root;
        teamWallet = _teamWallet;
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A)
        returns (bool)
    {
        return
            interfaceId == 0x2a55205a || super.supportsInterface(interfaceId);
    }

    function setMerkleRoot(bytes32 m) public onlyOwner {
        merkleRoot = m;
    }


    //Note: This function will revert unless the reserveLimit is changed.
    function reserveNFT(uint256 quantity) public onlyOwner {
        require(
            totalSupply() + quantity <= collectionSize,
            "reached max supply"
        );
        require(reserveNFTs + quantity <= reserveLimit, "Reserve limit exceeded.");
        reserveNFTs = reserveNFTs + quantity;
        _safeMint(teamWallet, quantity);
    }

    function mint(uint256 quantity) public payable {
        require(!paused, "mint is paused");
        require(!whiteListIsActive, "WL active. Public Minting not started");
        require(!privateListIsActive, "PL active. Public Minting not started");
        require(
            totalSupply() + quantity <= TotalCollectionSize_,
            "reached max supply"
        );
         require(quantity <= MAX_PER_Transaction, "can not mint this many");
        require(
            (numberMinted(msg.sender) + quantity <= MAX_PER_Address),
            "Quantity exceeds allowed Mints"
        );
        
        require(msg.value >= price * quantity, "Need to send more ETH.");
        _safeMint(msg.sender, quantity);
    }

    function presaleAndWhitelistMint(uint256 quantity, bytes32[] calldata merkleproof)
        public
        payable
    {
         require(!paused, "minting is paused");
         require(privateListIsActive || whiteListIsActive, "minting is public");
         require(
            totalSupply() + quantity <= TotalCollectionSize_,
            "reached max supply"
        );
        require(
            isValid(merkleproof, keccak256(abi.encodePacked(msg.sender))),
            "Not whitelisted"
        );
        require(
            (numberMinted(msg.sender) + quantity <= MAX_PER_Address),
            "Quantity exceeds allowed Mints"
        );
        require(quantity <= MAX_PER_Transaction, "can not mint this many");
        require(msg.value >= price * quantity, "Need to send more ETH.");

        if(whiteListIsActive) {
            require(
            totalSupply() + quantity <= whiteListSpots,
            "Whitelist sold out"
        );

        } else {
             require(
            totalSupply() + quantity <= privateListSpots,
            "Whitelist sold out"
             );
        }
        
        _safeMint(msg.sender, quantity);
    }

    function isValid(bytes32[] memory merkleproof, bytes32 leaf)
        public
        view
        returns (bool)
    {
        return MerkleProof.verify(merkleproof, merkleRoot, leaf);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        
           if (revealed) {
            string memory baseURI = _baseURI();
            return
                bytes(baseURI).length > 0
                    ? string(
                        abi.encodePacked(baseURI, tokenId.toString(), ".json")
                    )
                    : "";
        } else {
            return notRevealedURI;
        }
        
    }

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

    function setNotRevealedURI(string memory URI) public onlyOwner {
        notRevealedURI = URI;
    }

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

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId)
        external
        view
        returns (TokenOwnership memory)
    {
        return ownershipOf(tokenId);
    }

    function withdraw() public onlyOwner nonReentrant {
        // This will payout the owner the contract balance.
        // Do not remove this otherwise you will not be able to withdraw the funds.
        // =============================================================================
        (bool os, ) = payable(owner()).call{value: address(this).balance}("");
        require(os);
        // =============================================================================
    }

    

    function setPrice(uint256 _newPrice) public onlyOwner {
        price = _newPrice;
    }

    function setTeamWallet(address _newTeamWallet) public onlyOwner {
        teamWallet = _newTeamWallet;
    }

    /**
    Note: It may not be a good idea to be able to adjust the reserve limit if you want to be
    transparent with users.

    function setReserveLimit(uint256 _newLimit) public onlyOwner {
        reserveLimit = _newLimit;
    }

    */


    function setWhitelistLimit(uint256 _newLimit) public onlyOwner {
        whiteListSpots = _newLimit;
    }

    function setPrivateListLimit(uint256 _newLimit) public onlyOwner {
        privateListSpots = _newLimit;
    }


    function setMAX_PER_Transaction(uint256 _newLimit) public onlyOwner {
        MAX_PER_Transaction = _newLimit;
    }

    function setMAX_PER_Address(uint256 _newLimit) public onlyOwner {
        MAX_PER_Address = _newLimit;
    }

    function reveal() public onlyOwner {
        revealed = !revealed;
    }


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

    function setWhitelistActive(bool _state) public onlyOwner {
        whiteListIsActive = _state;
    }

    function setPrivateListActive(bool _state) public onlyOwner {
        privateListIsActive = _state;
    }


    function airdrop(address beneficiary, uint256 amount) public onlyOwner {
        require(beneficiary != address(0), "Cannot airdrop to zero address");
        _safeMint(beneficiary, amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_hiddenURI","type":"string"},{"internalType":"uint96","name":"_royaltyFeesInBips","type":"uint96"},{"internalType":"bytes32","name":"_root","type":"bytes32"},{"internalType":"address","name":"_teamWallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_Address","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_Transaction","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"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":[{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"},{"internalType":"bytes32","name":"leaf","type":"bytes32"}],"name":"isValid","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"},{"internalType":"bytes32[]","name":"merkleproof","type":"bytes32[]"}],"name":"presaleAndWhitelistMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateListIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reserveNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFeesInBips","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setMAX_PER_Address","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setMAX_PER_Transaction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"m","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPrivateListActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setPrivateListLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTeamWallet","type":"address"}],"name":"setTeamWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setWhitelistActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newLimit","type":"uint256"}],"name":"setWhitelistLimit","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":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"whiteListIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260018055600060088190556014600a819055600b55600c55600d80547f2be1466fcefd2447da41b4693a6356e06b450ea20000000000000000000000006001600160601b03909116179055600f805465ffffffffffff191660ff1790556103e86010556107d06011553480156200007a57600080fd5b50604051620038e7380380620038e78339810160408190526200009d91620004f1565b6040518060400160405280600e81526020016d12185b99da5b99d3585b8813919560921b81525060405180604001604052806002815260200161484d60f01b81525060ff610d05620000fe620000f86200026b60201b60201c565b6200026f565b600081116200016b5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001cd5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000162565b8351620001e29060029060208701906200037e565b508251620001f89060039060208601906200037e565b5060a091909152608052505060016009556200021485620002bf565b6200021f8462000323565b600d80546001600160601b0319166001600160601b039490941693909317909255601555601480546001600160a01b0319166001600160a01b0390921691909117905550620005e69050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000546001600160a01b031633146200030a5760405162461bcd60e51b81526020600482018190526024820152600080516020620038c7833981519152604482015260640162000162565b80516200031f9060129060208401906200037e565b5050565b6000546001600160a01b031633146200036e5760405162461bcd60e51b81526020600482018190526024820152600080516020620038c7833981519152604482015260640162000162565b80516200031f9060139060208401905b8280546200038c90620005a9565b90600052602060002090601f016020900481019282620003b05760008555620003fb565b82601f10620003cb57805160ff1916838001178555620003fb565b82800160010185558215620003fb579182015b82811115620003fb578251825591602001919060010190620003de565b50620004099291506200040d565b5090565b5b808211156200040957600081556001016200040e565b634e487b7160e01b600052604160045260246000fd5b600082601f8301126200044c57600080fd5b81516001600160401b038082111562000469576200046962000424565b604051601f8301601f19908116603f0116810190828211818310171562000494576200049462000424565b81604052838152602092508683858801011115620004b157600080fd5b600091505b83821015620004d55785820183015181830184015290820190620004b6565b83821115620004e75760008385830101525b9695505050505050565b600080600080600060a086880312156200050a57600080fd5b85516001600160401b03808211156200052257600080fd5b6200053089838a016200043a565b965060208801519150808211156200054757600080fd5b5062000556888289016200043a565b604088015190955090506001600160601b03811681146200057657600080fd5b6060870151608088015191945092506001600160a01b03811681146200059b57600080fd5b809150509295509295909350565b600181811c90821680620005be57607f821691505b60208210811415620005e057634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516132ad6200061a6000396000818161233e0152818161236801526128310152600061128f01526132ad6000f3fe6080604052600436106102ff5760003560e01c8063715018a611610190578063a475b5dd116100dc578063c87b56dd11610095578063dc33e6811161006f578063dc33e6811461090f578063e985e9c51461092f578063f2c4ce1e14610978578063f2fde38b1461099857600080fd5b8063c87b56dd146108b9578063d2521ae8146108d9578063d7224ba0146108f957600080fd5b8063a475b5dd14610804578063b507385f14610819578063b88d4fde14610839578063b8a20ed014610859578063c279726f14610879578063c3b754dc1461089957600080fd5b80638da5cb5b1161014957806395d89b411161012357806395d89b41146107a6578063a035b1fe146107bb578063a0712d68146107d1578063a22cb465146107e457600080fd5b80638da5cb5b1461071b57806391b7f5ed146107395780639231ab2a1461075957600080fd5b8063715018a61461064e578063722503801461066357806372c436761461067857806373c7400e146106995780637cb64759146106db5780638ba4cc3c146106fb57600080fd5b80632f2ffc571161024f5780634f6ccce71161020857806355f804b3116101e257806355f804b3146105cc5780635c975abb146105ec5780636352211e1461060e57806370a082311461062e57600080fd5b80634f6ccce714610573578063518302271461059357806351d7ff93146105b657600080fd5b80632f2ffc57146104c15780632f745c59146104d7578063397be3fd146104f75780633ccfd60b1461051757806342842e0e1461052c5780634c00de821461054c57600080fd5b80631525ff7d116102bc57806325dc45ce1161029657806325dc45ce1461044b57806327372f0f1461046b5780632b1b615b1461048b5780632eb4a7ab146104ab57600080fd5b80631525ff7d146103e857806318160ddd1461040857806323b872dd1461042b57600080fd5b806301ffc9a71461030457806302329a291461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b55780630e4e6638146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612b68565b6109b8565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612b95565b6109e3565b005b34801561036757600080fd5b50610370610a36565b6040516103309190612c08565b34801561038957600080fd5b5061039d610398366004612c1b565b610ac8565b6040516001600160a01b039091168152602001610330565b3480156103c157600080fd5b506103596103d0366004612c4b565b610b53565b6103596103e3366004612c75565b610c6b565b3480156103f457600080fd5b50610359610403366004612cf3565b610fda565b34801561041457600080fd5b5061041d611026565b604051908152602001610330565b34801561043757600080fd5b50610359610446366004612d0e565b61103b565b34801561045757600080fd5b50610359610466366004612c1b565b611046565b34801561047757600080fd5b50610359610486366004612b95565b611075565b34801561049757600080fd5b506103596104a6366004612c1b565b6110bd565b3480156104b757600080fd5b5061041d60155481565b3480156104cd57600080fd5b5061041d600b5481565b3480156104e357600080fd5b5061041d6104f2366004612c4b565b6110ec565b34801561050357600080fd5b50610359610512366004612c1b565b611263565b34801561052357600080fd5b5061035961136f565b34801561053857600080fd5b50610359610547366004612d0e565b611459565b34801561055857600080fd5b50600d5461039d90600160601b90046001600160a01b031681565b34801561057f57600080fd5b5061041d61058e366004612c1b565b611474565b34801561059f57600080fd5b50600f546103249065010000000000900460ff1681565b3480156105c257600080fd5b5061041d600a5481565b3480156105d857600080fd5b506103596105e7366004612de7565b6114dc565b3480156105f857600080fd5b50600f5461032490640100000000900460ff1681565b34801561061a57600080fd5b5061039d610629366004612c1b565b61151d565b34801561063a57600080fd5b5061041d610649366004612cf3565b61152f565b34801561065a57600080fd5b506103596115c0565b34801561066f57600080fd5b506103706115f6565b34801561068457600080fd5b50600f54610324906301000000900460ff1681565b3480156106a557600080fd5b50600d546106be906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff9091168152602001610330565b3480156106e757600080fd5b506103596106f6366004612c1b565b611684565b34801561070757600080fd5b50610359610716366004612c4b565b6116b3565b34801561072757600080fd5b506000546001600160a01b031661039d565b34801561074557600080fd5b50610359610754366004612c1b565b61173d565b34801561076557600080fd5b50610779610774366004612c1b565b61176c565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610330565b3480156107b257600080fd5b50610370611789565b3480156107c757600080fd5b5061041d600c5481565b6103596107df366004612c1b565b611798565b3480156107f057600080fd5b506103596107ff366004612e2f565b6119f7565b34801561081057600080fd5b50610359611abc565b34801561082557600080fd5b50610359610834366004612c1b565b611b0b565b34801561084557600080fd5b50610359610854366004612e62565b611b3a565b34801561086557600080fd5b50610324610874366004612edd565b611b73565b34801561088557600080fd5b50600f546103249062010000900460ff1681565b3480156108a557600080fd5b506103596108b4366004612b95565b611b89565b3480156108c557600080fd5b506103706108d4366004612c1b565b611bcf565b3480156108e557600080fd5b506103596108f4366004612c1b565b611d46565b34801561090557600080fd5b5061041d60085481565b34801561091b57600080fd5b5061041d61092a366004612cf3565b611d75565b34801561093b57600080fd5b5061032461094a366004612f88565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561098457600080fd5b50610359610993366004612de7565b611d80565b3480156109a457600080fd5b506103596109b3366004612cf3565b611dbd565b600063152a902d60e11b6001600160e01b0319831614806109dd57506109dd82611e55565b92915050565b6000546001600160a01b03163314610a165760405162461bcd60e51b8152600401610a0d90612fb2565b60405180910390fd5b600f80549115156401000000000264ff0000000019909216919091179055565b606060028054610a4590612fe7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7190612fe7565b8015610abe5780601f10610a9357610100808354040283529160200191610abe565b820191906000526020600020905b815481529060010190602001808311610aa157829003601f168201915b5050505050905090565b6000610ad5826001541190565b610b375760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610a0d565b506000908152600660205260409020546001600160a01b031690565b6000610b5e8261151d565b9050806001600160a01b0316836001600160a01b03161415610bcd5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610a0d565b336001600160a01b0382161480610be95750610be9813361094a565b610c5b5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610a0d565b610c66838383611ec0565b505050565b600f54640100000000900460ff1615610cba5760405162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610a0d565b600f546301000000900460ff1680610cda5750600f5462010000900460ff165b610d1a5760405162461bcd60e51b81526020600482015260116024820152706d696e74696e67206973207075626c696360781b6044820152606401610a0d565b610d0583610d26611026565b610d309190613038565b1115610d4e5760405162461bcd60e51b8152600401610a0d90613050565b610dc4828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b1660208201526034019150610da99050565b60405160208183030381529060405280519060200120611b73565b610e025760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610a0d565b600b5483610e0f33611d75565b610e199190613038565b1115610e675760405162461bcd60e51b815260206004820152601e60248201527f5175616e74697479206578636565647320616c6c6f776564204d696e747300006044820152606401610a0d565b600a54831115610eb25760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a0d565b82600c54610ec0919061307c565b341015610f085760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610a0d565b600f5462010000900460ff1615610f775760105483610f25611026565b610f2f9190613038565b1115610f725760405162461bcd60e51b815260206004820152601260248201527115da1a5d195b1a5cdd081cdbdb19081bdd5d60721b6044820152606401610a0d565b610fd0565b60115483610f83611026565b610f8d9190613038565b1115610fd05760405162461bcd60e51b815260206004820152601260248201527115da1a5d195b1a5cdd081cdbdb19081bdd5d60721b6044820152606401610a0d565b610c663384611f1c565b6000546001600160a01b031633146110045760405162461bcd60e51b8152600401610a0d90612fb2565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600060018054611036919061309b565b905090565b610c66838383611f36565b6000546001600160a01b031633146110705760405162461bcd60e51b8152600401610a0d90612fb2565b600a55565b6000546001600160a01b0316331461109f5760405162461bcd60e51b8152600401610a0d90612fb2565b600f805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b031633146110e75760405162461bcd60e51b8152600401610a0d90612fb2565b600b55565b60006110f78361152f565b82106111505760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610a0d565b600061115a611026565b905060008060005b83811015611203576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156111b457805192505b876001600160a01b0316836001600160a01b031614156111f057868414156111e2575093506109dd92505050565b836111ec816130b2565b9450505b50806111fb816130b2565b915050611162565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610a0d565b6000546001600160a01b0316331461128d5760405162461bcd60e51b8152600401610a0d90612fb2565b7f0000000000000000000000000000000000000000000000000000000000000000816112b7611026565b6112c19190613038565b11156112df5760405162461bcd60e51b8152600401610a0d90613050565b600f54600e5461ffff909116906112f7908390613038565b11156113455760405162461bcd60e51b815260206004820152601760248201527f52657365727665206c696d69742065786365656465642e0000000000000000006044820152606401610a0d565b80600e546113539190613038565b600e5560145461136c906001600160a01b031682611f1c565b50565b6000546001600160a01b031633146113995760405162461bcd60e51b8152600401610a0d90612fb2565b600260095414156113ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a0d565b6002600955600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461143e576040519150601f19603f3d011682016040523d82523d6000602084013e611443565b606091505b505090508061145157600080fd5b506001600955565b610c6683838360405180602001604052806000815250611b3a565b600061147e611026565b82106114d85760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610a0d565b5090565b6000546001600160a01b031633146115065760405162461bcd60e51b8152600401610a0d90612fb2565b8051611519906012906020840190612ac2565b5050565b6000611528826122bc565b5192915050565b60006001600160a01b03821661159b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610a0d565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610a0d90612fb2565b6115f46000612465565b565b6013805461160390612fe7565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612fe7565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b505050505081565b6000546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610a0d90612fb2565b601555565b6000546001600160a01b031633146116dd5760405162461bcd60e51b8152600401610a0d90612fb2565b6001600160a01b0382166117335760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f742061697264726f7020746f207a65726f206164647265737300006044820152606401610a0d565b6115198282611f1c565b6000546001600160a01b031633146117675760405162461bcd60e51b8152600401610a0d90612fb2565b600c55565b60408051808201909152600080825260208201526109dd826122bc565b606060038054610a4590612fe7565b600f54640100000000900460ff16156117e45760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b6044820152606401610a0d565b600f5462010000900460ff161561184b5760405162461bcd60e51b815260206004820152602560248201527f574c206163746976652e205075626c6963204d696e74696e67206e6f74207374604482015264185c9d195960da1b6064820152608401610a0d565b600f546301000000900460ff16156118b35760405162461bcd60e51b815260206004820152602560248201527f504c206163746976652e205075626c6963204d696e74696e67206e6f74207374604482015264185c9d195960da1b6064820152608401610a0d565b610d05816118bf611026565b6118c99190613038565b11156118e75760405162461bcd60e51b8152600401610a0d90613050565b600a548111156119325760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a0d565b600b548161193f33611d75565b6119499190613038565b11156119975760405162461bcd60e51b815260206004820152601e60248201527f5175616e74697479206578636565647320616c6c6f776564204d696e747300006044820152606401610a0d565b80600c546119a5919061307c565b3410156119ed5760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610a0d565b61136c3382611f1c565b6001600160a01b038216331415611a505760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610a0d565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611ae65760405162461bcd60e51b8152600401610a0d90612fb2565b600f805465ff0000000000198116650100000000009182900460ff1615909102179055565b6000546001600160a01b03163314611b355760405162461bcd60e51b8152600401610a0d90612fb2565b601155565b611b45848484611f36565b611b51848484846124b5565b611b6d5760405162461bcd60e51b8152600401610a0d906130cd565b50505050565b6000611b8283601554846125b4565b9392505050565b6000546001600160a01b03163314611bb35760405162461bcd60e51b8152600401610a0d90612fb2565b600f8054911515620100000262ff000019909216919091179055565b6060611bdc826001541190565b611c405760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a0d565b600f5465010000000000900460ff1615611caf576000611c5e6125ca565b90506000815111611c7e5760405180602001604052806000815250611b82565b80611c88846125d9565b604051602001611c99929190613120565b6040516020818303038152906040529392505050565b60138054611cbc90612fe7565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce890612fe7565b8015611d355780601f10611d0a57610100808354040283529160200191611d35565b820191906000526020600020905b815481529060010190602001808311611d1857829003601f168201915b50505050509050919050565b919050565b6000546001600160a01b03163314611d705760405162461bcd60e51b8152600401610a0d90612fb2565b601055565b60006109dd826126d6565b6000546001600160a01b03163314611daa5760405162461bcd60e51b8152600401610a0d90612fb2565b8051611519906013906020840190612ac2565b6000546001600160a01b03163314611de75760405162461bcd60e51b8152600401610a0d90612fb2565b6001600160a01b038116611e4c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a0d565b61136c81612465565b60006001600160e01b031982166380ac58cd60e01b1480611e8657506001600160e01b03198216635b5e139f60e01b145b80611ea157506001600160e01b0319821663780e9d6360e01b145b806109dd57506301ffc9a760e01b6001600160e01b03198316146109dd565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611519828260405180602001604052806000815250612774565b6000611f41826122bc565b80519091506000906001600160a01b0316336001600160a01b03161480611f78575033611f6d84610ac8565b6001600160a01b0316145b80611f8a57508151611f8a903361094a565b905080611ff45760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a0d565b846001600160a01b031682600001516001600160a01b0316146120685760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610a0d565b6001600160a01b0384166120cc5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610a0d565b6120dc6000848460000151611ec0565b6001600160a01b038516600090815260056020526040812080546001929061210e9084906001600160801b031661315f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600560205260408120805460019450909261215a91859116613187565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121e1846001613038565b6000818152600460205260409020549091506001600160a01b03166122725761220b816001541190565b156122725760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60408051808201909152600080825260208201526122db826001541190565b61233a5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610a0d565b60007f0000000000000000000000000000000000000000000000000000000000000000831061239b5761238d7f00000000000000000000000000000000000000000000000000000000000000008461309b565b612398906001613038565b90505b825b818110612404576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156123f157949350505050565b50806123fc816131b2565b91505061239d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610a0d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156125a857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124f99033908990889088906004016131c9565b6020604051808303816000875af1925050508015612534575060408051601f3d908101601f1916820190925261253191810190613206565b60015b61258e573d808015612562576040519150601f19603f3d011682016040523d82523d6000602084013e612567565b606091505b5080516125865760405162461bcd60e51b8152600401610a0d906130cd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506125ac565b5060015b949350505050565b6000826125c18584612a4e565b14949350505050565b606060128054610a4590612fe7565b6060816125fd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126275780612611816130b2565b91506126209050600a83613239565b9150612601565b6000816001600160401b0381111561264157612641612d4a565b6040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b5090505b84156125ac5761268060018361309b565b915061268d600a8661324d565b612698906030613038565b60f81b8183815181106126ad576126ad613261565b60200101906001600160f81b031916908160001a9053506126cf600a86613239565b945061266f565b60006001600160a01b0382166127485760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610a0d565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0384166127d75760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610a0d565b6127e2816001541190565b1561282f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610a0d565b7f00000000000000000000000000000000000000000000000000000000000000008311156128aa5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610a0d565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612906908790613187565b6001600160801b031681526020018583602001516129249190613187565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612a435760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612a0760008884886124b5565b612a235760405162461bcd60e51b8152600401610a0d906130cd565b81612a2d816130b2565b9250508080612a3b906130b2565b9150506129ba565b5060018190556122b4565b600081815b8451811015612aba576000858281518110612a7057612a70613261565b60200260200101519050808311612a965760008381526020829052604090209250612aa7565b600081815260208490526040902092505b5080612ab2816130b2565b915050612a53565b509392505050565b828054612ace90612fe7565b90600052602060002090601f016020900481019282612af05760008555612b36565b82601f10612b0957805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b36578251825591602001919060010190612b1b565b506114d89291505b808211156114d85760008155600101612b3e565b6001600160e01b03198116811461136c57600080fd5b600060208284031215612b7a57600080fd5b8135611b8281612b52565b80358015158114611d4157600080fd5b600060208284031215612ba757600080fd5b611b8282612b85565b60005b83811015612bcb578181015183820152602001612bb3565b83811115611b6d5750506000910152565b60008151808452612bf4816020860160208601612bb0565b601f01601f19169290920160200192915050565b602081526000611b826020830184612bdc565b600060208284031215612c2d57600080fd5b5035919050565b80356001600160a01b0381168114611d4157600080fd5b60008060408385031215612c5e57600080fd5b612c6783612c34565b946020939093013593505050565b600080600060408486031215612c8a57600080fd5b8335925060208401356001600160401b0380821115612ca857600080fd5b818601915086601f830112612cbc57600080fd5b813581811115612ccb57600080fd5b8760208260051b8501011115612ce057600080fd5b6020830194508093505050509250925092565b600060208284031215612d0557600080fd5b611b8282612c34565b600080600060608486031215612d2357600080fd5b612d2c84612c34565b9250612d3a60208501612c34565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d8857612d88612d4a565b604052919050565b60006001600160401b03831115612da957612da9612d4a565b612dbc601f8401601f1916602001612d60565b9050828152838383011115612dd057600080fd5b828260208301376000602084830101529392505050565b600060208284031215612df957600080fd5b81356001600160401b03811115612e0f57600080fd5b8201601f81018413612e2057600080fd5b6125ac84823560208401612d90565b60008060408385031215612e4257600080fd5b612e4b83612c34565b9150612e5960208401612b85565b90509250929050565b60008060008060808587031215612e7857600080fd5b612e8185612c34565b9350612e8f60208601612c34565b92506040850135915060608501356001600160401b03811115612eb157600080fd5b8501601f81018713612ec257600080fd5b612ed187823560208401612d90565b91505092959194509250565b60008060408385031215612ef057600080fd5b82356001600160401b0380821115612f0757600080fd5b818501915085601f830112612f1b57600080fd5b8135602082821115612f2f57612f2f612d4a565b8160051b9250612f40818401612d60565b8281529284018101928181019089851115612f5a57600080fd5b948201945b84861015612f7857853582529482019490820190612f5f565b9997909101359750505050505050565b60008060408385031215612f9b57600080fd5b612fa483612c34565b9150612e5960208401612c34565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ffb57607f821691505b6020821081141561301c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561304b5761304b613022565b500190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b600081600019048311821515161561309657613096613022565b500290565b6000828210156130ad576130ad613022565b500390565b60006000198214156130c6576130c6613022565b5060010190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613132818460208801612bb0565b835190830190613146818360208801612bb0565b64173539b7b760d91b9101908152600501949350505050565b60006001600160801b038381169083168181101561317f5761317f613022565b039392505050565b60006001600160801b038083168185168083038211156131a9576131a9613022565b01949350505050565b6000816131c1576131c1613022565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131fc90830184612bdc565b9695505050505050565b60006020828403121561321857600080fd5b8151611b8281612b52565b634e487b7160e01b600052601260045260246000fd5b60008261324857613248613223565b500490565b60008261325c5761325c613223565b500690565b634e487b7160e01b600052603260045260246000fdfea26469706673582212204afa210c33cf12624995bcdf8f1f180b49501289e74ec89da7bfa9b8bd60baab64736f6c634300080b00334f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657200000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000002be1466fcefd2447da41b4693a6356e06b450ea20000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51735a66344a7462566e585631397862714666786a615648624853636958657936314d76556b4571506659472f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d51735a66344a7462566e585631397862714666786a615648624853636958657936314d76556b4571506659472f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102ff5760003560e01c8063715018a611610190578063a475b5dd116100dc578063c87b56dd11610095578063dc33e6811161006f578063dc33e6811461090f578063e985e9c51461092f578063f2c4ce1e14610978578063f2fde38b1461099857600080fd5b8063c87b56dd146108b9578063d2521ae8146108d9578063d7224ba0146108f957600080fd5b8063a475b5dd14610804578063b507385f14610819578063b88d4fde14610839578063b8a20ed014610859578063c279726f14610879578063c3b754dc1461089957600080fd5b80638da5cb5b1161014957806395d89b411161012357806395d89b41146107a6578063a035b1fe146107bb578063a0712d68146107d1578063a22cb465146107e457600080fd5b80638da5cb5b1461071b57806391b7f5ed146107395780639231ab2a1461075957600080fd5b8063715018a61461064e578063722503801461066357806372c436761461067857806373c7400e146106995780637cb64759146106db5780638ba4cc3c146106fb57600080fd5b80632f2ffc571161024f5780634f6ccce71161020857806355f804b3116101e257806355f804b3146105cc5780635c975abb146105ec5780636352211e1461060e57806370a082311461062e57600080fd5b80634f6ccce714610573578063518302271461059357806351d7ff93146105b657600080fd5b80632f2ffc57146104c15780632f745c59146104d7578063397be3fd146104f75780633ccfd60b1461051757806342842e0e1461052c5780634c00de821461054c57600080fd5b80631525ff7d116102bc57806325dc45ce1161029657806325dc45ce1461044b57806327372f0f1461046b5780632b1b615b1461048b5780632eb4a7ab146104ab57600080fd5b80631525ff7d146103e857806318160ddd1461040857806323b872dd1461042b57600080fd5b806301ffc9a71461030457806302329a291461033957806306fdde031461035b578063081812fc1461037d578063095ea7b3146103b55780630e4e6638146103d5575b600080fd5b34801561031057600080fd5b5061032461031f366004612b68565b6109b8565b60405190151581526020015b60405180910390f35b34801561034557600080fd5b50610359610354366004612b95565b6109e3565b005b34801561036757600080fd5b50610370610a36565b6040516103309190612c08565b34801561038957600080fd5b5061039d610398366004612c1b565b610ac8565b6040516001600160a01b039091168152602001610330565b3480156103c157600080fd5b506103596103d0366004612c4b565b610b53565b6103596103e3366004612c75565b610c6b565b3480156103f457600080fd5b50610359610403366004612cf3565b610fda565b34801561041457600080fd5b5061041d611026565b604051908152602001610330565b34801561043757600080fd5b50610359610446366004612d0e565b61103b565b34801561045757600080fd5b50610359610466366004612c1b565b611046565b34801561047757600080fd5b50610359610486366004612b95565b611075565b34801561049757600080fd5b506103596104a6366004612c1b565b6110bd565b3480156104b757600080fd5b5061041d60155481565b3480156104cd57600080fd5b5061041d600b5481565b3480156104e357600080fd5b5061041d6104f2366004612c4b565b6110ec565b34801561050357600080fd5b50610359610512366004612c1b565b611263565b34801561052357600080fd5b5061035961136f565b34801561053857600080fd5b50610359610547366004612d0e565b611459565b34801561055857600080fd5b50600d5461039d90600160601b90046001600160a01b031681565b34801561057f57600080fd5b5061041d61058e366004612c1b565b611474565b34801561059f57600080fd5b50600f546103249065010000000000900460ff1681565b3480156105c257600080fd5b5061041d600a5481565b3480156105d857600080fd5b506103596105e7366004612de7565b6114dc565b3480156105f857600080fd5b50600f5461032490640100000000900460ff1681565b34801561061a57600080fd5b5061039d610629366004612c1b565b61151d565b34801561063a57600080fd5b5061041d610649366004612cf3565b61152f565b34801561065a57600080fd5b506103596115c0565b34801561066f57600080fd5b506103706115f6565b34801561068457600080fd5b50600f54610324906301000000900460ff1681565b3480156106a557600080fd5b50600d546106be906bffffffffffffffffffffffff1681565b6040516bffffffffffffffffffffffff9091168152602001610330565b3480156106e757600080fd5b506103596106f6366004612c1b565b611684565b34801561070757600080fd5b50610359610716366004612c4b565b6116b3565b34801561072757600080fd5b506000546001600160a01b031661039d565b34801561074557600080fd5b50610359610754366004612c1b565b61173d565b34801561076557600080fd5b50610779610774366004612c1b565b61176c565b6040805182516001600160a01b031681526020928301516001600160401b03169281019290925201610330565b3480156107b257600080fd5b50610370611789565b3480156107c757600080fd5b5061041d600c5481565b6103596107df366004612c1b565b611798565b3480156107f057600080fd5b506103596107ff366004612e2f565b6119f7565b34801561081057600080fd5b50610359611abc565b34801561082557600080fd5b50610359610834366004612c1b565b611b0b565b34801561084557600080fd5b50610359610854366004612e62565b611b3a565b34801561086557600080fd5b50610324610874366004612edd565b611b73565b34801561088557600080fd5b50600f546103249062010000900460ff1681565b3480156108a557600080fd5b506103596108b4366004612b95565b611b89565b3480156108c557600080fd5b506103706108d4366004612c1b565b611bcf565b3480156108e557600080fd5b506103596108f4366004612c1b565b611d46565b34801561090557600080fd5b5061041d60085481565b34801561091b57600080fd5b5061041d61092a366004612cf3565b611d75565b34801561093b57600080fd5b5061032461094a366004612f88565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b34801561098457600080fd5b50610359610993366004612de7565b611d80565b3480156109a457600080fd5b506103596109b3366004612cf3565b611dbd565b600063152a902d60e11b6001600160e01b0319831614806109dd57506109dd82611e55565b92915050565b6000546001600160a01b03163314610a165760405162461bcd60e51b8152600401610a0d90612fb2565b60405180910390fd5b600f80549115156401000000000264ff0000000019909216919091179055565b606060028054610a4590612fe7565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7190612fe7565b8015610abe5780601f10610a9357610100808354040283529160200191610abe565b820191906000526020600020905b815481529060010190602001808311610aa157829003601f168201915b5050505050905090565b6000610ad5826001541190565b610b375760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610a0d565b506000908152600660205260409020546001600160a01b031690565b6000610b5e8261151d565b9050806001600160a01b0316836001600160a01b03161415610bcd5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610a0d565b336001600160a01b0382161480610be95750610be9813361094a565b610c5b5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610a0d565b610c66838383611ec0565b505050565b600f54640100000000900460ff1615610cba5760405162461bcd60e51b81526020600482015260116024820152701b5a5b9d1a5b99c81a5cc81c185d5cd959607a1b6044820152606401610a0d565b600f546301000000900460ff1680610cda5750600f5462010000900460ff165b610d1a5760405162461bcd60e51b81526020600482015260116024820152706d696e74696e67206973207075626c696360781b6044820152606401610a0d565b610d0583610d26611026565b610d309190613038565b1115610d4e5760405162461bcd60e51b8152600401610a0d90613050565b610dc4828280806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250506040516bffffffffffffffffffffffff193360601b1660208201526034019150610da99050565b60405160208183030381529060405280519060200120611b73565b610e025760405162461bcd60e51b815260206004820152600f60248201526e139bdd081dda1a5d195b1a5cdd1959608a1b6044820152606401610a0d565b600b5483610e0f33611d75565b610e199190613038565b1115610e675760405162461bcd60e51b815260206004820152601e60248201527f5175616e74697479206578636565647320616c6c6f776564204d696e747300006044820152606401610a0d565b600a54831115610eb25760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a0d565b82600c54610ec0919061307c565b341015610f085760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610a0d565b600f5462010000900460ff1615610f775760105483610f25611026565b610f2f9190613038565b1115610f725760405162461bcd60e51b815260206004820152601260248201527115da1a5d195b1a5cdd081cdbdb19081bdd5d60721b6044820152606401610a0d565b610fd0565b60115483610f83611026565b610f8d9190613038565b1115610fd05760405162461bcd60e51b815260206004820152601260248201527115da1a5d195b1a5cdd081cdbdb19081bdd5d60721b6044820152606401610a0d565b610c663384611f1c565b6000546001600160a01b031633146110045760405162461bcd60e51b8152600401610a0d90612fb2565b601480546001600160a01b0319166001600160a01b0392909216919091179055565b600060018054611036919061309b565b905090565b610c66838383611f36565b6000546001600160a01b031633146110705760405162461bcd60e51b8152600401610a0d90612fb2565b600a55565b6000546001600160a01b0316331461109f5760405162461bcd60e51b8152600401610a0d90612fb2565b600f805491151563010000000263ff00000019909216919091179055565b6000546001600160a01b031633146110e75760405162461bcd60e51b8152600401610a0d90612fb2565b600b55565b60006110f78361152f565b82106111505760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610a0d565b600061115a611026565b905060008060005b83811015611203576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156111b457805192505b876001600160a01b0316836001600160a01b031614156111f057868414156111e2575093506109dd92505050565b836111ec816130b2565b9450505b50806111fb816130b2565b915050611162565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610a0d565b6000546001600160a01b0316331461128d5760405162461bcd60e51b8152600401610a0d90612fb2565b7f0000000000000000000000000000000000000000000000000000000000000d05816112b7611026565b6112c19190613038565b11156112df5760405162461bcd60e51b8152600401610a0d90613050565b600f54600e5461ffff909116906112f7908390613038565b11156113455760405162461bcd60e51b815260206004820152601760248201527f52657365727665206c696d69742065786365656465642e0000000000000000006044820152606401610a0d565b80600e546113539190613038565b600e5560145461136c906001600160a01b031682611f1c565b50565b6000546001600160a01b031633146113995760405162461bcd60e51b8152600401610a0d90612fb2565b600260095414156113ec5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a0d565b6002600955600080546040516001600160a01b039091169047908381818185875af1925050503d806000811461143e576040519150601f19603f3d011682016040523d82523d6000602084013e611443565b606091505b505090508061145157600080fd5b506001600955565b610c6683838360405180602001604052806000815250611b3a565b600061147e611026565b82106114d85760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610a0d565b5090565b6000546001600160a01b031633146115065760405162461bcd60e51b8152600401610a0d90612fb2565b8051611519906012906020840190612ac2565b5050565b6000611528826122bc565b5192915050565b60006001600160a01b03821661159b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610a0d565b506001600160a01b03166000908152600560205260409020546001600160801b031690565b6000546001600160a01b031633146115ea5760405162461bcd60e51b8152600401610a0d90612fb2565b6115f46000612465565b565b6013805461160390612fe7565b80601f016020809104026020016040519081016040528092919081815260200182805461162f90612fe7565b801561167c5780601f106116515761010080835404028352916020019161167c565b820191906000526020600020905b81548152906001019060200180831161165f57829003601f168201915b505050505081565b6000546001600160a01b031633146116ae5760405162461bcd60e51b8152600401610a0d90612fb2565b601555565b6000546001600160a01b031633146116dd5760405162461bcd60e51b8152600401610a0d90612fb2565b6001600160a01b0382166117335760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f742061697264726f7020746f207a65726f206164647265737300006044820152606401610a0d565b6115198282611f1c565b6000546001600160a01b031633146117675760405162461bcd60e51b8152600401610a0d90612fb2565b600c55565b60408051808201909152600080825260208201526109dd826122bc565b606060038054610a4590612fe7565b600f54640100000000900460ff16156117e45760405162461bcd60e51b815260206004820152600e60248201526d1b5a5b9d081a5cc81c185d5cd95960921b6044820152606401610a0d565b600f5462010000900460ff161561184b5760405162461bcd60e51b815260206004820152602560248201527f574c206163746976652e205075626c6963204d696e74696e67206e6f74207374604482015264185c9d195960da1b6064820152608401610a0d565b600f546301000000900460ff16156118b35760405162461bcd60e51b815260206004820152602560248201527f504c206163746976652e205075626c6963204d696e74696e67206e6f74207374604482015264185c9d195960da1b6064820152608401610a0d565b610d05816118bf611026565b6118c99190613038565b11156118e75760405162461bcd60e51b8152600401610a0d90613050565b600a548111156119325760405162461bcd60e51b815260206004820152601660248201527563616e206e6f74206d696e742074686973206d616e7960501b6044820152606401610a0d565b600b548161193f33611d75565b6119499190613038565b11156119975760405162461bcd60e51b815260206004820152601e60248201527f5175616e74697479206578636565647320616c6c6f776564204d696e747300006044820152606401610a0d565b80600c546119a5919061307c565b3410156119ed5760405162461bcd60e51b81526020600482015260166024820152752732b2b2103a379039b2b7321036b7b9329022aa241760511b6044820152606401610a0d565b61136c3382611f1c565b6001600160a01b038216331415611a505760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610a0d565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000546001600160a01b03163314611ae65760405162461bcd60e51b8152600401610a0d90612fb2565b600f805465ff0000000000198116650100000000009182900460ff1615909102179055565b6000546001600160a01b03163314611b355760405162461bcd60e51b8152600401610a0d90612fb2565b601155565b611b45848484611f36565b611b51848484846124b5565b611b6d5760405162461bcd60e51b8152600401610a0d906130cd565b50505050565b6000611b8283601554846125b4565b9392505050565b6000546001600160a01b03163314611bb35760405162461bcd60e51b8152600401610a0d90612fb2565b600f8054911515620100000262ff000019909216919091179055565b6060611bdc826001541190565b611c405760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610a0d565b600f5465010000000000900460ff1615611caf576000611c5e6125ca565b90506000815111611c7e5760405180602001604052806000815250611b82565b80611c88846125d9565b604051602001611c99929190613120565b6040516020818303038152906040529392505050565b60138054611cbc90612fe7565b80601f0160208091040260200160405190810160405280929190818152602001828054611ce890612fe7565b8015611d355780601f10611d0a57610100808354040283529160200191611d35565b820191906000526020600020905b815481529060010190602001808311611d1857829003601f168201915b50505050509050919050565b919050565b6000546001600160a01b03163314611d705760405162461bcd60e51b8152600401610a0d90612fb2565b601055565b60006109dd826126d6565b6000546001600160a01b03163314611daa5760405162461bcd60e51b8152600401610a0d90612fb2565b8051611519906013906020840190612ac2565b6000546001600160a01b03163314611de75760405162461bcd60e51b8152600401610a0d90612fb2565b6001600160a01b038116611e4c5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a0d565b61136c81612465565b60006001600160e01b031982166380ac58cd60e01b1480611e8657506001600160e01b03198216635b5e139f60e01b145b80611ea157506001600160e01b0319821663780e9d6360e01b145b806109dd57506301ffc9a760e01b6001600160e01b03198316146109dd565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b611519828260405180602001604052806000815250612774565b6000611f41826122bc565b80519091506000906001600160a01b0316336001600160a01b03161480611f78575033611f6d84610ac8565b6001600160a01b0316145b80611f8a57508151611f8a903361094a565b905080611ff45760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610a0d565b846001600160a01b031682600001516001600160a01b0316146120685760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610a0d565b6001600160a01b0384166120cc5760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610a0d565b6120dc6000848460000151611ec0565b6001600160a01b038516600090815260056020526040812080546001929061210e9084906001600160801b031661315f565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b0386166000908152600560205260408120805460019450909261215a91859116613187565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526004909152948520935184549151909216600160a01b026001600160e01b031990911691909216171790556121e1846001613038565b6000818152600460205260409020549091506001600160a01b03166122725761220b816001541190565b156122725760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600490935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60408051808201909152600080825260208201526122db826001541190565b61233a5760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610a0d565b60007f00000000000000000000000000000000000000000000000000000000000000ff831061239b5761238d7f00000000000000000000000000000000000000000000000000000000000000ff8461309b565b612398906001613038565b90505b825b818110612404576000818152600460209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b031691830191909152156123f157949350505050565b50806123fc816131b2565b91505061239d565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610a0d565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006001600160a01b0384163b156125a857604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906124f99033908990889088906004016131c9565b6020604051808303816000875af1925050508015612534575060408051601f3d908101601f1916820190925261253191810190613206565b60015b61258e573d808015612562576040519150601f19603f3d011682016040523d82523d6000602084013e612567565b606091505b5080516125865760405162461bcd60e51b8152600401610a0d906130cd565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506125ac565b5060015b949350505050565b6000826125c18584612a4e565b14949350505050565b606060128054610a4590612fe7565b6060816125fd5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126275780612611816130b2565b91506126209050600a83613239565b9150612601565b6000816001600160401b0381111561264157612641612d4a565b6040519080825280601f01601f19166020018201604052801561266b576020820181803683370190505b5090505b84156125ac5761268060018361309b565b915061268d600a8661324d565b612698906030613038565b60f81b8183815181106126ad576126ad613261565b60200101906001600160f81b031916908160001a9053506126cf600a86613239565b945061266f565b60006001600160a01b0382166127485760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610a0d565b506001600160a01b0316600090815260056020526040902054600160801b90046001600160801b031690565b6001546001600160a01b0384166127d75760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610a0d565b6127e2816001541190565b1561282f5760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610a0d565b7f00000000000000000000000000000000000000000000000000000000000000ff8311156128aa5760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610a0d565b6001600160a01b0384166000908152600560209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612906908790613187565b6001600160801b031681526020018583602001516129249190613187565b6001600160801b039081169091526001600160a01b0380881660008181526005602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526004909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b85811015612a435760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612a0760008884886124b5565b612a235760405162461bcd60e51b8152600401610a0d906130cd565b81612a2d816130b2565b9250508080612a3b906130b2565b9150506129ba565b5060018190556122b4565b600081815b8451811015612aba576000858281518110612a7057612a70613261565b60200260200101519050808311612a965760008381526020829052604090209250612aa7565b600081815260208490526040902092505b5080612ab2816130b2565b915050612a53565b509392505050565b828054612ace90612fe7565b90600052602060002090601f016020900481019282612af05760008555612b36565b82601f10612b0957805160ff1916838001178555612b36565b82800160010185558215612b36579182015b82811115612b36578251825591602001919060010190612b1b565b506114d89291505b808211156114d85760008155600101612b3e565b6001600160e01b03198116811461136c57600080fd5b600060208284031215612b7a57600080fd5b8135611b8281612b52565b80358015158114611d4157600080fd5b600060208284031215612ba757600080fd5b611b8282612b85565b60005b83811015612bcb578181015183820152602001612bb3565b83811115611b6d5750506000910152565b60008151808452612bf4816020860160208601612bb0565b601f01601f19169290920160200192915050565b602081526000611b826020830184612bdc565b600060208284031215612c2d57600080fd5b5035919050565b80356001600160a01b0381168114611d4157600080fd5b60008060408385031215612c5e57600080fd5b612c6783612c34565b946020939093013593505050565b600080600060408486031215612c8a57600080fd5b8335925060208401356001600160401b0380821115612ca857600080fd5b818601915086601f830112612cbc57600080fd5b813581811115612ccb57600080fd5b8760208260051b8501011115612ce057600080fd5b6020830194508093505050509250925092565b600060208284031215612d0557600080fd5b611b8282612c34565b600080600060608486031215612d2357600080fd5b612d2c84612c34565b9250612d3a60208501612c34565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612d8857612d88612d4a565b604052919050565b60006001600160401b03831115612da957612da9612d4a565b612dbc601f8401601f1916602001612d60565b9050828152838383011115612dd057600080fd5b828260208301376000602084830101529392505050565b600060208284031215612df957600080fd5b81356001600160401b03811115612e0f57600080fd5b8201601f81018413612e2057600080fd5b6125ac84823560208401612d90565b60008060408385031215612e4257600080fd5b612e4b83612c34565b9150612e5960208401612b85565b90509250929050565b60008060008060808587031215612e7857600080fd5b612e8185612c34565b9350612e8f60208601612c34565b92506040850135915060608501356001600160401b03811115612eb157600080fd5b8501601f81018713612ec257600080fd5b612ed187823560208401612d90565b91505092959194509250565b60008060408385031215612ef057600080fd5b82356001600160401b0380821115612f0757600080fd5b818501915085601f830112612f1b57600080fd5b8135602082821115612f2f57612f2f612d4a565b8160051b9250612f40818401612d60565b8281529284018101928181019089851115612f5a57600080fd5b948201945b84861015612f7857853582529482019490820190612f5f565b9997909101359750505050505050565b60008060408385031215612f9b57600080fd5b612fa483612c34565b9150612e5960208401612c34565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c90821680612ffb57607f821691505b6020821081141561301c57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b6000821982111561304b5761304b613022565b500190565b60208082526012908201527172656163686564206d617820737570706c7960701b604082015260600190565b600081600019048311821515161561309657613096613022565b500290565b6000828210156130ad576130ad613022565b500390565b60006000198214156130c6576130c6613022565b5060010190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351613132818460208801612bb0565b835190830190613146818360208801612bb0565b64173539b7b760d91b9101908152600501949350505050565b60006001600160801b038381169083168181101561317f5761317f613022565b039392505050565b60006001600160801b038083168185168083038211156131a9576131a9613022565b01949350505050565b6000816131c1576131c1613022565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131fc90830184612bdc565b9695505050505050565b60006020828403121561321857600080fd5b8151611b8281612b52565b634e487b7160e01b600052601260045260246000fd5b60008261324857613248613223565b500490565b60008261325c5761325c613223565b500690565b634e487b7160e01b600052603260045260246000fdfea26469706673582212204afa210c33cf12624995bcdf8f1f180b49501289e74ec89da7bfa9b8bd60baab64736f6c634300080b0033

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

00000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000003e800000000000000000000000000000000000000000000000000000000000000000000000000000000000000002be1466fcefd2447da41b4693a6356e06b450ea20000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d51735a66344a7462566e585631397862714666786a615648624853636958657936314d76556b4571506659472f000000000000000000000000000000000000000000000000000000000000000000000000000000000041697066733a2f2f516d51735a66344a7462566e585631397862714666786a615648624853636958657936314d76556b4571506659472f68696464656e2e6a736f6e00000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): ipfs://QmQsZf4JtbVnXV19xbqFfxjaVHbHSciXey61MvUkEqPfYG/
Arg [1] : _hiddenURI (string): ipfs://QmQsZf4JtbVnXV19xbqFfxjaVHbHSciXey61MvUkEqPfYG/hidden.json
Arg [2] : _royaltyFeesInBips (uint96): 1000
Arg [3] : _root (bytes32): 0x0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : _teamWallet (address): 0x2Be1466fCEFD2447Da41B4693a6356e06B450ea2

-----Encoded View---------------
12 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 00000000000000000000000000000000000000000000000000000000000003e8
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000002be1466fcefd2447da41b4693a6356e06b450ea2
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [6] : 697066733a2f2f516d51735a66344a7462566e585631397862714666786a6156
Arg [7] : 48624853636958657936314d76556b4571506659472f00000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000041
Arg [9] : 697066733a2f2f516d51735a66344a7462566e585631397862714666786a6156
Arg [10] : 48624853636958657936314d76556b4571506659472f68696464656e2e6a736f
Arg [11] : 6e00000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

30390:7926:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32013:237;;;;;;;;;;-1:-1:-1;32013:237:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;32013:237:0;;;;;;;;37799:79;;;;;;;;;;-1:-1:-1;37799:79:0;;;;;:::i;:::-;;:::i;:::-;;21962:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;23449:292::-;;;;;;;;;;-1:-1:-1;23449:292:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2042:32:1;;;2024:51;;2012:2;1997:18;23449:292:0;1878:203:1;23028:413:0;;;;;;;;;;-1:-1:-1;23028:413:0;;;;;:::i;:::-;;:::i;33540:1200::-;;;;;;:::i;:::-;;:::i;36857:110::-;;;;;;;;;;-1:-1:-1;36857:110:0;;;;;:::i;:::-;;:::i;18950:104::-;;;;;;;;;;;;;:::i;:::-;;;3548:25:1;;;3536:2;3521:18;18950:104:0;3402:177:1;24290:162:0;;;;;;;;;;-1:-1:-1;24290:162:0;;;;;:::i;:::-;;:::i;37471:118::-;;;;;;;;;;-1:-1:-1;37471:118:0;;;;;:::i;:::-;;:::i;37997:107::-;;;;;;;;;;-1:-1:-1;37997:107:0;;;;;:::i;:::-;;:::i;37597:110::-;;;;;;;;;;-1:-1:-1;37597:110:0;;;;;:::i;:::-;;:::i;31453:25::-;;;;;;;;;;;;;;;;30620:35;;;;;;;;;;;;;;;;19298:864;;;;;;;;;;-1:-1:-1;19298:864:0;;;;;:::i;:::-;;:::i;32427:358::-;;;;;;;;;;-1:-1:-1;32427:358:0;;;;;:::i;:::-;;:::i;36257:486::-;;;;;;;;;;;;;:::i;24460:177::-;;;;;;;;;;-1:-1:-1;24460:177:0;;;;;:::i;:::-;;:::i;30754:85::-;;;;;;;;;;-1:-1:-1;30754:85:0;;;;-1:-1:-1;;;30754:85:0;;-1:-1:-1;;;;;30754:85:0;;;19062:228;;;;;;;;;;-1:-1:-1;19062:228:0;;;;;:::i;:::-;;:::i;31219:28::-;;;;;;;;;;-1:-1:-1;31219:28:0;;;;;;;;;;;30521:39;;;;;;;;;;;;;;;;35621:101;;;;;;;;;;-1:-1:-1;35621:101:0;;;;;:::i;:::-;;:::i;31186:26::-;;;;;;;;;;-1:-1:-1;31186:26:0;;;;;;;;;;;21830:124;;;;;;;;;;-1:-1:-1;21830:124:0;;;;;:::i;:::-;;:::i;20600:258::-;;;;;;;;;;-1:-1:-1;20600:258:0;;;;;:::i;:::-;;:::i;10596:103::-;;;;;;;;;;;;;:::i;31382:28::-;;;;;;;;;;;;;:::i;31134:39::-;;;;;;;;;;-1:-1:-1;31134:39:0;;;;;;;;;;;30710:31;;;;;;;;;;-1:-1:-1;30710:31:0;;;;;;;;;;;5553:26:1;5541:39;;;5523:58;;5511:2;5496:18;30710:31:0;5379:208:1;32258:84:0;;;;;;;;;;-1:-1:-1;32258:84:0;;;;;:::i;:::-;;:::i;38114:199::-;;;;;;;;;;-1:-1:-1;38114:199:0;;;;;:::i;:::-;;:::i;10373:87::-;;;;;;;;;;-1:-1:-1;10419:7:0;10446:6;-1:-1:-1;;;;;10446:6:0;10373:87;;36759:90;;;;;;;;;;-1:-1:-1;36759:90:0;;;;;:::i;:::-;;:::i;36082:167::-;;;;;;;;;;-1:-1:-1;36082:167:0;;;;;:::i;:::-;;:::i;:::-;;;;6009:13:1;;-1:-1:-1;;;;;6005:39:1;5987:58;;6105:4;6093:17;;;6087:24;-1:-1:-1;;;;;6083:49:1;6061:20;;;6054:79;;;;5960:18;36082:167:0;5777:362:1;22070:104:0;;;;;;;;;;;;;:::i;30670:30::-;;;;;;;;;;;;;;;;32793:739;;;;;;:::i;:::-;;:::i;23749:311::-;;;;;;;;;;-1:-1:-1;23749:311:0;;;;;:::i;:::-;;:::i;37715:74::-;;;;;;;;;;;;;:::i;37349:112::-;;;;;;;;;;-1:-1:-1;37349:112:0;;;;;:::i;:::-;;:::i;24645:355::-;;;;;;;;;;-1:-1:-1;24645:355:0;;;;;:::i;:::-;;:::i;34748:195::-;;;;;;;;;;-1:-1:-1;34748:195:0;;;;;:::i;:::-;;:::i;31090:37::-;;;;;;;;;;-1:-1:-1;31090:37:0;;;;;;;;;;;37886:103;;;;;;;;;;-1:-1:-1;37886:103:0;;;;;:::i;:::-;;:::i;34951:656::-;;;;;;;;;;-1:-1:-1;34951:656:0;;;;;:::i;:::-;;:::i;37233:108::-;;;;;;;;;;-1:-1:-1;37233:108:0;;;;;:::i;:::-;;:::i;28160:43::-;;;;;;;;;;;;;;;;35961:113;;;;;;;;;;-1:-1:-1;35961:113:0;;;;;:::i;:::-;;:::i;24068:214::-;;;;;;;;;;-1:-1:-1;24068:214:0;;;;;:::i;:::-;-1:-1:-1;;;;;24239:25:0;;;24210:4;24239:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;24068:214;35730:102;;;;;;;;;;-1:-1:-1;35730:102:0;;;;;:::i;:::-;;:::i;10707:238::-;;;;;;;;;;-1:-1:-1;10707:238:0;;;;;:::i;:::-;;:::i;32013:237::-;32135:4;-1:-1:-1;;;;;;;;;32177:25:0;;;;:65;;;32206:36;32230:11;32206:23;:36::i;:::-;32157:85;32013:237;-1:-1:-1;;32013:237:0:o;37799:79::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;;;;;;;;;37855:6:::1;:15:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;37855:15:0;;::::1;::::0;;;::::1;::::0;;37799:79::o;21962:100::-;22016:13;22049:5;22042:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21962:100;:::o;23449:292::-;23553:7;23600:16;23608:7;25099:12;;-1:-1:-1;25089:22:0;25008:111;23600:16;23578:111;;;;-1:-1:-1;;;23578:111:0;;9309:2:1;23578:111:0;;;9291:21:1;9348:2;9328:18;;;9321:30;9387:34;9367:18;;;9360:62;-1:-1:-1;;;9438:18:1;;;9431:43;9491:19;;23578:111:0;9107:409:1;23578:111:0;-1:-1:-1;23709:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23709:24:0;;23449:292::o;23028:413::-;23101:13;23117:24;23133:7;23117:15;:24::i;:::-;23101:40;;23166:5;-1:-1:-1;;;;;23160:11:0;:2;-1:-1:-1;;;;;23160:11:0;;;23152:58;;;;-1:-1:-1;;;23152:58:0;;9723:2:1;23152:58:0;;;9705:21:1;9762:2;9742:18;;;9735:30;9801:34;9781:18;;;9774:62;-1:-1:-1;;;9852:18:1;;;9845:32;9894:19;;23152:58:0;9521:398:1;23152:58:0;9974:10;-1:-1:-1;;;;;23245:21:0;;;;:62;;-1:-1:-1;23270:37:0;23287:5;9974:10;24068:214;:::i;23270:37::-;23223:169;;;;-1:-1:-1;;;23223:169:0;;10126:2:1;23223:169:0;;;10108:21:1;10165:2;10145:18;;;10138:30;10204:34;10184:18;;;10177:62;10275:27;10255:18;;;10248:55;10320:19;;23223:169:0;9924:421:1;23223:169:0;23405:28;23414:2;23418:7;23427:5;23405:8;:28::i;:::-;23090:351;23028:413;;:::o;33540:1200::-;33682:6;;;;;;;33681:7;33673:37;;;;-1:-1:-1;;;33673:37:0;;10552:2:1;33673:37:0;;;10534:21:1;10591:2;10571:18;;;10564:30;-1:-1:-1;;;10610:18:1;;;10603:47;10667:18;;33673:37:0;10350:341:1;33673:37:0;33730:19;;;;;;;;:40;;-1:-1:-1;33753:17:0;;;;;;;33730:40;33722:70;;;;-1:-1:-1;;;33722:70:0;;10898:2:1;33722:70:0;;;10880:21:1;10937:2;10917:18;;;10910:30;-1:-1:-1;;;10956:18:1;;;10949:47;11013:18;;33722:70:0;10696:341:1;33722:70:0;30896:4;33842:8;33826:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;33804:116;;;;-1:-1:-1;;;33804:116:0;;;;;;;:::i;:::-;33953:61;33961:11;;33953:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33984:28:0;;-1:-1:-1;;34001:10:0;11803:2:1;11799:15;11795:53;33984:28:0;;;11783:66:1;11865:12;;;-1:-1:-1;33984:28:0;;-1:-1:-1;11654:229:1;33984:28:0;;;;;;;;;;;;;33974:39;;;;;;33953:7;:61::i;:::-;33931:126;;;;-1:-1:-1;;;33931:126:0;;12090:2:1;33931:126:0;;;12072:21:1;12129:2;12109:18;;;12102:30;-1:-1:-1;;;12148:18:1;;;12141:45;12203:18;;33931:126:0;11888:339:1;33931:126:0;34130:15;;34118:8;34091:24;34104:10;34091:12;:24::i;:::-;:35;;;;:::i;:::-;:54;;34068:136;;;;-1:-1:-1;;;34068:136:0;;12434:2:1;34068:136:0;;;12416:21:1;12473:2;12453:18;;;12446:30;12512:32;12492:18;;;12485:60;12562:18;;34068:136:0;12232:354:1;34068:136:0;34235:19;;34223:8;:31;;34215:66;;;;-1:-1:-1;;;34215:66:0;;12793:2:1;34215:66:0;;;12775:21:1;12832:2;12812:18;;;12805:30;-1:-1:-1;;;12851:18:1;;;12844:52;12913:18;;34215:66:0;12591:346:1;34215:66:0;34321:8;34313:5;;:16;;;;:::i;:::-;34300:9;:29;;34292:64;;;;-1:-1:-1;;;34292:64:0;;13317:2:1;34292:64:0;;;13299:21:1;13356:2;13336:18;;;13329:30;-1:-1:-1;;;13375:18:1;;;13368:52;13437:18;;34292:64:0;13115:346:1;34292:64:0;34372:17;;;;;;;34369:312;;;34456:14;;34444:8;34428:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;34406:110;;;;-1:-1:-1;;;34406:110:0;;13668:2:1;34406:110:0;;;13650:21:1;13707:2;13687:18;;;13680:30;-1:-1:-1;;;13726:18:1;;;13719:48;13784:18;;34406:110:0;13466:342:1;34406:110:0;34369:312;;;34602:16;;34590:8;34574:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:44;;34552:117;;;;-1:-1:-1;;;34552:117:0;;13668:2:1;34552:117:0;;;13650:21:1;13707:2;13687:18;;;13680:30;-1:-1:-1;;;13726:18:1;;;13719:48;13784:18;;34552:117:0;13466:342:1;34552:117:0;34701:31;34711:10;34723:8;34701:9;:31::i;36857:110::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;36932:10:::1;:27:::0;;-1:-1:-1;;;;;;36932:27:0::1;-1:-1:-1::0;;;;;36932:27:0;;;::::1;::::0;;;::::1;::::0;;36857:110::o;18950:104::-;19003:7;19045:1;19030:12;;:16;;;;:::i;:::-;19023:23;;18950:104;:::o;24290:162::-;24416:28;24426:4;24432:2;24436:7;24416:9;:28::i;37471:118::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;37550:19:::1;:31:::0;37471:118::o;37997:107::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;38068:19:::1;:28:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;38068:28:0;;::::1;::::0;;;::::1;::::0;;37997:107::o;37597:110::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;37672:15:::1;:27:::0;37597:110::o;19298:864::-;19423:7;19464:16;19474:5;19464:9;:16::i;:::-;19456:5;:24;19448:71;;;;-1:-1:-1;;;19448:71:0;;14145:2:1;19448:71:0;;;14127:21:1;14184:2;14164:18;;;14157:30;14223:34;14203:18;;;14196:62;-1:-1:-1;;;14274:18:1;;;14267:32;14316:19;;19448:71:0;13943:398:1;19448:71:0;19530:22;19555:13;:11;:13::i;:::-;19530:38;;19579:19;19613:25;19667:9;19662:426;19686:14;19682:1;:18;19662:426;;;19722:31;19756:14;;;:11;:14;;;;;;;;;19722:48;;;;;;;;;-1:-1:-1;;;;;19722:48:0;;;;;-1:-1:-1;;;19722:48:0;;;-1:-1:-1;;;;;19722:48:0;;;;;;;;19789:28;19785:103;;19858:14;;;-1:-1:-1;19785:103:0;19927:5;-1:-1:-1;;;;;19906:26:0;:17;-1:-1:-1;;;;;19906:26:0;;19902:175;;;19972:5;19957:11;:20;19953:77;;;-1:-1:-1;20009:1:0;-1:-1:-1;20002:8:0;;-1:-1:-1;;;20002:8:0;19953:77;20048:13;;;;:::i;:::-;;;;19902:175;-1:-1:-1;19702:3:0;;;;:::i;:::-;;;;19662:426;;;-1:-1:-1;20098:56:0;;-1:-1:-1;;;20098:56:0;;14688:2:1;20098:56:0;;;14670:21:1;14727:2;14707:18;;;14700:30;14766:34;14746:18;;;14739:62;-1:-1:-1;;;14817:18:1;;;14810:44;14871:19;;20098:56:0;14486:410:1;32427:358:0;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;32543:14:::1;32531:8;32515:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:42;;32493:110;;;;-1:-1:-1::0;;;32493:110:0::1;;;;;;;:::i;:::-;32648:12;::::0;32622:11:::1;::::0;32648:12:::1;::::0;;::::1;::::0;32622:22:::1;::::0;32636:8;;32622:22:::1;:::i;:::-;:38;;32614:74;;;::::0;-1:-1:-1;;;32614:74:0;;15103:2:1;32614:74:0::1;::::0;::::1;15085:21:1::0;15142:2;15122:18;;;15115:30;15181:25;15161:18;;;15154:53;15224:18;;32614:74:0::1;14901:347:1::0;32614:74:0::1;32727:8;32713:11;;:22;;;;:::i;:::-;32699:11;:36:::0;32756:10:::1;::::0;32746:31:::1;::::0;-1:-1:-1;;;;;32756:10:0::1;32768:8:::0;32746:9:::1;:31::i;:::-;32427:358:::0;:::o;36257:486::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;1230:1:::1;1378:7;;:19;;1370:63;;;::::0;-1:-1:-1;;;1370:63:0;;15455:2:1;1370:63:0::1;::::0;::::1;15437:21:1::0;15494:2;15474:18;;;15467:30;15533:33;15513:18;;;15506:61;15584:18;;1370:63:0::1;15253:355:1::0;1370:63:0::1;1230:1;1444:7;:18:::0;36555:7:::2;10446:6:::0;;36568:55:::2;::::0;-1:-1:-1;;;;;10446:6:0;;;;36597:21:::2;::::0;36555:7;36568:55;36555:7;36568:55;36597:21;10446:6;36568:55:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36554:69;;;36642:2;36634:11;;;::::0;::::2;;-1:-1:-1::0;1186:1:0::1;1487:7;:22:::0;36257:486::o;24460:177::-;24590:39;24607:4;24613:2;24617:7;24590:39;;;;;;;;;;;;:16;:39::i;19062:228::-;19165:7;19206:13;:11;:13::i;:::-;19198:5;:21;19190:69;;;;-1:-1:-1;;;19190:69:0;;16025:2:1;19190:69:0;;;16007:21:1;16064:2;16044:18;;;16037:30;16103:34;16083:18;;;16076:62;-1:-1:-1;;;16154:18:1;;;16147:33;16197:19;;19190:69:0;15823:399:1;19190:69:0;-1:-1:-1;19277:5:0;19062:228::o;35621:101::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;35692:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;35621:101:::0;:::o;21830:124::-;21894:7;21921:20;21933:7;21921:11;:20::i;:::-;:25;;21830:124;-1:-1:-1;;21830:124:0:o;20600:258::-;20664:7;-1:-1:-1;;;;;20706:19:0;;20684:112;;;;-1:-1:-1;;;20684:112:0;;16429:2:1;20684:112:0;;;16411:21:1;16468:2;16448:18;;;16441:30;16507:34;16487:18;;;16480:62;-1:-1:-1;;;16558:18:1;;;16551:41;16609:19;;20684:112:0;16227:407:1;20684:112:0;-1:-1:-1;;;;;;20822:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;20822:27:0;;20600:258::o;10596:103::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;10661:30:::1;10688:1;10661:18;:30::i;:::-;10596:103::o:0;31382:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32258:84::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;32320:10:::1;:14:::0;32258:84::o;38114:199::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38204:25:0;::::1;38196:68;;;::::0;-1:-1:-1;;;38196:68:0;;16841:2:1;38196:68:0::1;::::0;::::1;16823:21:1::0;16880:2;16860:18;;;16853:30;16919:32;16899:18;;;16892:60;16969:18;;38196:68:0::1;16639:354:1::0;38196:68:0::1;38275:30;38285:11;38298:6;38275:9;:30::i;36759:90::-:0;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;36824:5:::1;:17:::0;36759:90::o;36082:167::-;-1:-1:-1;;;;;;;;;;;;;;;;;36221:20:0;36233:7;36221:11;:20::i;22070:104::-;22126:13;22159:7;22152:14;;;;;:::i;32793:739::-;32860:6;;;;;;;32859:7;32851:34;;;;-1:-1:-1;;;32851:34:0;;17200:2:1;32851:34:0;;;17182:21:1;17239:2;17219:18;;;17212:30;-1:-1:-1;;;17258:18:1;;;17251:44;17312:18;;32851:34:0;16998:338:1;32851:34:0;32905:17;;;;;;;32904:18;32896:68;;;;-1:-1:-1;;;32896:68:0;;17543:2:1;32896:68:0;;;17525:21:1;17582:2;17562:18;;;17555:30;17621:34;17601:18;;;17594:62;-1:-1:-1;;;17672:18:1;;;17665:35;17717:19;;32896:68:0;17341:401:1;32896:68:0;32984:19;;;;;;;32983:20;32975:70;;;;-1:-1:-1;;;32975:70:0;;17949:2:1;32975:70:0;;;17931:21:1;17988:2;17968:18;;;17961:30;18027:34;18007:18;;;18000:62;-1:-1:-1;;;18078:18:1;;;18071:35;18123:19;;32975:70:0;17747:401:1;32975:70:0;30896:4;33094:8;33078:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:48;;33056:116;;;;-1:-1:-1;;;33056:116:0;;;;;;;:::i;:::-;33204:19;;33192:8;:31;;33184:66;;;;-1:-1:-1;;;33184:66:0;;12793:2:1;33184:66:0;;;12775:21:1;12832:2;12812:18;;;12805:30;-1:-1:-1;;;12851:18:1;;;12844:52;12913:18;;33184:66:0;12591:346:1;33184:66:0;33323:15;;33311:8;33284:24;33297:10;33284:12;:24::i;:::-;:35;;;;:::i;:::-;:54;;33261:136;;;;-1:-1:-1;;;33261:136:0;;12434:2:1;33261:136:0;;;12416:21:1;12473:2;12453:18;;;12446:30;12512:32;12492:18;;;12485:60;12562:18;;33261:136:0;12232:354:1;33261:136:0;33447:8;33439:5;;:16;;;;:::i;:::-;33426:9;:29;;33418:64;;;;-1:-1:-1;;;33418:64:0;;13317:2:1;33418:64:0;;;13299:21:1;13356:2;13336:18;;;13329:30;-1:-1:-1;;;13375:18:1;;;13368:52;13437:18;;33418:64:0;13115:346:1;33418:64:0;33493:31;33503:10;33515:8;33493:9;:31::i;23749:311::-;-1:-1:-1;;;;;23867:24:0;;9974:10;23867:24;;23859:63;;;;-1:-1:-1;;;23859:63:0;;18355:2:1;23859:63:0;;;18337:21:1;18394:2;18374:18;;;18367:30;18433:28;18413:18;;;18406:56;18479:18;;23859:63:0;18153:350:1;23859:63:0;9974:10;23935:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23935:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23935:53:0;;;;;;;;;;24004:48;;540:41:1;;;23935:42:0;;9974:10;24004:48;;513:18:1;24004:48:0;;;;;;;23749:311;;:::o;37715:74::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;37773:8:::1;::::0;;-1:-1:-1;;37761:20:0;::::1;37773:8:::0;;;;::::1;;;37772:9;37761:20:::0;;::::1;;::::0;;37715:74::o;37349:112::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;37425:16:::1;:28:::0;37349:112::o;24645:355::-;24804:28;24814:4;24820:2;24824:7;24804:9;:28::i;:::-;24865:48;24888:4;24894:2;24898:7;24907:5;24865:22;:48::i;:::-;24843:149;;;;-1:-1:-1;;;24843:149:0;;;;;;;:::i;:::-;24645:355;;;;:::o;34748:195::-;34857:4;34886:49;34905:11;34918:10;;34930:4;34886:18;:49::i;:::-;34879:56;34748:195;-1:-1:-1;;;34748:195:0:o;37886:103::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;37955:17:::1;:26:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;37955:26:0;;::::1;::::0;;;::::1;::::0;;37886:103::o;34951:656::-;35069:13;35122:16;35130:7;25099:12;;-1:-1:-1;25089:22:0;25008:111;35122:16;35100:113;;;;-1:-1:-1;;;35100:113:0;;19130:2:1;35100:113:0;;;19112:21:1;19169:2;19149:18;;;19142:30;19208:34;19188:18;;;19181:62;-1:-1:-1;;;19259:18:1;;;19252:45;19314:19;;35100:113:0;18928:411:1;35100:113:0;35241:8;;;;;;;35237:353;;;35266:21;35290:10;:8;:10::i;:::-;35266:34;;35363:1;35345:7;35339:21;:25;:185;;;;;;;;;;;;;;;;;35438:7;35447:18;:7;:16;:18::i;:::-;35421:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35315:209;34951:656;-1:-1:-1;;;34951:656:0:o;35237:353::-;35564:14;35557:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34951:656;;;:::o;35237:353::-;34951:656;;;:::o;37233:108::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;37307:14:::1;:26:::0;37233:108::o;35961:113::-;36019:7;36046:20;36060:5;36046:13;:20::i;35730:102::-;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;35804:20;;::::1;::::0;:14:::1;::::0;:20:::1;::::0;::::1;::::0;::::1;:::i;10707:238::-:0;10419:7;10446:6;-1:-1:-1;;;;;10446:6:0;9974:10;10508:23;10500:68;;;;-1:-1:-1;;;10500:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10810:22:0;::::1;10788:110;;;::::0;-1:-1:-1;;;10788:110:0;;20188:2:1;10788:110:0::1;::::0;::::1;20170:21:1::0;20227:2;20207:18;;;20200:30;20266:34;20246:18;;;20239:62;-1:-1:-1;;;20317:18:1;;;20310:36;20363:19;;10788:110:0::1;19986:402:1::0;10788:110:0::1;10909:28;10928:8;10909:18;:28::i;20170:422::-:0;20317:4;-1:-1:-1;;;;;;20359:40:0;;-1:-1:-1;;;20359:40:0;;:105;;-1:-1:-1;;;;;;;20416:48:0;;-1:-1:-1;;;20416:48:0;20359:105;:172;;;-1:-1:-1;;;;;;;20481:50:0;;-1:-1:-1;;;20481:50:0;20359:172;:225;;;-1:-1:-1;;;;;;;;;;15670:40:0;;;20548:36;15511:207;27956:196;28071:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;28071:29:0;-1:-1:-1;;;;;28071:29:0;;;;;;;;;28116:28;;28071:24;;28116:28;;;;;;;27956:196;;;:::o;25127:104::-;25196:27;25206:2;25210:8;25196:27;;;;;;;;;;;;:9;:27::i;26522:1426::-;26637:35;26675:20;26687:7;26675:11;:20::i;:::-;26750:18;;26637:58;;-1:-1:-1;26708:22:0;;-1:-1:-1;;;;;26734:34:0;9974:10;-1:-1:-1;;;;;26734:34:0;;:87;;;-1:-1:-1;9974:10:0;26785:20;26797:7;26785:11;:20::i;:::-;-1:-1:-1;;;;;26785:36:0;;26734:87;:154;;;-1:-1:-1;26855:18:0;;26838:50;;9974:10;24068:214;:::i;26838:50::-;26708:181;;26924:17;26902:117;;;;-1:-1:-1;;;26902:117:0;;20595:2:1;26902:117:0;;;20577:21:1;20634:2;20614:18;;;20607:30;20673:34;20653:18;;;20646:62;-1:-1:-1;;;20724:18:1;;;20717:48;20782:19;;26902:117:0;20393:414:1;26902:117:0;27076:4;-1:-1:-1;;;;;27054:26:0;:13;:18;;;-1:-1:-1;;;;;27054:26:0;;27032:114;;;;-1:-1:-1;;;27032:114:0;;21014:2:1;27032:114:0;;;20996:21:1;21053:2;21033:18;;;21026:30;21092:34;21072:18;;;21065:62;-1:-1:-1;;;21143:18:1;;;21136:36;21189:19;;27032:114:0;20812:402:1;27032:114:0;-1:-1:-1;;;;;27165:16:0;;27157:66;;;;-1:-1:-1;;;27157:66:0;;21421:2:1;27157:66:0;;;21403:21:1;21460:2;21440:18;;;21433:30;21499:34;21479:18;;;21472:62;-1:-1:-1;;;21550:18:1;;;21543:35;21595:19;;27157:66:0;21219:401:1;27157:66:0;27290:49;27307:1;27311:7;27320:13;:18;;;27290:8;:49::i;:::-;-1:-1:-1;;;;;27352:18:0;;;;;;:12;:18;;;;;:31;;27382:1;;27352:18;:31;;27382:1;;-1:-1:-1;;;;;27352:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;27352:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;27394:16:0;;-1:-1:-1;27394:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;27394:16:0;;:29;;-1:-1:-1;;27394:29:0;;:::i;:::-;;;-1:-1:-1;;;;;27394:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27457:43:0;;;;;;;;-1:-1:-1;;;;;27457:43:0;;;;;-1:-1:-1;;;;;27483:15:0;27457:43;;;;;;;;;-1:-1:-1;27434:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;27434:66:0;-1:-1:-1;;;;;;27434:66:0;;;;;;;;;;;27533:11;27446:7;-1:-1:-1;27533:11:0;:::i;:::-;27600:1;27559:24;;;:11;:24;;;;;:29;27511:33;;-1:-1:-1;;;;;;27559:29:0;27555:288;;27623:20;27631:11;25099:12;;-1:-1:-1;25089:22:0;25008:111;27623:20;27619:213;;;27691:125;;;;;;;;27728:18;;-1:-1:-1;;;;;27691:125:0;;;;;;27769:28;;;;-1:-1:-1;;;;;27691:125:0;;;;;;;;;-1:-1:-1;27664:24:0;;;:11;:24;;;;;;;:152;;;;;;;;;-1:-1:-1;;;27664:152:0;-1:-1:-1;;;;;;27664:152:0;;;;;;;;;;;;27619:213;27879:7;27875:2;-1:-1:-1;;;;;27860:27:0;27869:4;-1:-1:-1;;;;;27860:27:0;;;;;;;;;;;27898:42;26626:1322;;;26522:1426;;;:::o;21140:682::-;-1:-1:-1;;;;;;;;;;;;;;;;;21275:16:0;21283:7;25099:12;;-1:-1:-1;25089:22:0;25008:111;21275:16;21267:71;;;;-1:-1:-1;;;21267:71:0;;22336:2:1;21267:71:0;;;22318:21:1;22375:2;22355:18;;;22348:30;22414:34;22394:18;;;22387:62;-1:-1:-1;;;22465:18:1;;;22458:40;22515:19;;21267:71:0;22134:406:1;21267:71:0;21351:26;21403:12;21392:7;:23;21388:103;;21453:22;21463:12;21453:7;:22;:::i;:::-;:26;;21478:1;21453:26;:::i;:::-;21432:47;;21388:103;21523:7;21503:242;21540:18;21532:4;:26;21503:242;;21583:31;21617:17;;;:11;:17;;;;;;;;;21583:51;;;;;;;;;-1:-1:-1;;;;;21583:51:0;;;;;-1:-1:-1;;;21583:51:0;;;-1:-1:-1;;;;;21583:51:0;;;;;;;;21653:28;21649:85;;21709:9;21140:682;-1:-1:-1;;;;21140:682:0:o;21649:85::-;-1:-1:-1;21560:6:0;;;;:::i;:::-;;;;21503:242;;;-1:-1:-1;21757:57:0;;-1:-1:-1;;;21757:57:0;;22888:2:1;21757:57:0;;;22870:21:1;22927:2;22907:18;;;22900:30;22966:34;22946:18;;;22939:62;-1:-1:-1;;;23017:18:1;;;23010:45;23072:19;;21757:57:0;22686:411:1;10953:191:0;11027:16;11046:6;;-1:-1:-1;;;;;11063:17:0;;;-1:-1:-1;;;;;;11063:17:0;;;;;;11096:40;;11046:6;;;;;;;11096:40;;11027:16;11096:40;11016:128;10953:191;:::o;29065:985::-;29220:4;-1:-1:-1;;;;;29241:13:0;;11306:20;11354:8;29237:806;;29294:175;;-1:-1:-1;;;29294:175:0;;-1:-1:-1;;;;;29294:36:0;;;;;:175;;9974:10;;29388:4;;29415:7;;29445:5;;29294:175;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29294:175:0;;;;;;;;-1:-1:-1;;29294:175:0;;;;;;;;;;;;:::i;:::-;;;29273:715;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29656:13:0;;29652:321;;29699:109;;-1:-1:-1;;;29699:109:0;;;;;;;:::i;29652:321::-;29923:6;29917:13;29908:6;29904:2;29900:15;29893:38;29273:715;-1:-1:-1;;;;;;29533:55:0;-1:-1:-1;;;29533:55:0;;-1:-1:-1;29526:62:0;;29237:806;-1:-1:-1;30027:4:0;29237:806;29065:985;;;;;;:::o;87:190::-;212:4;265;236:25;249:5;256:4;236:12;:25::i;:::-;:33;;87:190;-1:-1:-1;;;;87:190:0:o;35840:113::-;35900:13;35933:12;35926:19;;;;;:::i;8483:532::-;8539:13;8569:10;8565:53;;-1:-1:-1;;8596:10:0;;;;;;;;;;;;-1:-1:-1;;;8596:10:0;;;;;8483:532::o;8565:53::-;8643:5;8628:12;8684:78;8691:9;;8684:78;;8717:8;;;;:::i;:::-;;-1:-1:-1;8740:10:0;;-1:-1:-1;8748:2:0;8740:10;;:::i;:::-;;;8684:78;;;8772:19;8804:6;-1:-1:-1;;;;;8794:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8794:17:0;;8772:39;;8822:154;8829:10;;8822:154;;8856:11;8866:1;8856:11;;:::i;:::-;;-1:-1:-1;8925:10:0;8933:2;8925:5;:10;:::i;:::-;8912:24;;:2;:24;:::i;:::-;8899:39;;8882:6;8889;8882:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;8882:56:0;;;;;;;;-1:-1:-1;8953:11:0;8962:2;8953:11;;:::i;:::-;;;8822:154;;20866:266;20927:7;-1:-1:-1;;;;;20969:19:0;;20947:118;;;;-1:-1:-1;;;20947:118:0;;24558:2:1;20947:118:0;;;24540:21:1;24597:2;24577:18;;;24570:30;24636:34;24616:18;;;24609:62;-1:-1:-1;;;24687:18:1;;;24680:47;24744:19;;20947:118:0;24356:413:1;20947:118:0;-1:-1:-1;;;;;;21091:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;21091:32:0;;-1:-1:-1;;;;;21091:32:0;;20866:266::o;25239:1275::-;25385:12;;-1:-1:-1;;;;;25416:16:0;;25408:62;;;;-1:-1:-1;;;25408:62:0;;24976:2:1;25408:62:0;;;24958:21:1;25015:2;24995:18;;;24988:30;25054:34;25034:18;;;25027:62;-1:-1:-1;;;25105:18:1;;;25098:31;25146:19;;25408:62:0;24774:397:1;25408:62:0;25490:21;25498:12;25099;;-1:-1:-1;25089:22:0;25008:111;25490:21;25489:22;25481:64;;;;-1:-1:-1;;;25481:64:0;;25378:2:1;25481:64:0;;;25360:21:1;25417:2;25397:18;;;25390:30;25456:31;25436:18;;;25429:59;25505:18;;25481:64:0;25176:353:1;25481:64:0;25576:12;25564:8;:24;;25556:71;;;;-1:-1:-1;;;25556:71:0;;25736:2:1;25556:71:0;;;25718:21:1;25775:2;25755:18;;;25748:30;25814:34;25794:18;;;25787:62;-1:-1:-1;;;25865:18:1;;;25858:32;25907:19;;25556:71:0;25534:398:1;25556:71:0;-1:-1:-1;;;;;25747:16:0;;25714:30;25747:16;;;:12;:16;;;;;;;;;25714:49;;;;;;;;;-1:-1:-1;;;;;25714:49:0;;;;;-1:-1:-1;;;25714:49:0;;;;;;;;;;;25793:135;;;;;;;;25819:19;;25714:49;;25793:135;;;25819:39;;25849:8;;25819:39;:::i;:::-;-1:-1:-1;;;;;25793:135:0;;;;;25908:8;25873:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;25793:135:0;;;;;;-1:-1:-1;;;;;25774:16:0;;;;;;;:12;:16;;;;;;;;:154;;;;;;;;-1:-1:-1;;;25774:154:0;;;;;;;;;;;;25967:43;;;;;;;;;;-1:-1:-1;;;;;25993:15:0;25967:43;;;;;;;;25939:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;25939:71:0;-1:-1:-1;;;;;;25939:71:0;;;;;;;;;;;;;;;;;;25951:12;;26071:325;26095:8;26091:1;:12;26071:325;;;26130:38;;26155:12;;-1:-1:-1;;;;;26130:38:0;;;26147:1;;26130:38;;26147:1;;26130:38;26209:59;26240:1;26244:2;26248:12;26262:5;26209:22;:59::i;:::-;26183:172;;;;-1:-1:-1;;;26183:172:0;;;;;;;:::i;:::-;26370:14;;;;:::i;:::-;;;;26105:3;;;;;:::i;:::-;;;;26071:325;;;-1:-1:-1;26408:12:0;:27;;;26446:60;24645:355;285:549;395:7;443:4;395:7;458:339;482:5;:12;478:1;:16;458:339;;;516:20;539:5;545:1;539:8;;;;;;;;:::i;:::-;;;;;;;516:31;;582:12;566;:28;562:224;;937:13;992:15;;;1028:4;1021:15;;;1075:4;1059:21;;615:57;;562:224;;;937:13;992:15;;;1028:4;1021:15;;;1075:4;1059:21;;713:57;;562:224;-1:-1:-1;496:3:0;;;;:::i;:::-;;;;458:339;;;-1:-1:-1;814:12:0;285:549;-1:-1:-1;;;285:549:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:160::-;657:20;;713:13;;706:21;696:32;;686:60;;742:1;739;732:12;757:180;813:6;866:2;854:9;845:7;841:23;837:32;834:52;;;882:1;879;872:12;834:52;905:26;921:9;905:26;:::i;942:258::-;1014:1;1024:113;1038:6;1035:1;1032:13;1024:113;;;1114:11;;;1108:18;1095:11;;;1088:39;1060:2;1053:10;1024:113;;;1155:6;1152:1;1149:13;1146:48;;;-1:-1:-1;;1190:1:1;1172:16;;1165:27;942:258::o;1205:::-;1247:3;1285:5;1279:12;1312:6;1307:3;1300:19;1328:63;1384:6;1377:4;1372:3;1368:14;1361:4;1354:5;1350:16;1328:63;:::i;:::-;1445:2;1424:15;-1:-1:-1;;1420:29:1;1411:39;;;;1452:4;1407:50;;1205:258;-1:-1:-1;;1205:258:1:o;1468:220::-;1617:2;1606:9;1599:21;1580:4;1637:45;1678:2;1667:9;1663:18;1655:6;1637:45;:::i;1693:180::-;1752:6;1805:2;1793:9;1784:7;1780:23;1776:32;1773:52;;;1821:1;1818;1811:12;1773:52;-1:-1:-1;1844:23:1;;1693:180;-1:-1:-1;1693:180:1:o;2086:173::-;2154:20;;-1:-1:-1;;;;;2203:31:1;;2193:42;;2183:70;;2249:1;2246;2239:12;2264:254;2332:6;2340;2393:2;2381:9;2372:7;2368:23;2364:32;2361:52;;;2409:1;2406;2399:12;2361:52;2432:29;2451:9;2432:29;:::i;:::-;2422:39;2508:2;2493:18;;;;2480:32;;-1:-1:-1;;;2264:254:1:o;2523:683::-;2618:6;2626;2634;2687:2;2675:9;2666:7;2662:23;2658:32;2655:52;;;2703:1;2700;2693:12;2655:52;2739:9;2726:23;2716:33;;2800:2;2789:9;2785:18;2772:32;-1:-1:-1;;;;;2864:2:1;2856:6;2853:14;2850:34;;;2880:1;2877;2870:12;2850:34;2918:6;2907:9;2903:22;2893:32;;2963:7;2956:4;2952:2;2948:13;2944:27;2934:55;;2985:1;2982;2975:12;2934:55;3025:2;3012:16;3051:2;3043:6;3040:14;3037:34;;;3067:1;3064;3057:12;3037:34;3120:7;3115:2;3105:6;3102:1;3098:14;3094:2;3090:23;3086:32;3083:45;3080:65;;;3141:1;3138;3131:12;3080:65;3172:2;3168;3164:11;3154:21;;3194:6;3184:16;;;;;2523:683;;;;;:::o;3211:186::-;3270:6;3323:2;3311:9;3302:7;3298:23;3294:32;3291:52;;;3339:1;3336;3329:12;3291:52;3362:29;3381:9;3362:29;:::i;3584:328::-;3661:6;3669;3677;3730:2;3718:9;3709:7;3705:23;3701:32;3698:52;;;3746:1;3743;3736:12;3698:52;3769:29;3788:9;3769:29;:::i;:::-;3759:39;;3817:38;3851:2;3840:9;3836:18;3817:38;:::i;:::-;3807:48;;3902:2;3891:9;3887:18;3874:32;3864:42;;3584:328;;;;;:::o;4099:127::-;4160:10;4155:3;4151:20;4148:1;4141:31;4191:4;4188:1;4181:15;4215:4;4212:1;4205:15;4231:275;4302:2;4296:9;4367:2;4348:13;;-1:-1:-1;;4344:27:1;4332:40;;-1:-1:-1;;;;;4387:34:1;;4423:22;;;4384:62;4381:88;;;4449:18;;:::i;:::-;4485:2;4478:22;4231:275;;-1:-1:-1;4231:275:1:o;4511:407::-;4576:5;-1:-1:-1;;;;;4602:6:1;4599:30;4596:56;;;4632:18;;:::i;:::-;4670:57;4715:2;4694:15;;-1:-1:-1;;4690:29:1;4721:4;4686:40;4670:57;:::i;:::-;4661:66;;4750:6;4743:5;4736:21;4790:3;4781:6;4776:3;4772:16;4769:25;4766:45;;;4807:1;4804;4797:12;4766:45;4856:6;4851:3;4844:4;4837:5;4833:16;4820:43;4910:1;4903:4;4894:6;4887:5;4883:18;4879:29;4872:40;4511:407;;;;;:::o;4923:451::-;4992:6;5045:2;5033:9;5024:7;5020:23;5016:32;5013:52;;;5061:1;5058;5051:12;5013:52;5101:9;5088:23;-1:-1:-1;;;;;5126:6:1;5123:30;5120:50;;;5166:1;5163;5156:12;5120:50;5189:22;;5242:4;5234:13;;5230:27;-1:-1:-1;5220:55:1;;5271:1;5268;5261:12;5220:55;5294:74;5360:7;5355:2;5342:16;5337:2;5333;5329:11;5294:74;:::i;6144:254::-;6209:6;6217;6270:2;6258:9;6249:7;6245:23;6241:32;6238:52;;;6286:1;6283;6276:12;6238:52;6309:29;6328:9;6309:29;:::i;:::-;6299:39;;6357:35;6388:2;6377:9;6373:18;6357:35;:::i;:::-;6347:45;;6144:254;;;;;:::o;6403:667::-;6498:6;6506;6514;6522;6575:3;6563:9;6554:7;6550:23;6546:33;6543:53;;;6592:1;6589;6582:12;6543:53;6615:29;6634:9;6615:29;:::i;:::-;6605:39;;6663:38;6697:2;6686:9;6682:18;6663:38;:::i;:::-;6653:48;;6748:2;6737:9;6733:18;6720:32;6710:42;;6803:2;6792:9;6788:18;6775:32;-1:-1:-1;;;;;6822:6:1;6819:30;6816:50;;;6862:1;6859;6852:12;6816:50;6885:22;;6938:4;6930:13;;6926:27;-1:-1:-1;6916:55:1;;6967:1;6964;6957:12;6916:55;6990:74;7056:7;7051:2;7038:16;7033:2;7029;7025:11;6990:74;:::i;:::-;6980:84;;;6403:667;;;;;;;:::o;7075:1016::-;7168:6;7176;7229:2;7217:9;7208:7;7204:23;7200:32;7197:52;;;7245:1;7242;7235:12;7197:52;7285:9;7272:23;-1:-1:-1;;;;;7355:2:1;7347:6;7344:14;7341:34;;;7371:1;7368;7361:12;7341:34;7409:6;7398:9;7394:22;7384:32;;7454:7;7447:4;7443:2;7439:13;7435:27;7425:55;;7476:1;7473;7466:12;7425:55;7512:2;7499:16;7534:4;7557:2;7553;7550:10;7547:36;;;7563:18;;:::i;:::-;7609:2;7606:1;7602:10;7592:20;;7632:28;7656:2;7652;7648:11;7632:28;:::i;:::-;7694:15;;;7764:11;;;7760:20;;;7725:12;;;;7792:19;;;7789:39;;;7824:1;7821;7814:12;7789:39;7848:11;;;;7868:142;7884:6;7879:3;7876:15;7868:142;;;7950:17;;7938:30;;7901:12;;;;7988;;;;7868:142;;;8029:5;8066:18;;;;8053:32;;-1:-1:-1;;;;;;;7075:1016:1:o;8096:260::-;8164:6;8172;8225:2;8213:9;8204:7;8200:23;8196:32;8193:52;;;8241:1;8238;8231:12;8193:52;8264:29;8283:9;8264:29;:::i;:::-;8254:39;;8312:38;8346:2;8335:9;8331:18;8312:38;:::i;8361:356::-;8563:2;8545:21;;;8582:18;;;8575:30;8641:34;8636:2;8621:18;;8614:62;8708:2;8693:18;;8361:356::o;8722:380::-;8801:1;8797:12;;;;8844;;;8865:61;;8919:4;8911:6;8907:17;8897:27;;8865:61;8972:2;8964:6;8961:14;8941:18;8938:38;8935:161;;;9018:10;9013:3;9009:20;9006:1;8999:31;9053:4;9050:1;9043:15;9081:4;9078:1;9071:15;8935:161;;8722:380;;;:::o;11042:127::-;11103:10;11098:3;11094:20;11091:1;11084:31;11134:4;11131:1;11124:15;11158:4;11155:1;11148:15;11174:128;11214:3;11245:1;11241:6;11238:1;11235:13;11232:39;;;11251:18;;:::i;:::-;-1:-1:-1;11287:9:1;;11174:128::o;11307:342::-;11509:2;11491:21;;;11548:2;11528:18;;;11521:30;-1:-1:-1;;;11582:2:1;11567:18;;11560:48;11640:2;11625:18;;11307:342::o;12942:168::-;12982:7;13048:1;13044;13040:6;13036:14;13033:1;13030:21;13025:1;13018:9;13011:17;13007:45;13004:71;;;13055:18;;:::i;:::-;-1:-1:-1;13095:9:1;;12942:168::o;13813:125::-;13853:4;13881:1;13878;13875:8;13872:34;;;13886:18;;:::i;:::-;-1:-1:-1;13923:9:1;;13813:125::o;14346:135::-;14385:3;-1:-1:-1;;14406:17:1;;14403:43;;;14426:18;;:::i;:::-;-1:-1:-1;14473:1:1;14462:13;;14346:135::o;18508:415::-;18710:2;18692:21;;;18749:2;18729:18;;;18722:30;18788:34;18783:2;18768:18;;18761:62;-1:-1:-1;;;18854:2:1;18839:18;;18832:49;18913:3;18898:19;;18508:415::o;19344:637::-;19624:3;19662:6;19656:13;19678:53;19724:6;19719:3;19712:4;19704:6;19700:17;19678:53;:::i;:::-;19794:13;;19753:16;;;;19816:57;19794:13;19753:16;19850:4;19838:17;;19816:57;:::i;:::-;-1:-1:-1;;;19895:20:1;;19924:22;;;19973:1;19962:13;;19344:637;-1:-1:-1;;;;19344:637:1:o;21625:246::-;21665:4;-1:-1:-1;;;;;21778:10:1;;;;21748;;21800:12;;;21797:38;;;21815:18;;:::i;:::-;21852:13;;21625:246;-1:-1:-1;;;21625:246:1:o;21876:253::-;21916:3;-1:-1:-1;;;;;22005:2:1;22002:1;21998:10;22035:2;22032:1;22028:10;22066:3;22062:2;22058:12;22053:3;22050:21;22047:47;;;22074:18;;:::i;:::-;22110:13;;21876:253;-1:-1:-1;;;;21876:253:1:o;22545:136::-;22584:3;22612:5;22602:39;;22621:18;;:::i;:::-;-1:-1:-1;;;22657:18:1;;22545:136::o;23102:489::-;-1:-1:-1;;;;;23371:15:1;;;23353:34;;23423:15;;23418:2;23403:18;;23396:43;23470:2;23455:18;;23448:34;;;23518:3;23513:2;23498:18;;23491:31;;;23296:4;;23539:46;;23565:19;;23557:6;23539:46;:::i;:::-;23531:54;23102:489;-1:-1:-1;;;;;;23102:489:1:o;23596:249::-;23665:6;23718:2;23706:9;23697:7;23693:23;23689:32;23686:52;;;23734:1;23731;23724:12;23686:52;23766:9;23760:16;23785:30;23809:5;23785:30;:::i;23850:127::-;23911:10;23906:3;23902:20;23899:1;23892:31;23942:4;23939:1;23932:15;23966:4;23963:1;23956:15;23982:120;24022:1;24048;24038:35;;24053:18;;:::i;:::-;-1:-1:-1;24087:9:1;;23982:120::o;24107:112::-;24139:1;24165;24155:35;;24170:18;;:::i;:::-;-1:-1:-1;24204:9:1;;24107:112::o;24224:127::-;24285:10;24280:3;24276:20;24273:1;24266:31;24316:4;24313:1;24306:15;24340:4;24337:1;24330:15

Swarm Source

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