ETH Price: $3,434.28 (+4.05%)

Token

Ape Runners (AR)
 

Overview

Max Total Supply

5,000 AR

Holders

1,291

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
posers customised: Deployer
Balance
3 AR
0xa12eeeaad1d13f0938febd6a1b0e8b10ab31dbd6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

5,000 Cybernetic Apes living in a dystopian future. A derivative project inspired by Chain Runners and BAYC. Not affiliated with Yuga Labs. Discord: https://discord.gg/F6yhP3wc Website: https://aperunners.com

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
ApeRunners

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 1024 runs

Other Settings:
default evmVersion
File 1 of 6 : ApeRunners.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;

import "sol-temple/src/tokens/ERC721.sol";
import "sol-temple/src/utils/Auth.sol";
import "sol-temple/src/utils/Pausable.sol";

import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";

/**
 * @title Ape Runners
 * @author naomsa <https://twitter.com/naomsa666>
 */
contract ApeRunners is Auth, Pausable, ERC721("Ape Runners", "AR") {
  using Strings for uint256;
  using MerkleProof for bytes32[];

  /// @notice Max supply.
  uint256 public constant MAX_SUPPLY = 5000;
  /// @notice Max amount per claim (public sale).
  uint256 public constant MAX_PER_TX = 10;
  /// @notice Claim price.
  uint256 public constant PRICE = 0.04 ether;

  /// @notice 0 = CLOSED, 1 = WHITELIST, 2 = PUBLIC.
  uint256 public saleState;

  /// @notice Metadata base URI.
  string public baseURI;
  /// @notice Metadata URI extension.
  string public baseExtension;
  /// @notice Unrevealed metadata URI.
  string public unrevealedURI;

  /// @notice Whitelist merkle root.
  bytes32 public merkleRoot;
  /// @notice Whitelist mints per address.
  mapping(address => uint256) public whitelistMinted;

  /// @notice OpenSea proxy registry.
  address public opensea;
  /// @notice LooksRare marketplace transfer manager.
  address public looksrare;
  /// @notice Check if marketplaces pre-approve is enabled.
  bool public marketplacesApproved = true;

  constructor(
    string memory unrevealedURI_,
    bytes32 merkleRoot_,
    address opensea_,
    address looksrare_
  ) {
    unrevealedURI = unrevealedURI_;
    merkleRoot = merkleRoot_;
    opensea = opensea_;
    looksrare = looksrare_;

    for (uint256 i = 0; i < 50; i++) _safeMint(msg.sender, i);
  }

  /// @notice Claim one or more tokens.
  function claim(uint256 amount_) external payable {
    uint256 supply = totalSupply();
    require(supply + amount_ <= MAX_SUPPLY, "Max supply exceeded");
    if (msg.sender != owner()) {
      require(saleState == 2, "Public sale is not open");
      require(amount_ > 0 && amount_ <= MAX_PER_TX, "Invalid claim amount");
      require(msg.value == PRICE * amount_, "Invalid ether amount");
    }

    for (uint256 i = 0; i < amount_; i++) _safeMint(msg.sender, supply++);
  }

  /// @notice Claim one or more tokens for whitelisted user.
  function claimWhitelist(uint256 amount_, bytes32[] memory proof_)
    external
    payable
  {
    uint256 supply = totalSupply();
    require(supply + amount_ <= MAX_SUPPLY, "Max supply exceeded");
    if (msg.sender != owner()) {
      require(saleState == 1, "Whitelist sale is not open");
      require(
        amount_ > 0 && amount_ + whitelistMinted[msg.sender] <= MAX_PER_TX,
        "Invalid claim amount"
      );
      require(msg.value == PRICE * amount_, "Invalid ether amount");
      require(isWhitelisted(msg.sender, proof_), "Invalid proof");
    }

    whitelistMinted[msg.sender] += amount_;
    for (uint256 i = 0; i < amount_; i++) _safeMint(msg.sender, supply++);
  }

  /// @notice Retrieve if `user_` is whitelisted based on his `proof_`.
  function isWhitelisted(address user_, bytes32[] memory proof_)
    public
    view
    returns (bool)
  {
    bytes32 leaf = keccak256(abi.encodePacked(user_));
    return proof_.verify(merkleRoot, leaf);
  }

  /**
   * @notice See {IERC721-tokenURI}.
   * @dev In order to make a metadata reveal, there must be an unrevealedURI string, which
   * gets set on the constructor and, for optimization purposes, when the owner() sets a new
   * baseURI, the unrevealedURI gets deleted, saving gas and triggering a reveal.
   */
  function tokenURI(uint256 tokenId_)
    public
    view
    override
    returns (string memory)
  {
    if (bytes(unrevealedURI).length > 0) return unrevealedURI;
    return
      string(abi.encodePacked(baseURI, tokenId_.toString(), baseExtension));
  }

  /// @notice Set baseURI to `baseURI_`, baseExtension to `baseExtension_` and deletes unrevealedURI, triggering a reveal.
  function setBaseURI(string memory baseURI_, string memory baseExtension_)
    external
    onlyAuthorized
  {
    baseURI = baseURI_;
    baseExtension = baseExtension_;
    delete unrevealedURI;
  }

  /// @notice Set unrevealedURI to `unrevealedURI_`.
  function setUnrevealedURI(string memory unrevealedURI_)
    external
    onlyAuthorized
  {
    unrevealedURI = unrevealedURI_;
  }

  /// @notice Set unrevealedURI to `unrevealedURI_`.
  function setSaleState(uint256 saleState_) external onlyAuthorized {
    saleState = saleState_;
  }

  /// @notice Set merkleRoot to `merkleRoot_`.
  function setMerkleRoot(bytes32 merkleRoot_) external onlyAuthorized {
    merkleRoot = merkleRoot_;
  }

  /// @notice Set opensea to `opensea_`.
  function setOpensea(address opensea_) external onlyAuthorized {
    opensea = opensea_;
  }

  /// @notice Set looksrare to `looksrare_`.
  function setLooksrare(address looksrare_) external onlyAuthorized {
    looksrare = looksrare_;
  }

  /// @notice Toggle pre-approve feature state for sender.
  function toggleMarketplacesApproved() external onlyAuthorized {
    marketplacesApproved = !marketplacesApproved;
  }

  /// @notice Toggle paused state.
  function togglePaused() external onlyAuthorized {
    _togglePaused();
  }

  /**
   * @notice Withdraw `amount_` of ether to msg.sender.
   * @dev Combined with the Auth util, this function can be called by
   * anyone with the authorization from the owner, so a team member can
   * get his shares with a permissioned call and exact data.
   */
  function withdraw(uint256 amount_) external onlyAuthorized {
    payable(msg.sender).transfer(amount_);
  }

  /// @dev Modified for opensea and looksrare pre-approve so users can make truly gasless sales.
  function isApprovedForAll(address owner, address operator)
    public
    view
    override
    returns (bool)
  {
    if (!marketplacesApproved) return super.isApprovedForAll(owner, operator);

    return
      operator == OpenSeaProxyRegistry(opensea).proxies(owner) ||
      operator == looksrare ||
      super.isApprovedForAll(owner, operator);
  }

  /// @dev Edited in order to block transfers while paused unless msg.sender is the owner().
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal override {
    require(
      msg.sender == owner() || paused() == false,
      "Pausable: contract paused"
    );
    super._beforeTokenTransfer(from, to, tokenId);
  }
}

contract OpenSeaProxyRegistry {
  mapping(address => address) public proxies;
}

File 2 of 6 : ERC721.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.8.0 <0.9.0;

/**
 * @title ERC721
 * @author naomsa <https://twitter.com/naomsa666>
 * @notice A complete ERC721 implementation including metadata and enumerable
 * functions. Completely gas optimized and extensible.
 */
