ETH Price: $3,666.38 (+0.72%)

Token

ERC-20: Anonymice Collector Cards (AnonymiceCollectorCards)
 

Overview

Max Total Supply

203 AnonymiceCollectorCards

Holders

203

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 AnonymiceCollectorCards
0x6799790a9a3b15175653774572154d771f270e16
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Soulbound Collector Cards and Unlockable Badges. 100% on-chain, no APIs, no IPFS, no transfers. Just code.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AnonymiceBadges

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 13 : AnonymiceBadges.sol
/* solhint-disable quotes */
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "./POAPBoard.sol";
import "./POAPLibrary.sol";
import "./IDescriptor.sol";
import "./IBadgesVerifier.sol";
import "./ICheeth.sol";

contract AnonymiceBadges is POAPBoard {
    address public cheethAddress;
    address public descriptorAddress;
    address public badgesVerifierAddress;
    bool public isPaused = true;
    mapping(uint256 => uint256) public boardPrices;
    mapping(address => string) public boardNames;
    mapping(address => bool) private _auth;

    constructor() POAPBoard("Anonymice Collector Cards", "AnonymiceCollectorCards") {}

    function mint() external pure override {
        revert("no free mint");
    }

    function claimAll(
        uint256[] calldata ids,
        bytes32[][] calldata proofs,
        uint256[] calldata genesisMice,
        uint256[] calldata babyMice
    ) external {
        for (uint256 index = 0; index < ids.length; index++) {
            bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
            require(MerkleProof.verify(proofs[index], merkleRootsByPOAPId[ids[index]], leaf), "not in whitelist");
            _claimPOAP(ids[index], msg.sender);
        }

        uint256[] memory badgeIds = IBadgesVerifier(badgesVerifierAddress).claimableBadges(
            genesisMice,
            babyMice,
            msg.sender
        );

        for (uint256 index = 0; index < badgeIds.length; index++) {
            uint256 badgeId = badgeIds[index];
            if (badgeId == 0) break;
            if (!_poapOwners[badgeId][msg.sender]) {
                _claimPOAP(badgeIds[index], msg.sender);
            }
        }
    }

    function claimVerifiedBadge(
        uint256[] calldata genesisMice,
        uint256[] calldata babyMice,
        uint256 badgeIdToClaim
    ) external {
        uint256[] memory badgeIds = IBadgesVerifier(badgesVerifierAddress).claimableBadges(
            genesisMice,
            babyMice,
            msg.sender
        );

        for (uint256 index = 0; index < badgeIds.length; index++) {
            uint256 badgeId = badgeIds[index];
            if (badgeId == 0) break;
            if (badgeIdToClaim == badgeId) {
                if (!_poapOwners[badgeId][msg.sender]) {
                    _claimPOAP(badgeIds[index], msg.sender);
                }
            }
        }
    }

    function getVerifiedBadges(uint256[] memory genesisMice, uint256[] memory babyMice)
        external
        view
        returns (uint256[] memory)
    {
        return IBadgesVerifier(badgesVerifierAddress).claimableBadges(genesisMice, babyMice, msg.sender);
    }

    function buyBoard(uint256 boardId) external {
        require(boardPrices[boardId] > 0, "price not set");
        ICheeth(cheethAddress).burnFrom(msg.sender, boardPrices[boardId]);
        if (!_minted(msg.sender)) {
            _mint(msg.sender);
            currentBoard[msg.sender] = boardId;
        }
        _claimBoard(boardId, msg.sender);
    }

    function setBoardName(string memory name) external {
        boardNames[msg.sender] = name;
    }

    function externalClaimBoard(uint256 boardId, address to) external {
        require(_auth[msg.sender], "no auth");
        _claimBoard(boardId, to);
    }

    function externalClaimPOAP(uint256 id, address to) external {
        require(_auth[msg.sender], "no auth");
        _claimPOAP(id, to);
    }

    function tokenURI(uint256 id) public view override returns (string memory) {
        return IDescriptor(descriptorAddress).tokenURI(id);
    }

    function rearrangeBoardAndName(
        uint256 boardId,
        uint256[] memory slots,
        string memory text
    ) external {
        if (boardId != currentBoard[msg.sender]) _swapBoard(boardId, false);
        _rearrangePOAPs(slots);
        boardNames[msg.sender] = text;
    }

    function previewBoard(
        uint256 boardId,
        uint256[] calldata badges,
        string memory text
    ) external view returns (string memory) {
        return IDescriptor(descriptorAddress).buildSvg(boardId, badges, text, true);
    }

    function setDescriptorAddress(address _descriptorAddress) external onlyOwner {
        descriptorAddress = _descriptorAddress;
    }

    function setCheethAddress(address _cheethAddress) external onlyOwner {
        cheethAddress = _cheethAddress;
    }

    function setBadgesVerifierAddress(address _badgesVerifierAddress) external onlyOwner {
        badgesVerifierAddress = _badgesVerifierAddress;
    }

    function setAuth(address wallet, bool value) external onlyOwner {
        _auth[wallet] = value;
    }

    function setIsPaused(bool value) external onlyOwner {
        isPaused = value;
    }

    function setBoardPrice(uint256 boardId, uint256 boardPrice) external onlyOwner {
        boardPrices[boardId] = boardPrice;
    }
}
/* solhint-enable quotes */

File 2 of 13 : POAPBoard.sol
/* solhint-disable quotes */
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "./ERC721UniqueBound.sol";
import "./IPOAPBoard.sol";
import "./POAPLibrary.sol";