abstract contract ERC721 {
  /*         _           _            */
  /*        ( )_        ( )_          */
  /*    ___ | ,_)   _ _ | ,_)   __    */
  /*  /',__)| |   /'_` )| |   /'__`\  */
  /*  \__, \| |_ ( (_| || |_ (  ___/  */
  /*  (____/`\__)`\__,_)`\__)`\____)  */

  /// @dev This emits when ownership of any NFT changes by any mechanism.
  event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

  /// @dev This emits when the approved address for an NFT is changed or
  event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

  /// @dev This emits when an operator is enabled or disabled for an owner.
  event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

  /// @notice See {IERC721Metadata-name}.
  string public name;

  /// @notice See {IERC721Metadata-symbol}.
  string public symbol;

  /// @notice Array of all owners.
  address[] private _owners;

  /// @notice Mapping of all balances.
  mapping(address => uint256) private _balanceOf;

  /// @notice Mapping from token ID to approved address.
  mapping(uint256 => address) private _tokenApprovals;

  /// @notice Mapping of approvals between owner and operator.
  mapping(address => mapping(address => bool)) private _isApprovedForAll;

  /*   _                            */
  /*  (_ )                _         */
  /*   | |    _      __  (_)   ___  */
  /*   | |  /'_`\  /'_ `\| | /'___) */
  /*   | | ( (_) )( (_) || |( (___  */
  /*  (___)`\___/'`\__  |(_)`\____) */
  /*              ( )_) |           */
  /*               \___/'           */

  constructor(string memory name_, string memory symbol_) {
    name = name_;
    symbol = symbol_;
  }

  /// @notice See {IERC721-balanceOf}.
  function balanceOf(address owner) public view virtual returns (uint256) {
    require(owner != address(0), "ERC721: balance query for the zero address");
    return _balanceOf[owner];
  }

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

  /// @notice See {IERC721Metadata-tokenURI}.
  function tokenURI(uint256) public view virtual returns (string memory);

  /// @notice See {IERC721-approve}.
  function approve(address to, uint256 tokenId) public virtual {
    address owner = ownerOf(tokenId);
    require(to != owner, "ERC721: approval to current owner");

    require(
      msg.sender == owner || _isApprovedForAll[owner][msg.sender],
      "ERC721: caller is not owner nor approved for all"
    );

    _approve(to, tokenId);
  }

  /// @notice See {IERC721-getApproved}.
  function getApproved(uint256 tokenId) public view virtual returns (address) {
    require(_exists(tokenId), "ERC721: query for nonexistent token");
    return _tokenApprovals[tokenId];
  }

  /// @notice See {IERC721-setApprovalForAll}.
  function setApprovalForAll(address operator, bool approved) public virtual {
    _setApprovalForAll(msg.sender, operator, approved);
  }

  /// @notice See {IERC721-isApprovedForAll}
  function isApprovedForAll(address owner, address operator) public view virtual returns (bool) {
    return _isApprovedForAll[owner][operator];
  }

  /// @notice See {IERC721-transferFrom}.
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual {
    require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");
    _transfer(from, to, tokenId);
  }

  /// @notice See {IERC721-safeTransferFrom}.
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual {
    safeTransferFrom(from, to, tokenId, "");
  }

  /// @notice See {IERC721-safeTransferFrom}.
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory data_
  ) public virtual {
    require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved");
    _safeTransfer(from, to, tokenId, data_);
  }

  /// @notice See {IERC721Enumerable.tokenOfOwnerByIndex}.
  function tokenOfOwnerByIndex(address owner, uint256 index) public view returns (uint256 tokenId) {
    require(index < balanceOf(owner), "ERC721Enumerable: Index out of bounds");
    uint256 count;
    for (uint256 i; i < _owners.length; ++i) {
      if (owner == _owners[i]) {
        if (count == index) return i;
        else count++;
      }
    }
    revert("ERC721Enumerable: Index out of bounds");
  }

  /// @notice See {IERC721Enumerable.totalSupply}.
  function totalSupply() public view virtual returns (uint256) {
    return _owners.length;
  }

  /// @notice See {IERC721Enumerable.tokenByIndex}.
  function tokenByIndex(uint256 index) public view virtual returns (uint256) {
    require(index < _owners.length, "ERC721Enumerable: Index out of bounds");
    return index;
  }

  /// @notice Returns a list of all token Ids owned by `owner`.
  function tokensOfOwner(address owner) public view returns (uint256[] memory) {
    uint256 balance = balanceOf(owner);
    uint256[] memory ids = new uint256[](balance);
    for (uint256 i = 0; i < balance; i++) {
      ids[i] = tokenOfOwnerByIndex(owner, i);
    }
    return ids;
  }

  /*             _                               _    */
  /*   _        ( )_                            (_ )  */
  /*  (_)  ___  | ,_)   __   _ __   ___     _ _  | |  */
  /*  | |/' _ `\| |   /'__`\( '__)/' _ `\ /'_` ) | |  */
  /*  | || ( ) || |_ (  ___/| |   | ( ) |( (_| | | |  */
  /*  (_)(_) (_)`\__)`\____)(_)   (_) (_)`\__,_)(___) */

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

  /**
   * @notice Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   * and stop existing when they are burned (`_burn`).
   */
  function _exists(uint256 tokenId) internal view virtual returns (bool) {
    return tokenId < _owners.length && _owners[tokenId] != address(0);
  }

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

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

  /**
   * @notice Same as {_safeMint}, but with an additional `data` parameter which is
   * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
   */
  function _safeMint(
    address to,
    uint256 tokenId,
    bytes memory data_
  ) internal virtual {
    _mint(to, tokenId);
    _checkOnERC721Received(address(0), to, tokenId, data_);
  }

  /**
   * @notice Mints `tokenId` and transfers it to `to`.
   *
   * Requirements:
   * - `tokenId` must not exist.
   * - `to` cannot be the zero address.
   *
   * Emits a {Transfer} event.
   */
  function _mint(address to, uint256 tokenId) internal virtual {
    require(!_exists(tokenId), "ERC721: token already minted");

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

    _owners.push(to);
    unchecked {
      _balanceOf[to]++;
    }

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

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

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

    // Clear approvals
    _approve(address(0), tokenId);
    delete _owners[tokenId];
    _balanceOf[owner]--;

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

  /**
   * @notice Transfers `tokenId` from `from` to `to`.
   *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
   *
   * Requirements:
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual {
    require(_owners[tokenId] == from, "ERC721: transfer of token that is not own");

    _beforeTokenTransfer(from, to, tokenId);

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

    _owners[tokenId] = to;
    unchecked {
      _balanceOf[from]--;
      _balanceOf[to]++;
    }

    emit Transfer(from, to, tokenId);
  }

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

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

  /**
   * @notice Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param data bytes optional data to send along with the call
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory data
  ) private {
    if (to.code.length > 0) {
      try IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, data) returns (bytes4 returned) {
        require(returned == 0x150b7a02, "ERC721: safe transfer to non ERC721Receiver implementation");
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721: safe transfer to non ERC721Receiver implementation");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    }
  }

  /**
   * @notice Hook that is called before any token transfer. This includes minting
   * and burning.
   *
   * Calling conditions:
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   * - When `to` is zero, ``from``'s `tokenId` will be burned.
   * - `from` and `to` are never both zero.
   */
  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 tokenId
  ) internal virtual {}

  /*    ___  _   _  _ _      __   _ __  */
  /*  /',__)( ) ( )( '_`\  /'__`\( '__) */
  /*  \__, \| (_) || (_) )(  ___/| |    */
  /*  (____/`\___/'| ,__/'`\____)(_)    */
  /*               | |                  */
  /*               (_)                  */

  /// @notice See {IERC165-supportsInterface}.
  function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
    return
      interfaceId == 0x80ac58cd || // ERC721
      interfaceId == 0x5b5e139f || // ERC721Metadata
      interfaceId == 0x780e9d63 || // ERC721Enumerable
      interfaceId == 0x01ffc9a7; // ERC165
  }
}

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

File 3 of 6 : Auth.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.8.0 <0.9.0;

/**
 * @title Auth
 * @author naomsa <https://twitter.com/naomsa666>
 * @notice Authing system where the `owner` can authorize function calls
 * to other addresses as well as control the contract by his own.
 */
abstract contract Auth {
  /*         _           _            */
  /*        ( )_        ( )_          */
  /*    ___ | ,_)   _ _ | ,_)   __    */
  /*  /',__)| |   /'_` )| |   /'__`\  */
  /*  \__, \| |_ ( (_| || |_ (  ___/  */
  /*  (____/`\__)`\__,_)`\__)`\____)  */

  /// @notice Emited when the ownership is transfered.
  event OwnershipTransfered(address indexed from, address indexed to);

  /// @notice Emited a new call with `data` is authorized to `to`.
  event AuthorizationGranted(address indexed to, bytes data);

  /// @notice Emited a new call with `data` is forbidden to `to`.
  event AuthorizationForbidden(address indexed to, bytes data);

  /// @notice Contract's owner address.
  address private _owner;

  /// @notice A mapping to retrieve if a call data was authed and is valid for the address.
  mapping(address => mapping(bytes => bool)) private _isAuthorized;

  /**
   * @notice A modifier that requires the user to be the owner or authorization to call.
   * After the call, the user loses it's authorization if he's not the owner.
   */
  modifier onlyAuthorized() {
    require(isAuthorized(msg.sender, msg.data), "Auth: sender is not the owner or authorized to call");
    _;
    if (msg.sender != _owner) _isAuthorized[msg.sender][msg.data] = false;
  }

  /// @notice A simple modifier just to check whether the sender is the owner.
  modifier onlyOwner() {
    require(msg.sender == _owner, "Auth: sender is not the owner");
    _;
  }

  /*   _                            */
  /*  (_ )                _         */
  /*   | |    _      __  (_)   ___  */
  /*   | |  /'_`\  /'_ `\| | /'___) */
  /*   | | ( (_) )( (_) || |( (___  */
  /*  (___)`\___/'`\__  |(_)`\____) */
  /*              ( )_) |           */
  /*               \___/'           */

  constructor() {
    _transferOwnership(msg.sender);
  }

  /// @notice Returns the current contract owner.
  function owner() public view returns (address) {
    return _owner;
  }

  /// @notice Retrieves whether `user_` is authorized to call with `data_`.
  function isAuthorized(address user_, bytes memory data_) public view returns (bool) {
    return user_ == _owner || _isAuthorized[user_][data_];
  }

  /// @notice Set the owner address to `owner_`.
  function transferOwnership(address owner_) public onlyOwner {
    require(_owner != owner_, "Auth: transfering ownership to current owner");
    _transferOwnership(owner_);
  }

  /// @notice Set the owner address to `owner_`. Does not require anything
  function _transferOwnership(address owner_) internal {
    address oldOwner = _owner;
    _owner = owner_;

    emit OwnershipTransfered(oldOwner, owner_);
  }

  /// @notice Authorize a call with `data_` to the address `to_`.
  function auth(address to_, bytes memory data_) public onlyOwner {
    require(to_ != _owner, "Auth: authorizing call to the owner");
    require(!_isAuthorized[to_][data_], "Auth: authorized calls cannot be authed");
    _isAuthorized[to_][data_] = true;

    emit AuthorizationGranted(to_, data_);
  }

  /// @notice Authorize a call with `data_` to the address `to_`.
  function forbid(address to_, bytes memory data_) public onlyOwner {
    require(_isAuthorized[to_][data_], "Auth: unauthorized calls cannot be forbidden");
    delete _isAuthorized[to_][data_];

    emit AuthorizationForbidden(to_, data_);
  }
}

File 4 of 6 : Pausable.sol
// SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity >=0.8.0 <0.9.0;

/**
 * @title Pausable
 * @author naomsa <https://twitter.com/naomsa666>
 * @notice Freeze your contract with a secure paused mechanism.
 */
abstract contract Pausable {
  /*         _           _            */
  /*        ( )_        ( )_          */
  /*    ___ | ,_)   _ _ | ,_)   __    */
  /*  /',__)| |   /'_` )| |   /'__`\  */
  /*  \__, \| |_ ( (_| || |_ (  ___/  */
  /*  (____/`\__)`\__,_)`\__)`\____)  */

  /// @notice Emited when the contract is paused.
  event Paused(address indexed by);

  /// @notice Emited when the contract is unpaused.
  event Unpaused(address indexed by);

  /// @notice Read-only pause state.
  bool private _paused;

  /// @notice A modifier to be used when the contract must be paused.
  modifier onlyWhenPaused() {
    require(_paused, "Pausable: contract not paused");
    _;
  }

  /// @notice A modifier to be used when the contract must be unpaused.
  modifier onlyWhenUnpaused() {
    require(!_paused, "Pausable: contract paused");
    _;
  }

  /*   _                            */
  /*  (_ )                _         */
  /*   | |    _      __  (_)   ___  */
  /*   | |  /'_`\  /'_ `\| | /'___) */
  /*   | | ( (_) )( (_) || |( (___  */
  /*  (___)`\___/'`\__  |(_)`\____) */
  /*              ( )_) |           */
  /*               \___/'           */

  /// @notice Retrieve contracts pause state.
  function paused() public view returns (bool) {
    return _paused;
  }

  /// @notice Inverts pause state. Declared internal so it can be combined with the Auth contract.
  function _togglePaused() internal {
    _paused = !_paused;
    if (_paused) emit Unpaused(msg.sender);
    else emit Paused(msg.sender);
  }
}