contract POAPBoard is Ownable, ERC721UniqueBound {
    mapping(uint256 => mapping(address => bool)) internal _poapOwners;
    mapping(address => mapping(uint256 => uint256)) internal _poaps;

    uint256 public boardCount;
    uint256 public poapCount;
    mapping(uint256 => POAPLibrary.Board) public boards;
    mapping(address => uint256) public currentBoard;
    mapping(address => uint256) public poapsBalanceOf;
    mapping(uint256 => bytes32) public merkleRootsByPOAPId;
    mapping(uint256 => bytes32) public merkleRootsByBoardId;
    mapping(address => mapping(uint256 => bool)) public availableBoards;
    mapping(address => mapping(uint256 => uint256)) public poapPositions;

    constructor(string memory name_, string memory symbol_) ERC721UniqueBound(name_, symbol_) {}

    function mint() external virtual {
        _mint(msg.sender);
        availableBoards[msg.sender][1] = true;
        currentBoard[msg.sender] = 1;
    }

    function claimBoard(uint256 boardId, bytes32[] calldata proof) external {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(proof, merkleRootsByBoardId[boardId], leaf), "not in whitelist");
        _claimBoard(boardId, msg.sender);
    }

    function claimPOAP(uint256 id, bytes32[] calldata proof) public {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(proof, merkleRootsByPOAPId[id], leaf), "not in whitelist");
        _claimPOAP(id, msg.sender);
    }

    function setCurrentBoard(uint256 boardId) external {
        _swapBoard(boardId, true);
    }

    function rearrangeBoard(uint256 boardId, uint256[] memory slots) external {
        if (boardId != currentBoard[msg.sender]) _swapBoard(boardId, false);
        _rearrangePOAPs(slots);
    }

    function rearrangePOAPs(uint256[] memory slots) external {
        _rearrangePOAPs(slots);
    }

    function _rearrangePOAPs(uint256[] memory slots) internal {
        POAPLibrary.Board memory selectedBoard = boards[currentBoard[msg.sender]];
        require(slots.length == selectedBoard.slots.length, "wrong size");
        for (uint256 index = 0; index < slots.length; index++) {
            uint256 poapId = slots[index];
            for (uint256 innerIndex = 0; innerIndex < index; innerIndex++) {
                require(poapId == 0 || poapId != slots[innerIndex], "already used");
            }
            poapPositions[msg.sender][index] = _poapOwners[poapId][msg.sender] ? poapId : 0;
        }
    }

    function _swapBoard(uint256 boardId, bool shouldWipe) internal {
        require(currentBoard[msg.sender] != boardId, "same board");
        require(availableBoards[msg.sender][boardId], "locked board");

        currentBoard[msg.sender] = boardId;
        if (shouldWipe) {
            POAPLibrary.Board memory selectedBoard = boards[boardId];
            for (uint256 index = 0; index < selectedBoard.slots.length; index++) {
                poapPositions[msg.sender][index] = 0;
            }
        }
    }

    function getAllPOAPs(address wallet) public view returns (uint256[] memory) {
        uint256 poapsCount = poapsBalanceOf[wallet];
        uint256[] memory poaps = new uint256[](poapsCount);
        for (uint256 index = 0; index < poapsCount; index++) {
            poaps[index] = _poaps[wallet][index];
        }
        return poaps;
    }

    function getBoardPOAPs(address wallet) public view returns (uint256[] memory) {
        POAPLibrary.Board memory selectedBoard = boards[currentBoard[wallet]];
        uint256[] memory poaps = new uint256[](selectedBoard.slots.length);
        for (uint256 index = 0; index < poaps.length; index++) {
            poaps[index] = poapPositions[wallet][index];
        }
        return poaps;
    }

    function getBoards(address wallet) public view returns (POAPLibrary.Board[] memory) {
        uint256 walletCount;
        for (uint256 boardId = 1; boardId <= boardCount; boardId++) {
            if (availableBoards[wallet][boardId]) {
                walletCount++;
            }
        }
        POAPLibrary.Board[] memory walletBoards = new POAPLibrary.Board[](walletCount);
        uint256 walletBoardsIndex;
        for (uint256 boardId = 1; boardId <= boardCount; boardId++) {
            if (availableBoards[wallet][boardId]) {
                walletBoards[walletBoardsIndex++] = boards[boardId];
            }
        }
        return walletBoards;
    }

    function getCurrentBoard(address wallet) public view returns (POAPLibrary.Board memory) {
        return boards[currentBoard[wallet]];
    }

    function getWalletState(address wallet)
        external
        view
        returns (
            uint256[] memory,
            POAPLibrary.Board[] memory,
            POAPLibrary.Board memory
        )
    {
        return (getAllPOAPs(wallet), getBoards(wallet), getCurrentBoard(wallet));
    }

    function getBoard(uint256 boardId) external view returns (POAPLibrary.Board memory) {
        return boards[boardId];
    }

    function _claimPOAP(uint256 poapId, address to) internal existingPOAP(poapId) {
        if (_poapOwners[poapId][to]) return;
        _poapOwners[poapId][to] = true;
        _poaps[to][poapsBalanceOf[to]] = poapId;
        poapsBalanceOf[to]++;
    }

    function _claimBoard(uint256 boardId, address to) internal existingBoard(boardId) {
        require(_minted(to), "mint required");
        require(!availableBoards[to][boardId], "already claimed");
        availableBoards[to][boardId] = true;
    }

    // OWNER FUNCTIONS

    function registerBoard(
        uint64 width,
        uint64 height,
        POAPLibrary.Slot[] memory slots
    ) external onlyOwner {
        boardCount++;
        POAPLibrary.Board storage newBoard = boards[boardCount];
        newBoard.id = uint128(boardCount);
        newBoard.width = width;
        newBoard.height = height;
        for (uint256 index = 0; index < slots.length; index++) {
            newBoard.slots.push(slots[index]);
        }
    }

    function registerPOAP() external onlyOwner {
        poapCount++;
    }

    function setPOAPCount(uint256 count) external onlyOwner {
        poapCount = count;
    }

    function overrideBoard(
        uint128 id,
        uint64 width,
        uint64 height,
        POAPLibrary.Slot[] memory slots
    ) external onlyOwner existingBoard(id) {
        POAPLibrary.Board storage newBoard = boards[id];
        newBoard.id = id;
        newBoard.width = width;
        newBoard.height = height;
        uint256 oldSlotsSize = newBoard.slots.length; // 3
        for (uint256 index = 0; index < slots.length; index++) {
            if (oldSlotsSize <= index) {
                newBoard.slots.push(slots[index]);
            } else {
                newBoard.slots[index] = slots[index];
            }
        }
    }

    function setMerkleRootsByPOAPId(uint256 poapId, bytes32 merkleRoot) external onlyOwner {
        merkleRootsByPOAPId[poapId] = merkleRoot;
    }

    function setMerkleRootsByBoardId(uint256 boardId, bytes32 merkleRoot) external onlyOwner {
        merkleRootsByBoardId[boardId] = merkleRoot;
    }

    modifier existingBoard(uint256 boardId) {
        require(boardId <= boardCount, "unknown board");
        _;
    }

    modifier existingPOAP(uint256 poapId) {
        require(poapId <= poapCount, "unknown poap");
        _;
    }
}
/* solhint-enable quotes */

File 3 of 13 : POAPLibrary.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;

library POAPLibrary {
    struct Slot {
        uint32 x;
        uint32 y;
        uint32 scale;
    }
    struct Board {
        uint128 id;
        uint64 width;
        uint64 height;
        Slot[] slots;
    }

    string internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return "";

        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F)))))
                resultPtr := add(resultPtr, 1)
                mstore(resultPtr, shl(248, mload(add(tablePtr, and(input, 0x3F)))))
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 4 of 13 : IDescriptor.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

interface IDescriptor {
    function badgeImages(uint256 badgeId) external view returns (string memory);

    function boardImages(uint256 boardId) external view returns (string memory);

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

    function getSvg(uint256 id) external view returns (string memory);

    function buildSvg(
        uint256 boardId,
        uint256[] memory poaps,
        string memory boardName,
        bool isPreview
    ) external view returns (string memory);
}

File 5 of 13 : IBadgesVerifier.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "./POAPLibrary.sol";

interface IBadgesVerifier {
    function claimableBadges(
        uint256[] memory genesisMice,
        uint256[] memory babyMice,
        address wallet
    ) external view returns (uint256[] memory);
}

File 6 of 13 : ICheeth.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

interface ICheeth is IERC20 {
    function burnFrom(address account, uint256 amount) external;
}

File 7 of 13 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

File 8 of 13 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

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

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

File 9 of 13 : ERC721UniqueBound.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.1.0
// Creator: Chiru Labs

pragma solidity ^0.8.7;

import "./IERC721UniqueBound.sol";