File 5 of 6 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 6 of 6 : 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;
    }
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"},{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"},{"internalType":"address","name":"opensea_","type":"address"},{"internalType":"address","name":"looksrare_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"AuthorizationForbidden","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"AuthorizationGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransfered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"by","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_PER_TX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"auth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"claimWhitelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"to_","type":"address"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"forbid","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"isAuthorized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"looksrare","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketplacesApproved","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"opensea","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data_","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"baseExtension_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"looksrare_","type":"address"}],"name":"setLooksrare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"opensea_","type":"address"}],"name":"setOpensea","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"saleState_","type":"uint256"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"setUnrevealedURI","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":[],"name":"toggleMarketplacesApproved","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"togglePaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526010805460ff60a01b1916600160a01b1790553480156200002457600080fd5b5060405162003f9738038062003f9783398101604081905262000047916200065a565b6040518060400160405280600b81526020016a4170652052756e6e65727360a81b8152506040518060400160405280600281526020016120a960f11b81525062000097336200014960201b60201c565b8151620000ac90600390602085019062000552565b508051620000c290600490602084019062000552565b50508451620000da9150600c90602087019062000552565b50600d839055600f80546001600160a01b038085166001600160a01b031992831617909255601080549284169290911691909117905560005b60328110156200013e5762000129338262000199565b80620001358162000743565b91505062000113565b505050505062000849565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f0d18b5fd22306e373229b9439188228edca81207d1667f604daf6cef8aa3ee679190a35050565b620001bb828260405180602001604052806000815250620001bf60201b60201c565b5050565b620001cb8383620001df565b620001da6000848484620002da565b505050565b620001ea8162000480565b156200023d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064015b60405180910390fd5b6200024b60008383620004cf565b6005805460018082019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b038516908117909155600081815260066020526040808220805490940190935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6001600160a01b0383163b156200047a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a02906200031f9033908890879087906004016200076d565b6020604051808303816000875af19250505080156200035d575060408051601f3d908101601f191682019092526200035a91810190620007c3565b60015b62000401573d8080156200038e576040519150601f19603f3d011682016040523d82523d6000602084013e62000393565b606091505b508051620003f95760405162461bcd60e51b815260206004820152603a602482015260008051602062003f7783398151915260448201527f373231526563656976657220696d706c656d656e746174696f6e000000000000606482015260840162000234565b805181602001fd5b630a85bd0160e11b6001600160e01b0319821614620004785760405162461bcd60e51b815260206004820152603a602482015260008051602062003f7783398151915260448201527f373231526563656976657220696d706c656d656e746174696f6e000000000000606482015260840162000234565b505b50505050565b60055460009082108015620004c9575060006001600160a01b031660058381548110620004b157620004b1620007f6565b6000918252602090912001546001600160a01b031614155b92915050565b6000546001600160a01b0316331480620004ec575060025460ff16155b6200053a5760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20636f6e74726163742070617573656400000000000000604482015260640162000234565b620001da838383620001da60201b62000cd51760201c565b82805462000560906200080c565b90600052602060002090601f016020900481019282620005845760008555620005cf565b82601f106200059f57805160ff1916838001178555620005cf565b82800160010185558215620005cf579182015b82811115620005cf578251825591602001919060010190620005b2565b50620005dd929150620005e1565b5090565b5b80821115620005dd5760008155600101620005e2565b634e487b7160e01b600052604160045260246000fd5b60005b838110156200062b57818101518382015260200162000611565b838111156200047a5750506000910152565b80516001600160a01b03811681146200065557600080fd5b919050565b600080600080608085870312156200067157600080fd5b84516001600160401b03808211156200068957600080fd5b818701915087601f8301126200069e57600080fd5b815181811115620006b357620006b3620005f8565b604051601f8201601f19908116603f01168101908382118183101715620006de57620006de620005f8565b816040528281528a6020848701011115620006f857600080fd5b6200070b8360208301602088016200060e565b80985050505050506020850151925062000728604086016200063d565b915062000738606086016200063d565b905092959194509250565b60006000198214156200076657634e487b7160e01b600052601160045260246000fd5b5060010190565b600060018060a01b038087168352808616602084015250836040830152608060608301528251806080840152620007ac8160a08501602087016200060e565b601f01601f19169190910160a00195945050505050565b600060208284031215620007d657600080fd5b81516001600160e01b031981168114620007ef57600080fd5b9392505050565b634e487b7160e01b600052603260045260246000fd5b600181811c908216806200082157607f821691505b602082108114156200084357634e487b7160e01b600052602260045260246000fd5b50919050565b61371e80620008596000396000f3fe6080604052600436106103085760003560e01c8063603f4d521161019a57806398a8cffe116100e1578063c66828621161008a578063f2fde38b11610064578063f2fde38b1461084f578063f43a22dc1461086f578063fe2c7fee1461088457600080fd5b8063c6682862146107fa578063c87b56dd1461080f578063e985e9c51461082f57600080fd5b8063b776c8a6116100bb578063b776c8a61461079a578063b88d4fde146107ba578063bee184f1146107da57600080fd5b806398a8cffe1461072d578063a22cb4651461075a578063a8e90b571461077a57600080fd5b80637cb64759116101435780638da5cb5b1161011d5780638da5cb5b146106da5780638ef79b3c146106f857806395d89b411461071857600080fd5b80637cb64759146106725780638462151c146106925780638d859f3e146106bf57600080fd5b80636c0360eb116101745780636c0360eb146106285780637035bf181461063d57806370a082311461065257600080fd5b8063603f4d52146105d25780636352211e146105e85780636790a9de1461060857600080fd5b80632eb4a7ab1161025e57806339b7659f11610207578063511ed382116101e1578063511ed3821461057a5780635a23dd991461059a5780635c975abb146105ba57600080fd5b806339b7659f1461051a57806342842e0e1461053a5780634f6ccce71461055a57600080fd5b806333c12e171161023857806333c12e17146104dd57806336566f06146104f2578063379607f51461050757600080fd5b80632eb4a7ab146104915780632f745c59146104a757806332cb6b0c146104c757600080fd5b8063095ea7b3116102c05780631e8858fb1161029a5780631e8858fb1461043157806323b872dd146104515780632e1a7d4d1461047157600080fd5b8063095ea7b3146103df57806315a42b1f146103ff57806318160ddd1461041257600080fd5b806306fdde03116102f157806306fdde0314610363578063081812fc14610385578063084c4088146103bd57600080fd5b806301ffc9a71461030d578063026ae10214610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612f8d565b6108a4565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5060105461032d90600160a01b900460ff1681565b34801561036f57600080fd5b50610378610975565b6040516103399190613002565b34801561039157600080fd5b506103a56103a0366004613015565b610a03565b6040516001600160a01b039091168152602001610339565b3480156103c957600080fd5b506103dd6103d8366004613015565b610a87565b005b3480156103eb57600080fd5b506103dd6103fa366004613043565b610b8a565b6103dd61040d366004613136565b610cda565b34801561041e57600080fd5b506005545b604051908152602001610339565b34801561043d57600080fd5b506103dd61044c36600461317d565b610f2f565b34801561045d57600080fd5b506103dd61046c36600461319a565b611021565b34801561047d57600080fd5b506103dd61048c366004613015565b6110a8565b34801561049d57600080fd5b50610423600d5481565b3480156104b357600080fd5b506104236104c2366004613043565b6111b0565b3480156104d357600080fd5b5061042361138881565b3480156104e957600080fd5b506103dd6112dd565b3480156104fe57600080fd5b506103dd611414565b6103dd610515366004613015565b6114f6565b34801561052657600080fd5b506103dd61053536600461324b565b6116a9565b34801561054657600080fd5b506103dd61055536600461319a565b6118cd565b34801561056657600080fd5b50610423610575366004613015565b6118e8565b34801561058657600080fd5b50600f546103a5906001600160a01b031681565b3480156105a657600080fd5b5061032d6105b5366004613291565b61194e565b3480156105c657600080fd5b5060025460ff1661032d565b3480156105de57600080fd5b5061042360095481565b3480156105f457600080fd5b506103a5610603366004613015565b6119a9565b34801561061457600080fd5b506103dd6106233660046132cb565b611a3d565b34801561063457600080fd5b50610378611b70565b34801561064957600080fd5b50610378611b7d565b34801561065e57600080fd5b5061042361066d36600461317d565b611b8a565b34801561067e57600080fd5b506103dd61068d366004613015565b611c24565b34801561069e57600080fd5b506106b26106ad36600461317d565b611d03565b6040516103399190613325565b3480156106cb57600080fd5b50610423668e1bc9bf04000081565b3480156106e657600080fd5b506000546001600160a01b03166103a5565b34801561070457600080fd5b506103dd61071336600461324b565b611da5565b34801561072457600080fd5b50610378611f21565b34801561073957600080fd5b5061042361074836600461317d565b600e6020526000908152604090205481565b34801561076657600080fd5b506103dd610775366004613369565b611f2e565b34801561078657600080fd5b506010546103a5906001600160a01b031681565b3480156107a657600080fd5b506103dd6107b536600461317d565b611f39565b3480156107c657600080fd5b506103dd6107d53660046133a7565b61202b565b3480156107e657600080fd5b5061032d6107f536600461324b565b6120b3565b34801561080657600080fd5b5061037861210d565b34801561081b57600080fd5b5061037861082a366004613015565b61211a565b34801561083b57600080fd5b5061032d61084a366004613413565b6121fa565b34801561085b57600080fd5b506103dd61086a36600461317d565b612324565b34801561087b57600080fd5b50610423600a81565b34801561089057600080fd5b506103dd61089f366004613441565b61240b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061090757507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061093b57507f780e9d63000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061096f57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6003805461098290613476565b80601f01602080910402602001604051908101604052809291908181526020018280546109ae90613476565b80156109fb5780601f106109d0576101008083540402835291602001916109fb565b820191906000526020600020905b8154815290600101906020018083116109de57829003601f168201915b505050505081565b6000610a0e826124c7565b610a6b5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b610ac8336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b610b305760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b60098190556000546001600160a01b03163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b908152604051908190036020019020805491151560ff199092169190911790555b50565b6000610b95826119a9565b9050806001600160a01b0316836001600160a01b03161415610c1f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a62565b336001600160a01b0382161480610c5957506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610ccb5760405162461bcd60e51b815260206004820152603060248201527f4552433732313a2063616c6c6572206973206e6f74206f776e6572206e6f722060448201527f617070726f76656420666f7220616c6c000000000000000000000000000000006064820152608401610a62565b610cd58383612511565b505050565b6000610ce560055490565b9050611388610cf484836134d7565b1115610d425760405162461bcd60e51b815260206004820152601360248201527f4d617820737570706c79206578636565646564000000000000000000000000006044820152606401610a62565b6000546001600160a01b03163314610ed257600954600114610da65760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206973206e6f74206f70656e0000000000006044820152606401610a62565b600083118015610dd15750336000908152600e6020526040902054600a90610dce90856134d7565b11155b610e1d5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636c61696d20616d6f756e740000000000000000000000006044820152606401610a62565b610e2e83668e1bc9bf0400006134ef565b3414610e7c5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420657468657220616d6f756e740000000000000000000000006044820152606401610a62565b610e86338361194e565b610ed25760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152606401610a62565b336000908152600e602052604081208054859290610ef19084906134d7565b90915550600090505b83811015610f2957610f173383610f108161350e565b9450612594565b80610f218161350e565b915050610efa565b50505050565b610f70336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b610fd85760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b601080546001600160a01b0319166001600160a01b0383811691909117909155600054163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b61102b33826125ae565b61109d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a62565b610cd583838361269f565b6110e9336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6111515760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b604051339082156108fc029083906000818181858888f1935050505015801561117e573d6000803e3d6000fd5b506000546001600160a01b03163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b60006111bb83611b8a565b82106112175760405162461bcd60e51b815260206004820152602560248201527f455243373231456e756d657261626c653a20496e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610a62565b6000805b600554811015611286576005818154811061123857611238613529565b6000918252602090912001546001600160a01b0386811691161415611276578382141561126857915061096f9050565b816112728161350e565b9250505b61127f8161350e565b905061121b565b5060405162461bcd60e51b815260206004820152602560248201527f455243373231456e756d657261626c653a20496e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610a62565b61131e336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6113865760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b601080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116600160a01b9182900460ff16159091021790556000546001600160a01b03163314611412573360009081526001602052604080822090516113f190839036906134b1565b908152604051908190036020019020805491151560ff199092169190911790555b565b611455336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6114bd5760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b6114c56127eb565b6000546001600160a01b03163314611412573360009081526001602052604080822090516113f190839036906134b1565b600061150160055490565b905061138861151083836134d7565b111561155e5760405162461bcd60e51b815260206004820152601360248201527f4d617820737570706c79206578636565646564000000000000000000000000006044820152606401610a62565b6000546001600160a01b0316331461167e576009546002146115c25760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006044820152606401610a62565b6000821180156115d35750600a8211155b61161f5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636c61696d20616d6f756e740000000000000000000000006044820152606401610a62565b61163082668e1bc9bf0400006134ef565b341461167e5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420657468657220616d6f756e740000000000000000000000006044820152606401610a62565b60005b82811015610cd5576116973383610f108161350e565b806116a18161350e565b915050611681565b6000546001600160a01b031633146117035760405162461bcd60e51b815260206004820152601d60248201527f417574683a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610a62565b6000546001600160a01b03838116911614156117875760405162461bcd60e51b815260206004820152602360248201527f417574683a20617574686f72697a696e672063616c6c20746f20746865206f7760448201527f6e657200000000000000000000000000000000000000000000000000000000006064820152608401610a62565b6001600160a01b0382166000908152600160205260409081902090516117ae90839061353f565b9081526040519081900360200190205460ff16156118345760405162461bcd60e51b815260206004820152602760248201527f417574683a20617574686f72697a65642063616c6c732063616e6e6f7420626560448201527f20617574686564000000000000000000000000000000000000000000000000006064820152608401610a62565b6001806000846001600160a01b03166001600160a01b0316815260200190815260200160002082604051611868919061353f565b908152604051908190036020018120805492151560ff19909316929092179091556001600160a01b038316907f93cbc542eae04a681ace3eb6a2785a14a80a0d65f061779cd14a303555836416906118c1908490613002565b60405180910390a25050565b610cd58383836040518060200160405280600081525061202b565b600554600090821061194a5760405162461bcd60e51b815260206004820152602560248201527f455243373231456e756d657261626c653a20496e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610a62565b5090565b6040516bffffffffffffffffffffffff19606084901b16602082015260009081906034016040516020818303038152906040528051906020012090506119a1600d5482856128609092919063ffffffff16565b949350505050565b60006119b4826124c7565b611a0c5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610a62565b600060058381548110611a2157611a21613529565b6000918252602090912001546001600160a01b03169392505050565b611a7e336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b611ae65760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b8151611af990600a906020850190612eac565b508051611b0d90600b906020840190612eac565b50611b1a600c6000612f2c565b6000546001600160a01b03163314611b6c57336000908152600160205260408082209051611b4b90839036906134b1565b908152604051908190036020019020805491151560ff199092169190911790555b5050565b600a805461098290613476565b600c805461098290613476565b60006001600160a01b038216611c085760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a62565b506001600160a01b031660009081526006602052604090205490565b611c65336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b611ccd5760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b600d8190556000546001600160a01b03163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b60606000611d1083611b8a565b905060008167ffffffffffffffff811115611d2d57611d2d61306f565b604051908082528060200260200182016040528015611d56578160200160208202803683370190505b50905060005b82811015611d9d57611d6e85826111b0565b828281518110611d8057611d80613529565b602090810291909101015280611d958161350e565b915050611d5c565b509392505050565b6000546001600160a01b03163314611dff5760405162461bcd60e51b815260206004820152601d60248201527f417574683a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610a62565b6001600160a01b038216600090815260016020526040908190209051611e2690839061353f565b9081526040519081900360200190205460ff16611eab5760405162461bcd60e51b815260206004820152602c60248201527f417574683a20756e617574686f72697a65642063616c6c732063616e6e6f742060448201527f626520666f7262696464656e00000000000000000000000000000000000000006064820152608401610a62565b6001600160a01b038216600090815260016020526040908190209051611ed290839061353f565b908152604051908190036020018120805460ff191690556001600160a01b038316907fee266abb756f9067a539d8b6ea87b45aaef253e283147ed0bc2ee47e64690a93906118c1908490613002565b6004805461098290613476565b611b6c338383612876565b611f7a336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b611fe25760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b600f80546001600160a01b0319166001600160a01b0383811691909117909155600054163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b61203533836125ae565b6120a75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a62565b610f2984848484612945565b600080546001600160a01b038481169116148061210657506001600160a01b0383166000908152600160205260409081902090516120f290849061353f565b9081526040519081900360200190205460ff165b9392505050565b600b805461098290613476565b60606000600c805461212b90613476565b905011156121c557600c805461214090613476565b80601f016020809104026020016040519081016040528092919081815260200182805461216c90613476565b80156121b95780601f1061218e576101008083540402835291602001916121b9565b820191906000526020600020905b81548152906001019060200180831161219c57829003601f168201915b50505050509050919050565b600a6121d08361295c565b600b6040516020016121e4939291906135f5565b6040516020818303038152906040529050919050565b601054600090600160a01b900460ff1661223d57506001600160a01b0382811660009081526008602090815260408083209385168352929052205460ff1661096f565b600f546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529091169063c455279190602401602060405180830381865afa1580156122a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c4919061361d565b6001600160a01b0316826001600160a01b031614806122f057506010546001600160a01b038381169116145b8061210657506001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff16612106565b6000546001600160a01b0316331461237e5760405162461bcd60e51b815260206004820152601d60248201527f417574683a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610a62565b6000546001600160a01b03828116911614156124025760405162461bcd60e51b815260206004820152602c60248201527f417574683a207472616e73666572696e67206f776e65727368697020746f206360448201527f757272656e74206f776e657200000000000000000000000000000000000000006064820152608401610a62565b610b8781612a8e565b61244c336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6124b45760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b805161117e90600c906020840190612eac565b6005546000908210801561096f575060006001600160a01b0316600583815481106124f4576124f4613529565b6000918252602090912001546001600160a01b0316141592915050565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915560058054839291908390811061255357612553613529565b60009182526020822001546040516001600160a01b03909116917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b611b6c828260405180602001604052806000815250612ade565b60006125b9826124c7565b6126115760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610a62565b60006005838154811061262657612626613529565b6000918252602090912001546001600160a01b03908116915084168114806126675750836001600160a01b031661265c84610a03565b6001600160a01b0316145b806119a157506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff1691505092915050565b826001600160a01b0316600582815481106126bc576126bc613529565b6000918252602090912001546001600160a01b0316146127445760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a62565b61274f838383612af5565b61275a600082612511565b816005828154811061276e5761276e613529565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790558583168083526006909152604080832080546000190190559285168083528383208054600101905592518493927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6002805460ff19811660ff9182161590811790925516156128335760405133907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a2565b60405133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a2565b60008261286d8584612b5d565b14949350505050565b816001600160a01b0316836001600160a01b031614156128d85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a62565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61295084848461269f565b610f2984848484612c01565b60608161299c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129c657806129b08161350e565b91506129bf9050600a83613650565b91506129a0565b60008167ffffffffffffffff8111156129e1576129e161306f565b6040519080825280601f01601f191660200182016040528015612a0b576020820181803683370190505b5090505b84156119a157612a20600183613664565b9150612a2d600a8661367b565b612a389060306134d7565b60f81b818381518110612a4d57612a4d613529565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a87600a86613650565b9450612a0f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f0d18b5fd22306e373229b9439188228edca81207d1667f604daf6cef8aa3ee679190a35050565b612ae88383612dbb565b610cd56000848484612c01565b6000546001600160a01b0316331480612b11575060025460ff16155b610cd55760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20636f6e747261637420706175736564000000000000006044820152606401610a62565b600081815b8451811015611d9d576000858281518110612b7f57612b7f613529565b60200260200101519050808311612bc1576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612bee565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612bf98161350e565b915050612b62565b6001600160a01b0383163b15610f2957604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290612c4390339088908790879060040161368f565b6020604051808303816000875af1925050508015612c7e575060408051601f3d908101601f19168201909252612c7b918101906136cb565b60015b612d2e573d808015612cac576040519150601f19603f3d011682016040523d82523d6000602084013e612cb1565b606091505b508051612d265760405162461bcd60e51b815260206004820152603a60248201527f4552433732313a2073616665207472616e7366657220746f206e6f6e2045524360448201527f373231526563656976657220696d706c656d656e746174696f6e0000000000006064820152608401610a62565b805181602001fd5b630a85bd0160e11b6001600160e01b0319821614612db45760405162461bcd60e51b815260206004820152603a60248201527f4552433732313a2073616665207472616e7366657220746f206e6f6e2045524360448201527f373231526563656976657220696d706c656d656e746174696f6e0000000000006064820152608401610a62565b5050505050565b612dc4816124c7565b15612e115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a62565b612e1d60008383612af5565b6005805460018082019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b038516908117909155600081815260066020526040808220805490940190935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612eb890613476565b90600052602060002090601f016020900481019282612eda5760008555612f20565b82601f10612ef357805160ff1916838001178555612f20565b82800160010185558215612f20579182015b82811115612f20578251825591602001919060010190612f05565b5061194a929150612f62565b508054612f3890613476565b6000825580601f10612f48575050565b601f016020900490600052602060002090810190610b8791905b5b8082111561194a5760008155600101612f63565b6001600160e01b031981168114610b8757600080fd5b600060208284031215612f9f57600080fd5b813561210681612f77565b60005b83811015612fc5578181015183820152602001612fad565b83811115610f295750506000910152565b60008151808452612fee816020860160208601612faa565b601f01601f19169290920160200192915050565b6020815260006121066020830184612fd6565b60006020828403121561302757600080fd5b5035919050565b6001600160a01b0381168114610b8757600080fd5b6000806040838503121561305657600080fd5b82356130618161302e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156130ae576130ae61306f565b604052919050565b600082601f8301126130c757600080fd5b8135602067ffffffffffffffff8211156130e3576130e361306f565b8160051b6130f2828201613085565b928352848101820192828101908785111561310c57600080fd5b83870192505b8483101561312b57823582529183019190830190613112565b979650505050505050565b6000806040838503121561314957600080fd5b82359150602083013567ffffffffffffffff81111561316757600080fd5b613173858286016130b6565b9150509250929050565b60006020828403121561318f57600080fd5b81356121068161302e565b6000806000606084860312156131af57600080fd5b83356131ba8161302e565b925060208401356131ca8161302e565b929592945050506040919091013590565b600082601f8301126131ec57600080fd5b813567ffffffffffffffff8111156132065761320661306f565b613219601f8201601f1916602001613085565b81815284602083860101111561322e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561325e57600080fd5b82356132698161302e565b9150602083013567ffffffffffffffff81111561328557600080fd5b613173858286016131db565b600080604083850312156132a457600080fd5b82356132af8161302e565b9150602083013567ffffffffffffffff81111561316757600080fd5b600080604083850312156132de57600080fd5b823567ffffffffffffffff808211156132f657600080fd5b613302868387016131db565b9350602085013591508082111561331857600080fd5b50613173858286016131db565b6020808252825182820181905260009190848201906040850190845b8181101561335d57835183529284019291840191600101613341565b50909695505050505050565b6000806040838503121561337c57600080fd5b82356133878161302e565b91506020830135801515811461339c57600080fd5b809150509250929050565b600080600080608085870312156133bd57600080fd5b84356133c88161302e565b935060208501356133d88161302e565b925060408501359150606085013567ffffffffffffffff8111156133fb57600080fd5b613407878288016131db565b91505092959194509250565b6000806040838503121561342657600080fd5b82356134318161302e565b9150602083013561339c8161302e565b60006020828403121561345357600080fd5b813567ffffffffffffffff81111561346a57600080fd5b6119a1848285016131db565b600181811c9082168061348a57607f821691505b602082108114156134ab57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156134ea576134ea6134c1565b500190565b6000816000190483118215151615613509576135096134c1565b500290565b6000600019821415613522576135226134c1565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008251613551818460208701612faa565b9190910192915050565b8054600090600181811c908083168061357557607f831692505b602080841082141561359757634e487b7160e01b600052602260045260246000fd5b8180156135ab57600181146135bc576135e9565b60ff198616895284890196506135e9565b60008881526020902060005b868110156135e15781548b8201529085019083016135c8565b505084890196505b50505050505092915050565b6000613601828661355b565b8451613611818360208901612faa565b61312b8183018661355b565b60006020828403121561362f57600080fd5b81516121068161302e565b634e487b7160e01b600052601260045260246000fd5b60008261365f5761365f61363a565b500490565b600082821015613676576136766134c1565b500390565b60008261368a5761368a61363a565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526136c16080830184612fd6565b9695505050505050565b6000602082840312156136dd57600080fd5b815161210681612f7756fea2646970667358221220a7ee9c44e7f64e7234f1b77dcb502e081a91d736a3ca377b213fe4408a36425b64736f6c634300080b00334552433732313a2073616665207472616e7366657220746f206e6f6e20455243000000000000000000000000000000000000000000000000000000000000008047d0337f23aa3c3c402bf19422234aa5c0304a2de6a865528e1428a4be2578f0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000f42aa99f011a1fa7cda90e5e98b277e306bca83e0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5045644a335a534a3459706d6437476531766e774c6b4e52715253387132556d4e61674d6f477235756b44432f00000000000000000000