contract ERC721UniqueBound is IERC721UniqueBound {
    uint256 private _currentIndex;

    string private _name;

    string private _symbol;

    mapping(uint256 => address) private _ownerships;

    mapping(address => uint256) private _ownerToTokenId;

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

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

    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _minted(owner) ? 1 : 0;
    }

    function _minted(address owner) internal view returns (bool) {
        uint256 tokenId = _ownerToTokenId[owner];
        return _ownerships[tokenId] == owner;
    }

    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownerships[tokenId];
    }

    function tokenOf(address owner) public view override returns (uint256) {
        return _ownerToTokenId[owner];
    }

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

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

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

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

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

    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex;
    }

    function _mint(address to) internal {
        if (to == address(0)) revert MintToZeroAddress();
        if (_minted(to)) revert MintToExistingOwnerAddress();

        _ownerships[_currentIndex] = to;
        _ownerToTokenId[to] = _currentIndex;
        emit Transfer(address(0), to, _currentIndex);
        _currentIndex++;
    }

    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit),
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for {
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp {
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } {
                // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }

            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}

File 10 of 13 : IPOAPBoard.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

import "./POAPLibrary.sol";

interface IPOAPBoard {
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

    function getAllPOAPs(address wallet) external view returns (uint256[] memory);

    function getBoardPOAPs(address wallet) external view returns (uint256[] memory);

    function currentBoard(address wallet) external view returns (uint256);

    function getBoard(uint256 boardId) external view returns (POAPLibrary.Board memory);
}

File 11 of 13 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 12 of 13 : IERC721UniqueBound.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

interface IERC721UniqueBound {
    error MintZeroQuantity();
    error MintToZeroAddress();
    error MintToExistingOwnerAddress();
    error BalanceQueryForZeroAddress();
    error URIQueryForNonexistentToken();

    function totalSupply() external view returns (uint256);

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

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

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

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

    function tokenOf(address owner) external view returns (uint256);

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToExistingOwnerAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"availableBoards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"badgesVerifierAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"boardCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"boardNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boardPrices","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"boards","outputs":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"buyBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cheethAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"bytes32[][]","name":"proofs","type":"bytes32[][]"},{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"}],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claimPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"},{"internalType":"uint256","name":"badgeIdToClaim","type":"uint256"}],"name":"claimVerifiedBadge","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"currentBoard","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"descriptorAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"externalClaimBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"externalClaimPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getAllPOAPs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"getBoard","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getBoardPOAPs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getBoards","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getCurrentBoard","outputs":[{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"genesisMice","type":"uint256[]"},{"internalType":"uint256[]","name":"babyMice","type":"uint256[]"}],"name":"getVerifiedBadges","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"}],"name":"getWalletState","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"},{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board[]","name":"","type":"tuple[]"},{"components":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"internalType":"struct POAPLibrary.Board","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRootsByBoardId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"merkleRootsByPOAPId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint128","name":"id","type":"uint128"},{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"name":"overrideBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poapCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"poapPositions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"poapsBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"badges","type":"uint256[]"},{"internalType":"string","name":"text","type":"string"}],"name":"previewBoard","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"slots","type":"uint256[]"}],"name":"rearrangeBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256[]","name":"slots","type":"uint256[]"},{"internalType":"string","name":"text","type":"string"}],"name":"rearrangeBoardAndName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"slots","type":"uint256[]"}],"name":"rearrangePOAPs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"width","type":"uint64"},{"internalType":"uint64","name":"height","type":"uint64"},{"components":[{"internalType":"uint32","name":"x","type":"uint32"},{"internalType":"uint32","name":"y","type":"uint32"},{"internalType":"uint32","name":"scale","type":"uint32"}],"internalType":"struct POAPLibrary.Slot[]","name":"slots","type":"tuple[]"}],"name":"registerBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registerPOAP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"value","type":"bool"}],"name":"setAuth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_badgesVerifierAddress","type":"address"}],"name":"setBadgesVerifierAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"}],"name":"setBoardName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"uint256","name":"boardPrice","type":"uint256"}],"name":"setBoardPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_cheethAddress","type":"address"}],"name":"setCheethAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"}],"name":"setCurrentBoard","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_descriptorAddress","type":"address"}],"name":"setDescriptorAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"setIsPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"boardId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRootsByBoardId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poapId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setMerkleRootsByPOAPId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"setPOAPCount","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":"address","name":"owner","type":"address"}],"name":"tokenOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526013805460ff60a01b1916600160a01b1790553480156200002457600080fd5b506040518060400160405280601981526020017f416e6f6e796d69636520436f6c6c6563746f72204361726473000000000000008152506040518060400160405280601781526020017f416e6f6e796d696365436f6c6c6563746f7243617264730000000000000000008152508181620000ad620000a7620000e860201b60201c565b620000ec565b8151620000c29060029060208501906200013c565b508051620000d89060039060208401906200013c565b5060018055506200021f92505050565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b8280546200014a90620001e2565b90600052602060002090601f0160209004810192826200016e5760008555620001b9565b82601f106200018957805160ff1916838001178555620001b9565b82800160010185558215620001b9579182015b82811115620001b95782518255916020019190600101906200019c565b50620001c7929150620001cb565b5090565b5b80821115620001c75760008155600101620001cc565b600181811c90821680620001f757607f821691505b602082108114156200021957634e487b7160e01b600052602260045260246000fd5b50919050565b613738806200022f6000396000f3fe608060405234801561001057600080fd5b50600436106103995760003560e01c80635bab8340116101e95780639c29b5791161010f578063d0ef63c4116100ad578063fc3e4ddb1161007c578063fc3e4ddb146108d0578063fcf71219146108e3578063fd36b011146108f6578063fd807c981461091657600080fd5b8063d0ef63c414610869578063d55ab9fa1461087c578063e3f4979f146108aa578063f2fde38b146108bd57600080fd5b8063ad38f95a116100e9578063ad38f95a14610826578063b187bd261461082f578063bac7a16d14610843578063c87b56dd1461085657600080fd5b80639c29b579146107ed5780639ff2c0c714610800578063a6c581291461081357600080fd5b806388a390df1161018757806395691a7f1161015657806395691a7f1461072657806395d89b411461075157806397b89ba2146107595780639a7083f91461077957600080fd5b806388a390df146106d75780638da5cb5b146106ea57806390b1de26146106fb578063955189c81461070457600080fd5b80636352211e116101c35780636352211e1461068057806370a08231146106a9578063715018a6146106bc5780637c0c1e42146106c457600080fd5b80635bab8340146106475780635ff800c01461065a57806360fdbc591461066d57600080fd5b80632c97696f116102ce57806342ec38e21161026c5780634cf892f71161023b5780634cf892f7146105fb5780634e63950c1461060e57806350409f851461062157806352dc224f1461063457600080fd5b806342ec38e21461057f57806345e09e54146105a8578063460ddc25146105c8578063487958bd146105e857600080fd5b806338fd37df116102a857806338fd37df146105265780633b465ea8146105395780633cb1a1e01461054c578063416fe8701461055f57600080fd5b80632c97696f146104e05780632e2a4690146104f357806338cd901a1461051e57600080fd5b806318160ddd1161033b578063240976bf11610315578063240976bf1461049457806324dbb7de146104a757806329d7f9eb146104ba5780632b689aa6146104cd57600080fd5b806318160ddd1461043e5780631fc4ce53146104545780632389e78a1461047457600080fd5b80630f759cfc116103775780630f759cfc146103f0578063115288f71461041057806311d7ba9e146104235780631249c58b1461043657600080fd5b806301ffc9a71461039e57806306fdde03146103c65780630b44a218146103db575b600080fd5b6103b16103ac366004612ed6565b610929565b60405190151581526020015b60405180910390f35b6103ce61097b565b6040516103bd9190613495565b6103ee6103e9366004612bf2565b610a0d565b005b6104036103fe366004612e58565b610a6b565b6040516103bd9190613401565b6103ee61041e366004613036565b610afb565b6103ee610431366004613146565b610b52565b6103ee610ba2565b600154600019015b6040519081526020016103bd565b610446610462366004612bd7565b600b6020526000908152604090205481565b61044661048236600461301d565b60146020526000908152604090205481565b6103ee6104a2366004612ebb565b610bd9565b6103ee6104b5366004612f00565b610c21565b6103ee6104c83660046131b2565b610c41565b6104036104db366004612bd7565b610c7d565b6103ce6104ee3660046130a4565b610d45565b601254610506906001600160a01b031681565b6040516001600160a01b0390911681526020016103bd565b6103ee610ddc565b6103ee61053436600461310a565b610e1d565b6103ee610547366004612bd7565b610e47565b6103ee61055a366004613059565b610e93565b61044661056d36600461301d565b600e6020526000908152604090205481565b61044661058d366004612bd7565b6001600160a01b031660009081526005602052604090205490565b6105bb6105b636600461301d565b610f38565b6040516103bd9190613507565b6104466105d6366004612bd7565b600c6020526000908152604090205481565b6105bb6105f6366004612bd7565b61102b565b6103ce610609366004612bd7565b611121565b6103ee61061c36600461301d565b6111bb565b6103ee61062f3660046131b2565b6111ea565b6103ee61064236600461301d565b611226565b601354610506906001600160a01b031681565b610403610668366004612bd7565b61131c565b6103ee61067b366004612d85565b6114aa565b61050661068e36600461301d565b6000908152600460205260409020546001600160a01b031690565b6104466106b7366004612bd7565b6114b3565b6103ee6114fc565b6103ee6106d23660046131b2565b611532565b6103ee6106e536600461301d565b61156e565b6000546001600160a01b0316610506565b61044660085481565b610717610712366004612bd7565b611579565b6040516103bd93929190613414565b610446610734366004612c25565b601060209081526000928352604080842090915290825290205481565b6103ce6115cd565b61076c610767366004612bd7565b6115dc565b6040516103bd91906133ac565b6107be61078736600461301d565b600a602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b604080516001600160801b0390941684526001600160401b0392831660208501529116908201526060016103bd565b6103ee6107fb366004612fa1565b6117f0565b601154610506906001600160a01b031681565b6103ee610821366004612d12565b6119ff565b61044660095481565b6013546103b190600160a01b900460ff1681565b6103ee610851366004613059565b611b2f565b6103ce61086436600461301d565b611bd4565b6103ee610877366004613036565b611c55565b6103b161088a366004612c25565b600f60209081526000928352604080842090915290825290205460ff1681565b6103ee6108b8366004612bd7565b611ca8565b6103ee6108cb366004612bd7565b611cf4565b6103ee6108de366004612bd7565b611d8c565b6103ee6108f1366004612c4f565b611dd8565b61044661090436600461301d565b600d6020526000908152604090205481565b6103ee6109243660046131d4565b612010565b60006301ffc9a760e01b6001600160e01b03198316148061095a57506380ac58cd60e01b6001600160e01b03198316145b806109755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461098a90613672565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690613672565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000546001600160a01b03163314610a405760405162461bcd60e51b8152600401610a37906134a8565b60405180910390fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b601354604051632cfbb5ff60e11b81526060916001600160a01b0316906359f76bfe90610aa090869086903390600401613457565b60006040518083038186803b158015610ab857600080fd5b505afa158015610acc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af49190810190612dc1565b9392505050565b3360009081526016602052604090205460ff16610b445760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261214d565b5050565b336000908152600b60205260409020548314610b7357610b73836000612226565b610b7c826123ec565b3360009081526015602090815260409091208251610b9c9284019061292b565b50505050565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bc8199c9959481b5a5b9d60a21b6044820152606401610a37565b6000546001600160a01b03163314610c035760405162461bcd60e51b8152600401610a37906134a8565b60138054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526015602090815260409091208251610b4e9284019061292b565b6000546001600160a01b03163314610c6b5760405162461bcd60e51b8152600401610a37906134a8565b60009182526014602052604090912055565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b03811115610cb157610cb16136ec565b604051908082528060200260200182016040528015610cda578160200160208202803683370190505b50905060005b82811015610d3d576001600160a01b03851660009081526007602090815260408083208484529091529020548251839083908110610d2057610d206136d6565b602090810291909101015280610d35816136ad565b915050610ce0565b509392505050565b60125460405163edf2efe360e01b81526060916001600160a01b03169063edf2efe390610d7f90889088908890889060019060040161351a565b60006040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dd39190810190612f34565b95945050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a37906134a8565b60098054906000610e16836136ad565b9190505550565b336000908152600b60205260409020548214610e3e57610e3e826000612226565b610b4e816123ec565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610a37906134a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f128383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600d602052604090205492508591506126069050565b610f2e5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361214d565b60408051608081018252600080825260208201819052918101919091526060808201526000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b8282101561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b505050915250909392505050565b60408051608081018252600080825260208201819052918101919091526060808201526001600160a01b0382166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b909104168184015260018201805484518187028101870190955280855291959294606087019493919291908401821561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b6015602052600090815260409020805461113a90613672565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613672565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b6000546001600160a01b031633146111e55760405162461bcd60e51b8152600401610a37906134a8565b600955565b6000546001600160a01b031633146112145760405162461bcd60e51b8152600401610a37906134a8565b6000918252600d602052604090912055565b6000818152601460205260409020546112715760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481b9bdd081cd95d609a1b6044820152606401610a37565b6011546000828152601460205260409081902054905163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506112ef3361261c565b61130f576112fc3361264a565b336000908152600b602052604090208190555b611319813361271a565b50565b6001600160a01b0381166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b90910416818401526001820180548451818702810187019095528085526060969592948588019390929190879084015b828210156113f4576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b90910416908201528252600190920191016113a1565b5050505081525050905060008160600151516001600160401b0381111561141d5761141d6136ec565b604051908082528060200260200182016040528015611446578160200160208202803683370190505b50905060005b8151811015610d3d576001600160a01b0385166000908152601060209081526040808320848452909152902054825183908390811061148d5761148d6136d6565b6020908102919091010152806114a2816136ad565b91505061144c565b611319816123ec565b60006001600160a01b0382166114dc576040516323d3ad8160e21b815260040160405180910390fd5b6114e58261261c565b6114f05760006114f3565b60015b60ff1692915050565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610a37906134a8565b6115306000612837565b565b6000546001600160a01b0316331461155c5760405162461bcd60e51b8152600401610a37906134a8565b6000918252600e602052604090912055565b611319816001612226565b6060806115a5604080516080810182526000808252602082018190529181019190915260608082015290565b6115ae84610c7d565b6115b7856115dc565b6115c08661102b565b9250925092509193909250565b60606003805461098a90613672565b6060600060015b6008548111611638576001600160a01b0384166000908152600f6020908152604080832084845290915290205460ff16156116265781611622816136ad565b9250505b80611630816136ad565b9150506115e3565b506000816001600160401b03811115611653576116536136ec565b6040519080825280602002602001820160405280156116a457816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816116715790505b509050600060015b60085481116117e6576001600160a01b0386166000908152600f6020908152604080832084845290915290205460ff16156117d4576000818152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b828210156117a3576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101611750565b505050915250849050836117b6816136ad565b9450815181106117c8576117c86136d6565b60200260200101819052505b806117de816136ad565b9150506116ac565b5090949350505050565b6000546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a37906134a8565b836001600160801b03166008548111156118665760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6001600160801b0385166000818152600a6020526040812080546001600160401b03878116600160c01b026001600160c01b03918a16600160801b026001600160c01b031990931690951791909117169290921782556001820154905b84518110156119f55780821161195857826001018582815181106118e9576118e96136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790556119e3565b84818151811061196a5761196a6136d6565b6020026020010151836001018281548110611987576119876136d6565b60009182526020918290208351910180549284015160409094015163ffffffff908116600160401b0263ffffffff60401b19958216600160201b0267ffffffffffffffff19909516919093161792909217929092169190911790555b806119ed816136ad565b9150506118c3565b5050505050505050565b601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611a3890899089908990899033906004016133bf565b60006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8c9190810190612dc1565b905060005b8151811015611b26576000828281518110611aae57611aae6136d6565b602002602001015190508060001415611ac75750611b26565b80841415611b1357600081815260066020908152604080832033845290915290205460ff16611b1357611b13838381518110611b0557611b056136d6565b60200260200101513361214d565b5080611b1e816136ad565b915050611a91565b50505050505050565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bae8383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600e602052604090205492508591506126069050565b611bca5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361271a565b60125460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd9060240160006040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109759190810190612f34565b3360009081526016602052604090205460ff16611c9e5760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261271a565b6000546001600160a01b03163314611cd25760405162461bcd60e51b8152600401610a37906134a8565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611d1e5760405162461bcd60e51b8152600401610a37906134a8565b6001600160a01b038116611d835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b61131981612837565b6000546001600160a01b03163314611db65760405162461bcd60e51b8152600401610a37906134a8565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60005b87811015611ef2576040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ea1888884818110611e2c57611e2c6136d6565b9050602002810190611e3e919061355b565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600d935091508e90508d87818110611e8557611e856136d6565b9050602002013581526020019081526020016000205483612606565b611ebd5760405162461bcd60e51b8152600401610a37906134dd565b611edf8a8a84818110611ed257611ed26136d6565b905060200201353361214d565b5080611eea816136ad565b915050611ddb565b50601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611f2c90889088908890889033906004016133bf565b60006040518083038186803b158015611f4457600080fd5b505afa158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f809190810190612dc1565b905060005b8151811015612004576000828281518110611fa257611fa26136d6565b602002602001015190508060001415611fbb5750612004565b600081815260066020908152604080832033845290915290205460ff16611ff157611ff1838381518110611b0557611b056136d6565b5080611ffc816136ad565b915050611f85565b50505050505050505050565b6000546001600160a01b0316331461203a5760405162461bcd60e51b8152600401610a37906134a8565b6008805490600061204a836136ad565b90915550506008546000818152600a6020526040812080546001600160401b03868116600160c01b026001600160c01b03918916600160801b026001600160c01b03199093166001600160801b039096169590951791909117169290921782555b825181101561214657816001018382815181106120ca576120ca6136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790558061213e816136ad565b9150506120ab565b5050505050565b8160095481111561218f5760405162461bcd60e51b815260206004820152600c60248201526b0756e6b6e6f776e20706f61760a41b6044820152606401610a37565b60008381526006602090815260408083206001600160a01b038616845290915290205460ff16156121bf57505050565b60008381526006602090815260408083206001600160a01b038616808552908352818420805460ff1916600117905560078352818420600c80855283862080548752918552928520889055908452915280549161221b836136ad565b91905055505b505050565b336000908152600b60205260409020548214156122725760405162461bcd60e51b815260206004820152600a6024820152691cd85b5948189bd85c9960b21b6044820152606401610a37565b336000908152600f6020908152604080832085845290915290205460ff166122cb5760405162461bcd60e51b815260206004820152600c60248201526b1b1bd8dad95908189bd85c9960a21b6044820152606401610a37565b336000908152600b602052604090208290558015610b4e576000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156123a5576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612352565b5050505081525050905060005b816060015151811015610b9c57336000908152601060209081526040808320848452909152812055806123e4816136ad565b9150506123b2565b336000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156124b9576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612466565b505050508152505090508060600151518251146125055760405162461bcd60e51b815260206004820152600a60248201526977726f6e672073697a6560b01b6044820152606401610a37565b60005b8251811015612221576000838281518110612525576125256136d6565b6020026020010151905060005b828110156125ad578115806125605750848181518110612554576125546136d6565b60200260200101518214155b61259b5760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481d5cd95960a21b6044820152606401610a37565b806125a5816136ad565b915050612532565b50600081815260066020908152604080832033845290915290205460ff166125d65760006125d8565b805b33600090815260106020908152604080832086845290915290205550806125fe816136ad565b915050612508565b6000826126138584612887565b14949350505050565b6001600160a01b03908116600081815260056020908152604080832054835260049091529020549091161490565b6001600160a01b03811661267057604051622e076360e81b815260040160405180910390fd5b6126798161261c565b1561269757604051630101657360e41b815260040160405180910390fd5b60018054600090815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091559354848452600590925280832082905551909291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460018054906000612712836136ad565b919050555050565b8160085481111561275d5760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6127668261261c565b6127a25760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d081c995c5d5a5c9959609a1b6044820152606401610a37565b6001600160a01b0382166000908152600f6020908152604080832086845290915290205460ff16156128085760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b6044820152606401610a37565b506001600160a01b03166000908152600f6020908152604080832093835292905220805460ff19166001179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610d3d5760008582815181106128a9576128a96136d6565b602002602001015190508083116128eb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612918565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612923816136ad565b91505061288c565b82805461293790613672565b90600052602060002090601f016020900481019282612959576000855561299f565b82601f1061297257805160ff191683800117855561299f565b8280016001018555821561299f579182015b8281111561299f578251825591602001919060010190612984565b506129ab9291506129af565b5090565b5b808211156129ab57600081556001016129b0565b80356001600160a01b03811681146129db57600080fd5b919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b6020830191508360208260051b8501011115612a2457600080fd5b9250929050565b600082601f830112612a3c57600080fd5b81356020612a51612a4c836135fc565b6135cc565b82815281810190858301606080860288018501891015612a7057600080fd5b6000805b87811015612acf5782848c031215612a8a578182fd5b612a926135a4565b612a9b85612bac565b8152612aa8888601612bac565b888201526040612ab9818701612bac565b9082015286529486019492820192600101612a74565b50929998505050505050505050565b600082601f830112612aef57600080fd5b81356020612aff612a4c836135fc565b80838252828201915082860187848660051b8901011115612b1f57600080fd5b60005b85811015612b3e57813584529284019290840190600101612b22565b5090979650505050505050565b803580151581146129db57600080fd5b600082601f830112612b6c57600080fd5b8135612b7a612a4c8261361f565b818152846020838601011115612b8f57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146129db57600080fd5b80356001600160401b03811681146129db57600080fd5b600060208284031215612be957600080fd5b610af4826129c4565b60008060408385031215612c0557600080fd5b612c0e836129c4565b9150612c1c60208401612b4b565b90509250929050565b60008060408385031215612c3857600080fd5b612c41836129c4565b946020939093013593505050565b6000806000806000806000806080898b031215612c6b57600080fd5b88356001600160401b0380821115612c8257600080fd5b612c8e8c838d016129e0565b909a50985060208b0135915080821115612ca757600080fd5b612cb38c838d016129e0565b909850965060408b0135915080821115612ccc57600080fd5b612cd88c838d016129e0565b909650945060608b0135915080821115612cf157600080fd5b50612cfe8b828c016129e0565b999c989b5096995094979396929594505050565b600080600080600060608688031215612d2a57600080fd5b85356001600160401b0380821115612d4157600080fd5b612d4d89838a016129e0565b90975095506020880135915080821115612d6657600080fd5b50612d73888289016129e0565b96999598509660400135949350505050565b600060208284031215612d9757600080fd5b81356001600160401b03811115612dad57600080fd5b612db984828501612ade565b949350505050565b60006020808385031215612dd457600080fd5b82516001600160401b03811115612dea57600080fd5b8301601f81018513612dfb57600080fd5b8051612e09612a4c826135fc565b80828252848201915084840188868560051b8701011115612e2957600080fd5b600094505b83851015612e4c578051835260019490940193918501918501612e2e565b50979650505050505050565b60008060408385031215612e6b57600080fd5b82356001600160401b0380821115612e8257600080fd5b612e8e86838701612ade565b93506020850135915080821115612ea457600080fd5b50612eb185828601612ade565b9150509250929050565b600060208284031215612ecd57600080fd5b610af482612b4b565b600060208284031215612ee857600080fd5b81356001600160e01b031981168114610af457600080fd5b600060208284031215612f1257600080fd5b81356001600160401b03811115612f2857600080fd5b612db984828501612b5b565b600060208284031215612f4657600080fd5b81516001600160401b03811115612f5c57600080fd5b8201601f81018413612f6d57600080fd5b8051612f7b612a4c8261361f565b818152856020838501011115612f9057600080fd5b610dd3826020830160208601613646565b60008060008060808587031215612fb757600080fd5b84356001600160801b0381168114612fce57600080fd5b9350612fdc60208601612bc0565b9250612fea60408601612bc0565b915060608501356001600160401b0381111561300557600080fd5b61301187828801612a2b565b91505092959194509250565b60006020828403121561302f57600080fd5b5035919050565b6000806040838503121561304957600080fd5b82359150612c1c602084016129c4565b60008060006040848603121561306e57600080fd5b8335925060208401356001600160401b0381111561308b57600080fd5b613097868287016129e0565b9497909650939450505050565b600080600080606085870312156130ba57600080fd5b8435935060208501356001600160401b03808211156130d857600080fd5b6130e4888389016129e0565b909550935060408701359150808211156130fd57600080fd5b5061301187828801612b5b565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b612eb185828601612ade565b60008060006060848603121561315b57600080fd5b8335925060208401356001600160401b038082111561317957600080fd5b61318587838801612ade565b9350604086013591508082111561319b57600080fd5b506131a886828701612b5b565b9150509250925092565b600080604083850312156131c557600080fd5b50508035926020909101359150565b6000806000606084860312156131e957600080fd5b6131f284612bc0565b925061320060208501612bc0565b915060408401356001600160401b0381111561321b57600080fd5b6131a886828701612a2b565b6000815180845260208085019450848260051b860182860160005b85811015612b3e57838303895261325a838351613309565b98850198925090840190600101613242565b81835260006001600160fb1b0383111561328557600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156132d2578151875295820195908201906001016132b6565b509495945050505050565b600081518084526132f5816020860160208601613646565b601f01601f19169290920160200192915050565b6000608083016001600160801b0383511684526020808401516001600160401b038082168388015260409150808287015116828801525060608086015160808289015284815180875260a08a0191508583019650600092505b8083101561339f578651805163ffffffff908116845287820151811688850152908601511685830152958501956001929092019190830190613362565b5098975050505050505050565b602081526000610af46020830184613227565b6060815260006133d360608301878961326c565b82810360208401526133e681868861326c565b91505060018060a01b03831660408301529695505050505050565b602081526000610af460208301846132a2565b60608152600061342760608301866132a2565b82810360208401526134398186613227565b9050828103604084015261344d8185613309565b9695505050505050565b60608152600061346a60608301866132a2565b828103602084015261347c81866132a2565b91505060018060a01b0383166040830152949350505050565b602081526000610af460208301846132dd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b602081526000610af46020830184613309565b85815260806020820152600061353460808301868861326c565b828103604084015261354681866132dd565b91505082151560608301529695505050505050565b6000808335601e1984360301811261357257600080fd5b8301803591506001600160401b0382111561358c57600080fd5b6020019150600581901b3603821315612a2457600080fd5b604051606081016001600160401b03811182821017156135c6576135c66136ec565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135f4576135f46136ec565b604052919050565b60006001600160401b03821115613615576136156136ec565b5060051b60200190565b60006001600160401b03821115613638576136386136ec565b50601f01601f191660200190565b60005b83811015613661578181015183820152602001613649565b83811115610b9c5750506000910152565b600181811c9082168061368657607f821691505b602082108114156136a757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136cf57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220dd00670a3046a5a8fe7b418594206076f714ac2e6a32bbc4f214067f5f83313864736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103995760003560e01c80635bab8340116101e95780639c29b5791161010f578063d0ef63c4116100ad578063fc3e4ddb1161007c578063fc3e4ddb146108d0578063fcf71219146108e3578063fd36b011146108f6578063fd807c981461091657600080fd5b8063d0ef63c414610869578063d55ab9fa1461087c578063e3f4979f146108aa578063f2fde38b146108bd57600080fd5b8063ad38f95a116100e9578063ad38f95a14610826578063b187bd261461082f578063bac7a16d14610843578063c87b56dd1461085657600080fd5b80639c29b579146107ed5780639ff2c0c714610800578063a6c581291461081357600080fd5b806388a390df1161018757806395691a7f1161015657806395691a7f1461072657806395d89b411461075157806397b89ba2146107595780639a7083f91461077957600080fd5b806388a390df146106d75780638da5cb5b146106ea57806390b1de26146106fb578063955189c81461070457600080fd5b80636352211e116101c35780636352211e1461068057806370a08231146106a9578063715018a6146106bc5780637c0c1e42146106c457600080fd5b80635bab8340146106475780635ff800c01461065a57806360fdbc591461066d57600080fd5b80632c97696f116102ce57806342ec38e21161026c5780634cf892f71161023b5780634cf892f7146105fb5780634e63950c1461060e57806350409f851461062157806352dc224f1461063457600080fd5b806342ec38e21461057f57806345e09e54146105a8578063460ddc25146105c8578063487958bd146105e857600080fd5b806338fd37df116102a857806338fd37df146105265780633b465ea8146105395780633cb1a1e01461054c578063416fe8701461055f57600080fd5b80632c97696f146104e05780632e2a4690146104f357806338cd901a1461051e57600080fd5b806318160ddd1161033b578063240976bf11610315578063240976bf1461049457806324dbb7de146104a757806329d7f9eb146104ba5780632b689aa6146104cd57600080fd5b806318160ddd1461043e5780631fc4ce53146104545780632389e78a1461047457600080fd5b80630f759cfc116103775780630f759cfc146103f0578063115288f71461041057806311d7ba9e146104235780631249c58b1461043657600080fd5b806301ffc9a71461039e57806306fdde03146103c65780630b44a218146103db575b600080fd5b6103b16103ac366004612ed6565b610929565b60405190151581526020015b60405180910390f35b6103ce61097b565b6040516103bd9190613495565b6103ee6103e9366004612bf2565b610a0d565b005b6104036103fe366004612e58565b610a6b565b6040516103bd9190613401565b6103ee61041e366004613036565b610afb565b6103ee610431366004613146565b610b52565b6103ee610ba2565b600154600019015b6040519081526020016103bd565b610446610462366004612bd7565b600b6020526000908152604090205481565b61044661048236600461301d565b60146020526000908152604090205481565b6103ee6104a2366004612ebb565b610bd9565b6103ee6104b5366004612f00565b610c21565b6103ee6104c83660046131b2565b610c41565b6104036104db366004612bd7565b610c7d565b6103ce6104ee3660046130a4565b610d45565b601254610506906001600160a01b031681565b6040516001600160a01b0390911681526020016103bd565b6103ee610ddc565b6103ee61053436600461310a565b610e1d565b6103ee610547366004612bd7565b610e47565b6103ee61055a366004613059565b610e93565b61044661056d36600461301d565b600e6020526000908152604090205481565b61044661058d366004612bd7565b6001600160a01b031660009081526005602052604090205490565b6105bb6105b636600461301d565b610f38565b6040516103bd9190613507565b6104466105d6366004612bd7565b600c6020526000908152604090205481565b6105bb6105f6366004612bd7565b61102b565b6103ce610609366004612bd7565b611121565b6103ee61061c36600461301d565b6111bb565b6103ee61062f3660046131b2565b6111ea565b6103ee61064236600461301d565b611226565b601354610506906001600160a01b031681565b610403610668366004612bd7565b61131c565b6103ee61067b366004612d85565b6114aa565b61050661068e36600461301d565b6000908152600460205260409020546001600160a01b031690565b6104466106b7366004612bd7565b6114b3565b6103ee6114fc565b6103ee6106d23660046131b2565b611532565b6103ee6106e536600461301d565b61156e565b6000546001600160a01b0316610506565b61044660085481565b610717610712366004612bd7565b611579565b6040516103bd93929190613414565b610446610734366004612c25565b601060209081526000928352604080842090915290825290205481565b6103ce6115cd565b61076c610767366004612bd7565b6115dc565b6040516103bd91906133ac565b6107be61078736600461301d565b600a602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b604080516001600160801b0390941684526001600160401b0392831660208501529116908201526060016103bd565b6103ee6107fb366004612fa1565b6117f0565b601154610506906001600160a01b031681565b6103ee610821366004612d12565b6119ff565b61044660095481565b6013546103b190600160a01b900460ff1681565b6103ee610851366004613059565b611b2f565b6103ce61086436600461301d565b611bd4565b6103ee610877366004613036565b611c55565b6103b161088a366004612c25565b600f60209081526000928352604080842090915290825290205460ff1681565b6103ee6108b8366004612bd7565b611ca8565b6103ee6108cb366004612bd7565b611cf4565b6103ee6108de366004612bd7565b611d8c565b6103ee6108f1366004612c4f565b611dd8565b61044661090436600461301d565b600d6020526000908152604090205481565b6103ee6109243660046131d4565b612010565b60006301ffc9a760e01b6001600160e01b03198316148061095a57506380ac58cd60e01b6001600160e01b03198316145b806109755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60606002805461098a90613672565b80601f01602080910402602001604051908101604052809291908181526020018280546109b690613672565b8015610a035780601f106109d857610100808354040283529160200191610a03565b820191906000526020600020905b8154815290600101906020018083116109e657829003601f168201915b5050505050905090565b6000546001600160a01b03163314610a405760405162461bcd60e51b8152600401610a37906134a8565b60405180910390fd5b6001600160a01b03919091166000908152601660205260409020805460ff1916911515919091179055565b601354604051632cfbb5ff60e11b81526060916001600160a01b0316906359f76bfe90610aa090869086903390600401613457565b60006040518083038186803b158015610ab857600080fd5b505afa158015610acc573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610af49190810190612dc1565b9392505050565b3360009081526016602052604090205460ff16610b445760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261214d565b5050565b336000908152600b60205260409020548314610b7357610b73836000612226565b610b7c826123ec565b3360009081526015602090815260409091208251610b9c9284019061292b565b50505050565b60405162461bcd60e51b815260206004820152600c60248201526b1b9bc8199c9959481b5a5b9d60a21b6044820152606401610a37565b6000546001600160a01b03163314610c035760405162461bcd60e51b8152600401610a37906134a8565b60138054911515600160a01b0260ff60a01b19909216919091179055565b3360009081526015602090815260409091208251610b4e9284019061292b565b6000546001600160a01b03163314610c6b5760405162461bcd60e51b8152600401610a37906134a8565b60009182526014602052604090912055565b6001600160a01b0381166000908152600c6020526040812054606091816001600160401b03811115610cb157610cb16136ec565b604051908082528060200260200182016040528015610cda578160200160208202803683370190505b50905060005b82811015610d3d576001600160a01b03851660009081526007602090815260408083208484529091529020548251839083908110610d2057610d206136d6565b602090810291909101015280610d35816136ad565b915050610ce0565b509392505050565b60125460405163edf2efe360e01b81526060916001600160a01b03169063edf2efe390610d7f90889088908890889060019060040161351a565b60006040518083038186803b158015610d9757600080fd5b505afa158015610dab573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610dd39190810190612f34565b95945050505050565b6000546001600160a01b03163314610e065760405162461bcd60e51b8152600401610a37906134a8565b60098054906000610e16836136ad565b9190505550565b336000908152600b60205260409020548214610e3e57610e3e826000612226565b610b4e816123ec565b6000546001600160a01b03163314610e715760405162461bcd60e51b8152600401610a37906134a8565b601280546001600160a01b0319166001600160a01b0392909216919091179055565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050610f128383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600d602052604090205492508591506126069050565b610f2e5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361214d565b60408051608081018252600080825260208201819052918101919091526060808201526000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b8282101561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b505050915250909392505050565b60408051608081018252600080825260208201819052918101919091526060808201526001600160a01b0382166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b909104168184015260018201805484518187028101870190955280855291959294606087019493919291908401821561101d576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101610fca565b6015602052600090815260409020805461113a90613672565b80601f016020809104026020016040519081016040528092919081815260200182805461116690613672565b80156111b35780601f10611188576101008083540402835291602001916111b3565b820191906000526020600020905b81548152906001019060200180831161119657829003601f168201915b505050505081565b6000546001600160a01b031633146111e55760405162461bcd60e51b8152600401610a37906134a8565b600955565b6000546001600160a01b031633146112145760405162461bcd60e51b8152600401610a37906134a8565b6000918252600d602052604090912055565b6000818152601460205260409020546112715760405162461bcd60e51b815260206004820152600d60248201526c1c1c9a58d9481b9bdd081cd95d609a1b6044820152606401610a37565b6011546000828152601460205260409081902054905163079cc67960e41b815233600482015260248101919091526001600160a01b03909116906379cc679090604401600060405180830381600087803b1580156112ce57600080fd5b505af11580156112e2573d6000803e3d6000fd5b505050506112ef3361261c565b61130f576112fc3361264a565b336000908152600b602052604090208190555b611319813361271a565b50565b6001600160a01b0381166000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b90910416818401526001820180548451818702810187019095528085526060969592948588019390929190879084015b828210156113f4576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b90910416908201528252600190920191016113a1565b5050505081525050905060008160600151516001600160401b0381111561141d5761141d6136ec565b604051908082528060200260200182016040528015611446578160200160208202803683370190505b50905060005b8151811015610d3d576001600160a01b0385166000908152601060209081526040808320848452909152902054825183908390811061148d5761148d6136d6565b6020908102919091010152806114a2816136ad565b91505061144c565b611319816123ec565b60006001600160a01b0382166114dc576040516323d3ad8160e21b815260040160405180910390fd5b6114e58261261c565b6114f05760006114f3565b60015b60ff1692915050565b6000546001600160a01b031633146115265760405162461bcd60e51b8152600401610a37906134a8565b6115306000612837565b565b6000546001600160a01b0316331461155c5760405162461bcd60e51b8152600401610a37906134a8565b6000918252600e602052604090912055565b611319816001612226565b6060806115a5604080516080810182526000808252602082018190529181019190915260608082015290565b6115ae84610c7d565b6115b7856115dc565b6115c08661102b565b9250925092509193909250565b60606003805461098a90613672565b6060600060015b6008548111611638576001600160a01b0384166000908152600f6020908152604080832084845290915290205460ff16156116265781611622816136ad565b9250505b80611630816136ad565b9150506115e3565b506000816001600160401b03811115611653576116536136ec565b6040519080825280602002602001820160405280156116a457816020015b60408051608081018252600080825260208083018290529282015260608082015282526000199092019101816116715790505b509050600060015b60085481116117e6576001600160a01b0386166000908152600f6020908152604080832084845290915290205460ff16156117d4576000818152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919592946060870194939192919084015b828210156117a3576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101611750565b505050915250849050836117b6816136ad565b9450815181106117c8576117c86136d6565b60200260200101819052505b806117de816136ad565b9150506116ac565b5090949350505050565b6000546001600160a01b0316331461181a5760405162461bcd60e51b8152600401610a37906134a8565b836001600160801b03166008548111156118665760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6001600160801b0385166000818152600a6020526040812080546001600160401b03878116600160c01b026001600160c01b03918a16600160801b026001600160c01b031990931690951791909117169290921782556001820154905b84518110156119f55780821161195857826001018582815181106118e9576118e96136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790556119e3565b84818151811061196a5761196a6136d6565b6020026020010151836001018281548110611987576119876136d6565b60009182526020918290208351910180549284015160409094015163ffffffff908116600160401b0263ffffffff60401b19958216600160201b0267ffffffffffffffff19909516919093161792909217929092169190911790555b806119ed816136ad565b9150506118c3565b5050505050505050565b601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611a3890899089908990899033906004016133bf565b60006040518083038186803b158015611a5057600080fd5b505afa158015611a64573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a8c9190810190612dc1565b905060005b8151811015611b26576000828281518110611aae57611aae6136d6565b602002602001015190508060001415611ac75750611b26565b80841415611b1357600081815260066020908152604080832033845290915290205460ff16611b1357611b13838381518110611b0557611b056136d6565b60200260200101513361214d565b5080611b1e816136ad565b915050611a91565b50505050505050565b6040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611bae8383808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250898152600e602052604090205492508591506126069050565b611bca5760405162461bcd60e51b8152600401610a37906134dd565b610b9c843361271a565b60125460405163c87b56dd60e01b8152600481018390526060916001600160a01b03169063c87b56dd9060240160006040518083038186803b158015611c1957600080fd5b505afa158015611c2d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526109759190810190612f34565b3360009081526016602052604090205460ff16611c9e5760405162461bcd60e51b81526020600482015260076024820152660dcde40c2eae8d60cb1b6044820152606401610a37565b610b4e828261271a565b6000546001600160a01b03163314611cd25760405162461bcd60e51b8152600401610a37906134a8565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b03163314611d1e5760405162461bcd60e51b8152600401610a37906134a8565b6001600160a01b038116611d835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610a37565b61131981612837565b6000546001600160a01b03163314611db65760405162461bcd60e51b8152600401610a37906134a8565b601180546001600160a01b0319166001600160a01b0392909216919091179055565b60005b87811015611ef2576040516001600160601b03193360601b166020820152600090603401604051602081830303815290604052805190602001209050611ea1888884818110611e2c57611e2c6136d6565b9050602002810190611e3e919061355b565b808060200260200160405190810160405280939291908181526020018383602002808284376000920182905250600d935091508e90508d87818110611e8557611e856136d6565b9050602002013581526020019081526020016000205483612606565b611ebd5760405162461bcd60e51b8152600401610a37906134dd565b611edf8a8a84818110611ed257611ed26136d6565b905060200201353361214d565b5080611eea816136ad565b915050611ddb565b50601354604051632cfbb5ff60e11b81526000916001600160a01b0316906359f76bfe90611f2c90889088908890889033906004016133bf565b60006040518083038186803b158015611f4457600080fd5b505afa158015611f58573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f809190810190612dc1565b905060005b8151811015612004576000828281518110611fa257611fa26136d6565b602002602001015190508060001415611fbb5750612004565b600081815260066020908152604080832033845290915290205460ff16611ff157611ff1838381518110611b0557611b056136d6565b5080611ffc816136ad565b915050611f85565b50505050505050505050565b6000546001600160a01b0316331461203a5760405162461bcd60e51b8152600401610a37906134a8565b6008805490600061204a836136ad565b90915550506008546000818152600a6020526040812080546001600160401b03868116600160c01b026001600160c01b03918916600160801b026001600160c01b03199093166001600160801b039096169590951791909117169290921782555b825181101561214657816001018382815181106120ca576120ca6136d6565b60209081029190910181015182546001810184556000938452928290208151930180549282015160409092015163ffffffff908116600160401b0263ffffffff60401b19938216600160201b0267ffffffffffffffff19909516919095161792909217169190911790558061213e816136ad565b9150506120ab565b5050505050565b8160095481111561218f5760405162461bcd60e51b815260206004820152600c60248201526b0756e6b6e6f776e20706f61760a41b6044820152606401610a37565b60008381526006602090815260408083206001600160a01b038616845290915290205460ff16156121bf57505050565b60008381526006602090815260408083206001600160a01b038616808552908352818420805460ff1916600117905560078352818420600c80855283862080548752918552928520889055908452915280549161221b836136ad565b91905055505b505050565b336000908152600b60205260409020548214156122725760405162461bcd60e51b815260206004820152600a6024820152691cd85b5948189bd85c9960b21b6044820152606401610a37565b336000908152600f6020908152604080832085845290915290205460ff166122cb5760405162461bcd60e51b815260206004820152600c60248201526b1b1bd8dad95908189bd85c9960a21b6044820152606401610a37565b336000908152600b602052604090208290558015610b4e576000828152600a60209081526040808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156123a5576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612352565b5050505081525050905060005b816060015151811015610b9c57336000908152601060209081526040808320848452909152812055806123e4816136ad565b9150506123b2565b336000908152600b60209081526040808320548352600a8252808320815160808101835281546001600160801b03811682526001600160401b03600160801b8204811683870152600160c01b9091041681840152600182018054845181870281018701909552808552919492936060860193909290879084015b828210156124b9576000848152602090819020604080516060810182529185015463ffffffff8082168452600160201b8204811684860152600160401b9091041690820152825260019092019101612466565b505050508152505090508060600151518251146125055760405162461bcd60e51b815260206004820152600a60248201526977726f6e672073697a6560b01b6044820152606401610a37565b60005b8251811015612221576000838281518110612525576125256136d6565b6020026020010151905060005b828110156125ad578115806125605750848181518110612554576125546136d6565b60200260200101518214155b61259b5760405162461bcd60e51b815260206004820152600c60248201526b185b1c9958591e481d5cd95960a21b6044820152606401610a37565b806125a5816136ad565b915050612532565b50600081815260066020908152604080832033845290915290205460ff166125d65760006125d8565b805b33600090815260106020908152604080832086845290915290205550806125fe816136ad565b915050612508565b6000826126138584612887565b14949350505050565b6001600160a01b03908116600081815260056020908152604080832054835260049091529020549091161490565b6001600160a01b03811661267057604051622e076360e81b815260040160405180910390fd5b6126798161261c565b1561269757604051630101657360e41b815260040160405180910390fd5b60018054600090815260046020908152604080832080546001600160a01b0319166001600160a01b0387169081179091559354848452600590925280832082905551909291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a460018054906000612712836136ad565b919050555050565b8160085481111561275d5760405162461bcd60e51b815260206004820152600d60248201526c1d5b9adb9bdddb88189bd85c99609a1b6044820152606401610a37565b6127668261261c565b6127a25760405162461bcd60e51b815260206004820152600d60248201526c1b5a5b9d081c995c5d5a5c9959609a1b6044820152606401610a37565b6001600160a01b0382166000908152600f6020908152604080832086845290915290205460ff16156128085760405162461bcd60e51b815260206004820152600f60248201526e185b1c9958591e4818db185a5b5959608a1b6044820152606401610a37565b506001600160a01b03166000908152600f6020908152604080832093835292905220805460ff19166001179055565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600081815b8451811015610d3d5760008582815181106128a9576128a96136d6565b602002602001015190508083116128eb576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612918565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612923816136ad565b91505061288c565b82805461293790613672565b90600052602060002090601f016020900481019282612959576000855561299f565b82601f1061297257805160ff191683800117855561299f565b8280016001018555821561299f579182015b8281111561299f578251825591602001919060010190612984565b506129ab9291506129af565b5090565b5b808211156129ab57600081556001016129b0565b80356001600160a01b03811681146129db57600080fd5b919050565b60008083601f8401126129f257600080fd5b5081356001600160401b03811115612a0957600080fd5b6020830191508360208260051b8501011115612a2457600080fd5b9250929050565b600082601f830112612a3c57600080fd5b81356020612a51612a4c836135fc565b6135cc565b82815281810190858301606080860288018501891015612a7057600080fd5b6000805b87811015612acf5782848c031215612a8a578182fd5b612a926135a4565b612a9b85612bac565b8152612aa8888601612bac565b888201526040612ab9818701612bac565b9082015286529486019492820192600101612a74565b50929998505050505050505050565b600082601f830112612aef57600080fd5b81356020612aff612a4c836135fc565b80838252828201915082860187848660051b8901011115612b1f57600080fd5b60005b85811015612b3e57813584529284019290840190600101612b22565b5090979650505050505050565b803580151581146129db57600080fd5b600082601f830112612b6c57600080fd5b8135612b7a612a4c8261361f565b818152846020838601011115612b8f57600080fd5b816020850160208301376000918101602001919091529392505050565b803563ffffffff811681146129db57600080fd5b80356001600160401b03811681146129db57600080fd5b600060208284031215612be957600080fd5b610af4826129c4565b60008060408385031215612c0557600080fd5b612c0e836129c4565b9150612c1c60208401612b4b565b90509250929050565b60008060408385031215612c3857600080fd5b612c41836129c4565b946020939093013593505050565b6000806000806000806000806080898b031215612c6b57600080fd5b88356001600160401b0380821115612c8257600080fd5b612c8e8c838d016129e0565b909a50985060208b0135915080821115612ca757600080fd5b612cb38c838d016129e0565b909850965060408b0135915080821115612ccc57600080fd5b612cd88c838d016129e0565b909650945060608b0135915080821115612cf157600080fd5b50612cfe8b828c016129e0565b999c989b5096995094979396929594505050565b600080600080600060608688031215612d2a57600080fd5b85356001600160401b0380821115612d4157600080fd5b612d4d89838a016129e0565b90975095506020880135915080821115612d6657600080fd5b50612d73888289016129e0565b96999598509660400135949350505050565b600060208284031215612d9757600080fd5b81356001600160401b03811115612dad57600080fd5b612db984828501612ade565b949350505050565b60006020808385031215612dd457600080fd5b82516001600160401b03811115612dea57600080fd5b8301601f81018513612dfb57600080fd5b8051612e09612a4c826135fc565b80828252848201915084840188868560051b8701011115612e2957600080fd5b600094505b83851015612e4c578051835260019490940193918501918501612e2e565b50979650505050505050565b60008060408385031215612e6b57600080fd5b82356001600160401b0380821115612e8257600080fd5b612e8e86838701612ade565b93506020850135915080821115612ea457600080fd5b50612eb185828601612ade565b9150509250929050565b600060208284031215612ecd57600080fd5b610af482612b4b565b600060208284031215612ee857600080fd5b81356001600160e01b031981168114610af457600080fd5b600060208284031215612f1257600080fd5b81356001600160401b03811115612f2857600080fd5b612db984828501612b5b565b600060208284031215612f4657600080fd5b81516001600160401b03811115612f5c57600080fd5b8201601f81018413612f6d57600080fd5b8051612f7b612a4c8261361f565b818152856020838501011115612f9057600080fd5b610dd3826020830160208601613646565b60008060008060808587031215612fb757600080fd5b84356001600160801b0381168114612fce57600080fd5b9350612fdc60208601612bc0565b9250612fea60408601612bc0565b915060608501356001600160401b0381111561300557600080fd5b61301187828801612a2b565b91505092959194509250565b60006020828403121561302f57600080fd5b5035919050565b6000806040838503121561304957600080fd5b82359150612c1c602084016129c4565b60008060006040848603121561306e57600080fd5b8335925060208401356001600160401b0381111561308b57600080fd5b613097868287016129e0565b9497909650939450505050565b600080600080606085870312156130ba57600080fd5b8435935060208501356001600160401b03808211156130d857600080fd5b6130e4888389016129e0565b909550935060408701359150808211156130fd57600080fd5b5061301187828801612b5b565b6000806040838503121561311d57600080fd5b8235915060208301356001600160401b0381111561313a57600080fd5b612eb185828601612ade565b60008060006060848603121561315b57600080fd5b8335925060208401356001600160401b038082111561317957600080fd5b61318587838801612ade565b9350604086013591508082111561319b57600080fd5b506131a886828701612b5b565b9150509250925092565b600080604083850312156131c557600080fd5b50508035926020909101359150565b6000806000606084860312156131e957600080fd5b6131f284612bc0565b925061320060208501612bc0565b915060408401356001600160401b0381111561321b57600080fd5b6131a886828701612a2b565b6000815180845260208085019450848260051b860182860160005b85811015612b3e57838303895261325a838351613309565b98850198925090840190600101613242565b81835260006001600160fb1b0383111561328557600080fd5b8260051b8083602087013760009401602001938452509192915050565b600081518084526020808501945080840160005b838110156132d2578151875295820195908201906001016132b6565b509495945050505050565b600081518084526132f5816020860160208601613646565b601f01601f19169290920160200192915050565b6000608083016001600160801b0383511684526020808401516001600160401b038082168388015260409150808287015116828801525060608086015160808289015284815180875260a08a0191508583019650600092505b8083101561339f578651805163ffffffff908116845287820151811688850152908601511685830152958501956001929092019190830190613362565b5098975050505050505050565b602081526000610af46020830184613227565b6060815260006133d360608301878961326c565b82810360208401526133e681868861326c565b91505060018060a01b03831660408301529695505050505050565b602081526000610af460208301846132a2565b60608152600061342760608301866132a2565b82810360208401526134398186613227565b9050828103604084015261344d8185613309565b9695505050505050565b60608152600061346a60608301866132a2565b828103602084015261347c81866132a2565b91505060018060a01b0383166040830152949350505050565b602081526000610af460208301846132dd565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201526f1b9bdd081a5b881dda1a5d195b1a5cdd60821b604082015260600190565b602081526000610af46020830184613309565b85815260806020820152600061353460808301868861326c565b828103604084015261354681866132dd565b91505082151560608301529695505050505050565b6000808335601e1984360301811261357257600080fd5b8301803591506001600160401b0382111561358c57600080fd5b6020019150600581901b3603821315612a2457600080fd5b604051606081016001600160401b03811182821017156135c6576135c66136ec565b60405290565b604051601f8201601f191681016001600160401b03811182821017156135f4576135f46136ec565b604052919050565b60006001600160401b03821115613615576136156136ec565b5060051b60200190565b60006001600160401b03821115613638576136386136ec565b50601f01601f191660200190565b60005b83811015613661578181015183820152602001613649565b83811115610b9c5750506000910152565b600181811c9082168061368657607f821691505b602082108114156136a757634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156136cf57634e487b7160e01b600052601160045260246000fd5b5060010190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fdfea2646970667358221220dd00670a3046a5a8fe7b418594206076f714ac2e6a32bbc4f214067f5f83313864736f6c63430008070033

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.