Deployed Bytecode

0x6080604052600436106103085760003560e01c8063603f4d521161019a57806398a8cffe116100e1578063c66828621161008a578063f2fde38b11610064578063f2fde38b1461084f578063f43a22dc1461086f578063fe2c7fee1461088457600080fd5b8063c6682862146107fa578063c87b56dd1461080f578063e985e9c51461082f57600080fd5b8063b776c8a6116100bb578063b776c8a61461079a578063b88d4fde146107ba578063bee184f1146107da57600080fd5b806398a8cffe1461072d578063a22cb4651461075a578063a8e90b571461077a57600080fd5b80637cb64759116101435780638da5cb5b1161011d5780638da5cb5b146106da5780638ef79b3c146106f857806395d89b411461071857600080fd5b80637cb64759146106725780638462151c146106925780638d859f3e146106bf57600080fd5b80636c0360eb116101745780636c0360eb146106285780637035bf181461063d57806370a082311461065257600080fd5b8063603f4d52146105d25780636352211e146105e85780636790a9de1461060857600080fd5b80632eb4a7ab1161025e57806339b7659f11610207578063511ed382116101e1578063511ed3821461057a5780635a23dd991461059a5780635c975abb146105ba57600080fd5b806339b7659f1461051a57806342842e0e1461053a5780634f6ccce71461055a57600080fd5b806333c12e171161023857806333c12e17146104dd57806336566f06146104f2578063379607f51461050757600080fd5b80632eb4a7ab146104915780632f745c59146104a757806332cb6b0c146104c757600080fd5b8063095ea7b3116102c05780631e8858fb1161029a5780631e8858fb1461043157806323b872dd146104515780632e1a7d4d1461047157600080fd5b8063095ea7b3146103df57806315a42b1f146103ff57806318160ddd1461041257600080fd5b806306fdde03116102f157806306fdde0314610363578063081812fc14610385578063084c4088146103bd57600080fd5b806301ffc9a71461030d578063026ae10214610342575b600080fd5b34801561031957600080fd5b5061032d610328366004612f8d565b6108a4565b60405190151581526020015b60405180910390f35b34801561034e57600080fd5b5060105461032d90600160a01b900460ff1681565b34801561036f57600080fd5b50610378610975565b6040516103399190613002565b34801561039157600080fd5b506103a56103a0366004613015565b610a03565b6040516001600160a01b039091168152602001610339565b3480156103c957600080fd5b506103dd6103d8366004613015565b610a87565b005b3480156103eb57600080fd5b506103dd6103fa366004613043565b610b8a565b6103dd61040d366004613136565b610cda565b34801561041e57600080fd5b506005545b604051908152602001610339565b34801561043d57600080fd5b506103dd61044c36600461317d565b610f2f565b34801561045d57600080fd5b506103dd61046c36600461319a565b611021565b34801561047d57600080fd5b506103dd61048c366004613015565b6110a8565b34801561049d57600080fd5b50610423600d5481565b3480156104b357600080fd5b506104236104c2366004613043565b6111b0565b3480156104d357600080fd5b5061042361138881565b3480156104e957600080fd5b506103dd6112dd565b3480156104fe57600080fd5b506103dd611414565b6103dd610515366004613015565b6114f6565b34801561052657600080fd5b506103dd61053536600461324b565b6116a9565b34801561054657600080fd5b506103dd61055536600461319a565b6118cd565b34801561056657600080fd5b50610423610575366004613015565b6118e8565b34801561058657600080fd5b50600f546103a5906001600160a01b031681565b3480156105a657600080fd5b5061032d6105b5366004613291565b61194e565b3480156105c657600080fd5b5060025460ff1661032d565b3480156105de57600080fd5b5061042360095481565b3480156105f457600080fd5b506103a5610603366004613015565b6119a9565b34801561061457600080fd5b506103dd6106233660046132cb565b611a3d565b34801561063457600080fd5b50610378611b70565b34801561064957600080fd5b50610378611b7d565b34801561065e57600080fd5b5061042361066d36600461317d565b611b8a565b34801561067e57600080fd5b506103dd61068d366004613015565b611c24565b34801561069e57600080fd5b506106b26106ad36600461317d565b611d03565b6040516103399190613325565b3480156106cb57600080fd5b50610423668e1bc9bf04000081565b3480156106e657600080fd5b506000546001600160a01b03166103a5565b34801561070457600080fd5b506103dd61071336600461324b565b611da5565b34801561072457600080fd5b50610378611f21565b34801561073957600080fd5b5061042361074836600461317d565b600e6020526000908152604090205481565b34801561076657600080fd5b506103dd610775366004613369565b611f2e565b34801561078657600080fd5b506010546103a5906001600160a01b031681565b3480156107a657600080fd5b506103dd6107b536600461317d565b611f39565b3480156107c657600080fd5b506103dd6107d53660046133a7565b61202b565b3480156107e657600080fd5b5061032d6107f536600461324b565b6120b3565b34801561080657600080fd5b5061037861210d565b34801561081b57600080fd5b5061037861082a366004613015565b61211a565b34801561083b57600080fd5b5061032d61084a366004613413565b6121fa565b34801561085b57600080fd5b506103dd61086a36600461317d565b612324565b34801561087b57600080fd5b50610423600a81565b34801561089057600080fd5b506103dd61089f366004613441565b61240b565b60007f80ac58cd000000000000000000000000000000000000000000000000000000006001600160e01b03198316148061090757507f5b5e139f000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061093b57507f780e9d63000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b8061096f57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6003805461098290613476565b80601f01602080910402602001604051908101604052809291908181526020018280546109ae90613476565b80156109fb5780601f106109d0576101008083540402835291602001916109fb565b820191906000526020600020905b8154815290600101906020018083116109de57829003601f168201915b505050505081565b6000610a0e826124c7565b610a6b5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b60648201526084015b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b610ac8336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b610b305760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b60098190556000546001600160a01b03163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b908152604051908190036020019020805491151560ff199092169190911790555b50565b6000610b95826119a9565b9050806001600160a01b0316836001600160a01b03161415610c1f5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610a62565b336001600160a01b0382161480610c5957506001600160a01b038116600090815260086020908152604080832033845290915290205460ff165b610ccb5760405162461bcd60e51b815260206004820152603060248201527f4552433732313a2063616c6c6572206973206e6f74206f776e6572206e6f722060448201527f617070726f76656420666f7220616c6c000000000000000000000000000000006064820152608401610a62565b610cd58383612511565b505050565b6000610ce560055490565b9050611388610cf484836134d7565b1115610d425760405162461bcd60e51b815260206004820152601360248201527f4d617820737570706c79206578636565646564000000000000000000000000006044820152606401610a62565b6000546001600160a01b03163314610ed257600954600114610da65760405162461bcd60e51b815260206004820152601a60248201527f57686974656c6973742073616c65206973206e6f74206f70656e0000000000006044820152606401610a62565b600083118015610dd15750336000908152600e6020526040902054600a90610dce90856134d7565b11155b610e1d5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636c61696d20616d6f756e740000000000000000000000006044820152606401610a62565b610e2e83668e1bc9bf0400006134ef565b3414610e7c5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420657468657220616d6f756e740000000000000000000000006044820152606401610a62565b610e86338361194e565b610ed25760405162461bcd60e51b815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152606401610a62565b336000908152600e602052604081208054859290610ef19084906134d7565b90915550600090505b83811015610f2957610f173383610f108161350e565b9450612594565b80610f218161350e565b915050610efa565b50505050565b610f70336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b610fd85760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b601080546001600160a01b0319166001600160a01b0383811691909117909155600054163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b61102b33826125ae565b61109d5760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a62565b610cd583838361269f565b6110e9336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6111515760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b604051339082156108fc029083906000818181858888f1935050505015801561117e573d6000803e3d6000fd5b506000546001600160a01b03163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b60006111bb83611b8a565b82106112175760405162461bcd60e51b815260206004820152602560248201527f455243373231456e756d657261626c653a20496e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610a62565b6000805b600554811015611286576005818154811061123857611238613529565b6000918252602090912001546001600160a01b0386811691161415611276578382141561126857915061096f9050565b816112728161350e565b9250505b61127f8161350e565b905061121b565b5060405162461bcd60e51b815260206004820152602560248201527f455243373231456e756d657261626c653a20496e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610a62565b61131e336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6113865760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b601080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff8116600160a01b9182900460ff16159091021790556000546001600160a01b03163314611412573360009081526001602052604080822090516113f190839036906134b1565b908152604051908190036020019020805491151560ff199092169190911790555b565b611455336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6114bd5760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b6114c56127eb565b6000546001600160a01b03163314611412573360009081526001602052604080822090516113f190839036906134b1565b600061150160055490565b905061138861151083836134d7565b111561155e5760405162461bcd60e51b815260206004820152601360248201527f4d617820737570706c79206578636565646564000000000000000000000000006044820152606401610a62565b6000546001600160a01b0316331461167e576009546002146115c25760405162461bcd60e51b815260206004820152601760248201527f5075626c69632073616c65206973206e6f74206f70656e0000000000000000006044820152606401610a62565b6000821180156115d35750600a8211155b61161f5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420636c61696d20616d6f756e740000000000000000000000006044820152606401610a62565b61163082668e1bc9bf0400006134ef565b341461167e5760405162461bcd60e51b815260206004820152601460248201527f496e76616c696420657468657220616d6f756e740000000000000000000000006044820152606401610a62565b60005b82811015610cd5576116973383610f108161350e565b806116a18161350e565b915050611681565b6000546001600160a01b031633146117035760405162461bcd60e51b815260206004820152601d60248201527f417574683a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610a62565b6000546001600160a01b03838116911614156117875760405162461bcd60e51b815260206004820152602360248201527f417574683a20617574686f72697a696e672063616c6c20746f20746865206f7760448201527f6e657200000000000000000000000000000000000000000000000000000000006064820152608401610a62565b6001600160a01b0382166000908152600160205260409081902090516117ae90839061353f565b9081526040519081900360200190205460ff16156118345760405162461bcd60e51b815260206004820152602760248201527f417574683a20617574686f72697a65642063616c6c732063616e6e6f7420626560448201527f20617574686564000000000000000000000000000000000000000000000000006064820152608401610a62565b6001806000846001600160a01b03166001600160a01b0316815260200190815260200160002082604051611868919061353f565b908152604051908190036020018120805492151560ff19909316929092179091556001600160a01b038316907f93cbc542eae04a681ace3eb6a2785a14a80a0d65f061779cd14a303555836416906118c1908490613002565b60405180910390a25050565b610cd58383836040518060200160405280600081525061202b565b600554600090821061194a5760405162461bcd60e51b815260206004820152602560248201527f455243373231456e756d657261626c653a20496e646578206f7574206f6620626044820152646f756e647360d81b6064820152608401610a62565b5090565b6040516bffffffffffffffffffffffff19606084901b16602082015260009081906034016040516020818303038152906040528051906020012090506119a1600d5482856128609092919063ffffffff16565b949350505050565b60006119b4826124c7565b611a0c5760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610a62565b600060058381548110611a2157611a21613529565b6000918252602090912001546001600160a01b03169392505050565b611a7e336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b611ae65760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b8151611af990600a906020850190612eac565b508051611b0d90600b906020840190612eac565b50611b1a600c6000612f2c565b6000546001600160a01b03163314611b6c57336000908152600160205260408082209051611b4b90839036906134b1565b908152604051908190036020019020805491151560ff199092169190911790555b5050565b600a805461098290613476565b600c805461098290613476565b60006001600160a01b038216611c085760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610a62565b506001600160a01b031660009081526006602052604090205490565b611c65336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b611ccd5760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b600d8190556000546001600160a01b03163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b60606000611d1083611b8a565b905060008167ffffffffffffffff811115611d2d57611d2d61306f565b604051908082528060200260200182016040528015611d56578160200160208202803683370190505b50905060005b82811015611d9d57611d6e85826111b0565b828281518110611d8057611d80613529565b602090810291909101015280611d958161350e565b915050611d5c565b509392505050565b6000546001600160a01b03163314611dff5760405162461bcd60e51b815260206004820152601d60248201527f417574683a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610a62565b6001600160a01b038216600090815260016020526040908190209051611e2690839061353f565b9081526040519081900360200190205460ff16611eab5760405162461bcd60e51b815260206004820152602c60248201527f417574683a20756e617574686f72697a65642063616c6c732063616e6e6f742060448201527f626520666f7262696464656e00000000000000000000000000000000000000006064820152608401610a62565b6001600160a01b038216600090815260016020526040908190209051611ed290839061353f565b908152604051908190036020018120805460ff191690556001600160a01b038316907fee266abb756f9067a539d8b6ea87b45aaef253e283147ed0bc2ee47e64690a93906118c1908490613002565b6004805461098290613476565b611b6c338383612876565b611f7a336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b611fe25760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b600f80546001600160a01b0319166001600160a01b0383811691909117909155600054163314610b8757336000908152600160205260408082209051610b6690839036906134b1565b61203533836125ae565b6120a75760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610a62565b610f2984848484612945565b600080546001600160a01b038481169116148061210657506001600160a01b0383166000908152600160205260409081902090516120f290849061353f565b9081526040519081900360200190205460ff165b9392505050565b600b805461098290613476565b60606000600c805461212b90613476565b905011156121c557600c805461214090613476565b80601f016020809104026020016040519081016040528092919081815260200182805461216c90613476565b80156121b95780601f1061218e576101008083540402835291602001916121b9565b820191906000526020600020905b81548152906001019060200180831161219c57829003601f168201915b50505050509050919050565b600a6121d08361295c565b600b6040516020016121e4939291906135f5565b6040516020818303038152906040529050919050565b601054600090600160a01b900460ff1661223d57506001600160a01b0382811660009081526008602090815260408083209385168352929052205460ff1661096f565b600f546040517fc45527910000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529091169063c455279190602401602060405180830381865afa1580156122a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122c4919061361d565b6001600160a01b0316826001600160a01b031614806122f057506010546001600160a01b038381169116145b8061210657506001600160a01b0380841660009081526008602090815260408083209386168352929052205460ff16612106565b6000546001600160a01b0316331461237e5760405162461bcd60e51b815260206004820152601d60248201527f417574683a2073656e646572206973206e6f7420746865206f776e65720000006044820152606401610a62565b6000546001600160a01b03828116911614156124025760405162461bcd60e51b815260206004820152602c60248201527f417574683a207472616e73666572696e67206f776e65727368697020746f206360448201527f757272656e74206f776e657200000000000000000000000000000000000000006064820152608401610a62565b610b8781612a8e565b61244c336000368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506120b392505050565b6124b45760405162461bcd60e51b815260206004820152603360248201527f417574683a2073656e646572206973206e6f7420746865206f776e6572206f7260448201527208185d5d1a1bdc9a5e9959081d1bc818d85b1b606a1b6064820152608401610a62565b805161117e90600c906020840190612eac565b6005546000908210801561096f575060006001600160a01b0316600583815481106124f4576124f4613529565b6000918252602090912001546001600160a01b0316141592915050565b600081815260076020526040902080546001600160a01b0319166001600160a01b03841690811790915560058054839291908390811061255357612553613529565b60009182526020822001546040516001600160a01b03909116917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b611b6c828260405180602001604052806000815250612ade565b60006125b9826124c7565b6126115760405162461bcd60e51b815260206004820152602360248201527f4552433732313a20717565727920666f72206e6f6e6578697374656e7420746f60448201526235b2b760e91b6064820152608401610a62565b60006005838154811061262657612626613529565b6000918252602090912001546001600160a01b03908116915084168114806126675750836001600160a01b031661265c84610a03565b6001600160a01b0316145b806119a157506001600160a01b0380821660009081526008602090815260408083209388168352929052205460ff1691505092915050565b826001600160a01b0316600582815481106126bc576126bc613529565b6000918252602090912001546001600160a01b0316146127445760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610a62565b61274f838383612af5565b61275a600082612511565b816005828154811061276e5761276e613529565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790558583168083526006909152604080832080546000190190559285168083528383208054600101905592518493927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6002805460ff19811660ff9182161590811790925516156128335760405133907f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa90600090a2565b60405133907f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25890600090a2565b60008261286d8584612b5d565b14949350505050565b816001600160a01b0316836001600160a01b031614156128d85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610a62565b6001600160a01b03838116600081815260086020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61295084848461269f565b610f2984848484612c01565b60608161299c57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b81156129c657806129b08161350e565b91506129bf9050600a83613650565b91506129a0565b60008167ffffffffffffffff8111156129e1576129e161306f565b6040519080825280601f01601f191660200182016040528015612a0b576020820181803683370190505b5090505b84156119a157612a20600183613664565b9150612a2d600a8661367b565b612a389060306134d7565b60f81b818381518110612a4d57612a4d613529565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350612a87600a86613650565b9450612a0f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f0d18b5fd22306e373229b9439188228edca81207d1667f604daf6cef8aa3ee679190a35050565b612ae88383612dbb565b610cd56000848484612c01565b6000546001600160a01b0316331480612b11575060025460ff16155b610cd55760405162461bcd60e51b815260206004820152601960248201527f5061757361626c653a20636f6e747261637420706175736564000000000000006044820152606401610a62565b600081815b8451811015611d9d576000858281518110612b7f57612b7f613529565b60200260200101519050808311612bc1576040805160208101859052908101829052606001604051602081830303815290604052805190602001209250612bee565b60408051602081018390529081018490526060016040516020818303038152906040528051906020012092505b5080612bf98161350e565b915050612b62565b6001600160a01b0383163b15610f2957604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290612c4390339088908790879060040161368f565b6020604051808303816000875af1925050508015612c7e575060408051601f3d908101601f19168201909252612c7b918101906136cb565b60015b612d2e573d808015612cac576040519150601f19603f3d011682016040523d82523d6000602084013e612cb1565b606091505b508051612d265760405162461bcd60e51b815260206004820152603a60248201527f4552433732313a2073616665207472616e7366657220746f206e6f6e2045524360448201527f373231526563656976657220696d706c656d656e746174696f6e0000000000006064820152608401610a62565b805181602001fd5b630a85bd0160e11b6001600160e01b0319821614612db45760405162461bcd60e51b815260206004820152603a60248201527f4552433732313a2073616665207472616e7366657220746f206e6f6e2045524360448201527f373231526563656976657220696d706c656d656e746174696f6e0000000000006064820152608401610a62565b5050505050565b612dc4816124c7565b15612e115760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610a62565b612e1d60008383612af5565b6005805460018082019092557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b038516908117909155600081815260066020526040808220805490940190935591518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612eb890613476565b90600052602060002090601f016020900481019282612eda5760008555612f20565b82601f10612ef357805160ff1916838001178555612f20565b82800160010185558215612f20579182015b82811115612f20578251825591602001919060010190612f05565b5061194a929150612f62565b508054612f3890613476565b6000825580601f10612f48575050565b601f016020900490600052602060002090810190610b8791905b5b8082111561194a5760008155600101612f63565b6001600160e01b031981168114610b8757600080fd5b600060208284031215612f9f57600080fd5b813561210681612f77565b60005b83811015612fc5578181015183820152602001612fad565b83811115610f295750506000910152565b60008151808452612fee816020860160208601612faa565b601f01601f19169290920160200192915050565b6020815260006121066020830184612fd6565b60006020828403121561302757600080fd5b5035919050565b6001600160a01b0381168114610b8757600080fd5b6000806040838503121561305657600080fd5b82356130618161302e565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156130ae576130ae61306f565b604052919050565b600082601f8301126130c757600080fd5b8135602067ffffffffffffffff8211156130e3576130e361306f565b8160051b6130f2828201613085565b928352848101820192828101908785111561310c57600080fd5b83870192505b8483101561312b57823582529183019190830190613112565b979650505050505050565b6000806040838503121561314957600080fd5b82359150602083013567ffffffffffffffff81111561316757600080fd5b613173858286016130b6565b9150509250929050565b60006020828403121561318f57600080fd5b81356121068161302e565b6000806000606084860312156131af57600080fd5b83356131ba8161302e565b925060208401356131ca8161302e565b929592945050506040919091013590565b600082601f8301126131ec57600080fd5b813567ffffffffffffffff8111156132065761320661306f565b613219601f8201601f1916602001613085565b81815284602083860101111561322e57600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561325e57600080fd5b82356132698161302e565b9150602083013567ffffffffffffffff81111561328557600080fd5b613173858286016131db565b600080604083850312156132a457600080fd5b82356132af8161302e565b9150602083013567ffffffffffffffff81111561316757600080fd5b600080604083850312156132de57600080fd5b823567ffffffffffffffff808211156132f657600080fd5b613302868387016131db565b9350602085013591508082111561331857600080fd5b50613173858286016131db565b6020808252825182820181905260009190848201906040850190845b8181101561335d57835183529284019291840191600101613341565b50909695505050505050565b6000806040838503121561337c57600080fd5b82356133878161302e565b91506020830135801515811461339c57600080fd5b809150509250929050565b600080600080608085870312156133bd57600080fd5b84356133c88161302e565b935060208501356133d88161302e565b925060408501359150606085013567ffffffffffffffff8111156133fb57600080fd5b613407878288016131db565b91505092959194509250565b6000806040838503121561342657600080fd5b82356134318161302e565b9150602083013561339c8161302e565b60006020828403121561345357600080fd5b813567ffffffffffffffff81111561346a57600080fd5b6119a1848285016131db565b600181811c9082168061348a57607f821691505b602082108114156134ab57634e487b7160e01b600052602260045260246000fd5b50919050565b8183823760009101908152919050565b634e487b7160e01b600052601160045260246000fd5b600082198211156134ea576134ea6134c1565b500190565b6000816000190483118215151615613509576135096134c1565b500290565b6000600019821415613522576135226134c1565b5060010190565b634e487b7160e01b600052603260045260246000fd5b60008251613551818460208701612faa565b9190910192915050565b8054600090600181811c908083168061357557607f831692505b602080841082141561359757634e487b7160e01b600052602260045260246000fd5b8180156135ab57600181146135bc576135e9565b60ff198616895284890196506135e9565b60008881526020902060005b868110156135e15781548b8201529085019083016135c8565b505084890196505b50505050505092915050565b6000613601828661355b565b8451613611818360208901612faa565b61312b8183018661355b565b60006020828403121561362f57600080fd5b81516121068161302e565b634e487b7160e01b600052601260045260246000fd5b60008261365f5761365f61363a565b500490565b600082821015613676576136766134c1565b500390565b60008261368a5761368a61363a565b500690565b60006001600160a01b038087168352808616602084015250836040830152608060608301526136c16080830184612fd6565b9695505050505050565b6000602082840312156136dd57600080fd5b815161210681612f7756fea2646970667358221220a7ee9c44e7f64e7234f1b77dcb502e081a91d736a3ca377b213fe4408a36425b64736f6c634300080b0033

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

000000000000000000000000000000000000000000000000000000000000008047d0337f23aa3c3c402bf19422234aa5c0304a2de6a865528e1428a4be2578f0000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1000000000000000000000000f42aa99f011a1fa7cda90e5e98b277e306bca83e0000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d5045644a335a534a3459706d6437476531766e774c6b4e52715253387132556d4e61674d6f477235756b44432f00000000000000000000

-----Decoded View---------------
Arg [0] : unrevealedURI_ (string): ipfs://QmPEdJ3ZSJ4Ypmd7Ge1vnwLkNRqRS8q2UmNagMoGr5ukDC/
Arg [1] : merkleRoot_ (bytes32): 0x47d0337f23aa3c3c402bf19422234aa5c0304a2de6a865528e1428a4be2578f0
Arg [2] : opensea_ (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [3] : looksrare_ (address): 0xf42aa99F011A1fA7CDA90E5E98b277E306BcA83e

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 47d0337f23aa3c3c402bf19422234aa5c0304a2de6a865528e1428a4be2578f0
Arg [2] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [3] : 000000000000000000000000f42aa99f011a1fa7cda90e5e98b277e306bca83e
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [5] : 697066733a2f2f516d5045644a335a534a3459706d6437476531766e774c6b4e
Arg [6] : 52715253387132556d4e61674d6f477235756b44432f00000000000000000000


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.