ETH Price: $3,138.52 (-4.75%)
 

Overview

Max Total Supply

250 RuneApes

Holders

94

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
killionaire.eth
Balance
3 RuneApes
0x745406b0620c28026bed34356c2d928574d88f78
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RuneApes

Compiler Version
v0.8.1+commit.df193b15

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-26
*/

// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0;

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
  function onERC721Received(
    address operator,
    address from,
    uint256 id,
    bytes calldata data
  ) external returns (bytes4);
}
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

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

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)


pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev 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.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}
pragma solidity ^0.8.0;


/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

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

  // Mapping from owner to operator approvals
  mapping(address => mapping(address => bool)) private _operatorApprovals;

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

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

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

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

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

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

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

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @dev See {IERC721Metadata-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev See {IERC721Metadata-symbol}.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

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

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

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

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

  /**
   * @dev See {IERC721-isApprovedForAll}.
   */
  function isApprovedForAll(address owner, address operator)
    public
    view
    virtual
    override
    returns (bool)
  {
    return _operatorApprovals[owner][operator];
  }

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev 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`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

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

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

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

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

    uint256 updatedIndex = startTokenId;

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

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

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

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

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

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

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

  /**
   * @dev 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
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * 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`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// OpenZeppelin Contracts (last updated v4.5.0) (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 = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}
// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


contract RuneApes is ReentrancyGuard, Ownable, ERC721A{


    using Strings for uint256;
    using SafeMath for uint256;

    bytes32 public merkleRoot;

    uint256 constant public maxNFT = 1000;
    uint256 constant public maxGenesisNFT = 500;


    address payable private addr0 = payable(0x76B9105fD7996e6e3bc4fF219fbC578f81dF03de);  // 48.5%
    address payable private addr1 = payable(0x6Dc44eBE4c206c3A6E10c8205a3e260331C7299C);  // 16%
    address payable private addr2 = payable(0xE88fC340E7213A4E5B4d8d8EaFBB1A763Cef8024);  // 8.5%
    address payable private addr3 = payable(0x3cDA0a3a579C8E9894ee4B2547640A2d38B605f2);  // 7.5%
    address payable private addr4 = payable(0x385Ad17679A80Fc0FF13cC4EF506Ef9E8637c131);  // 7%
    address payable private addr5 = payable(0xC6fD0A84c32BE1C56De8e08cEd206855c608e88F);  // dev1 2%
    address payable private addr6 = payable(0xAD846dF46442e7B3BafE456b1819954898330030);  // dev2 2%
    address payable private addr7 = payable(0x31a02FbA4C2CB735e8099b616B70373970b1Ad29);  // 2%
    address payable private addr8 = payable(0x8F2A2bDF2eD27ED7904b450714C9258AdDA86AAf);  // 5%
    address payable private addr9 = payable(0xA444f77C9d23Fb014A0a024296cC74aF0f874E8F); // 1.5%

    mapping(address => uint256 ) public genesisClaim;
    mapping(address => uint256 ) public presaleClaim;

    bool public activeGenesis;
    bool public activeGenesisPublic;
    bool public activePublic;
    bool public activePresale;

    string private _prefixURI;

    struct Reward {
        address recipient;
        uint256 amount;
    }

    event Activate(bool activategenesispublic,bool activategenesis, bool activepresale,bool activepublic);
    event SetMerkleRoot(bytes32 merkleRoot);

    /* royalties */
    uint256 private _royaltyBps;
    address payable private _royaltyRecipient;

    bytes4 private constant _INTERFACE_ID_ROYALTIES = 0xbb3bafd6; //bytes4(keccak256('getRoyalties(uint256)')) == 0xbb3bafd6
    bytes4 private constant _INTERFACE_ID_ROYALTIES_EIP2981 = 0x2a55205a; //bytes4(keccak256("royaltyInfo(uint256,uint256)")) == 0x2a55205a
    bytes4 private constant _INTERFACE_ID_ROYALTIES_RARIBLE = 0xb7799584;

    constructor(bytes32 _merkleRoot) ERC721A("RuneApes", "RuneApes", 10, 1000){

        _royaltyRecipient = payable(msg.sender);
        _royaltyBps = 730;
        merkleRoot = _merkleRoot;
        _prefixURI = "https://ipfs.io/ipfs/";
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;

        emit SetMerkleRoot(merkleRoot);
    }

    /**
     * @dev Activate mint
     */
    function activate(bool _activateGenesisPublic, bool _activateGenesis, bool _activePresale, bool _activePublic) external onlyOwner{
        activeGenesis = _activateGenesis;
        activeGenesisPublic = _activateGenesisPublic;
        activePublic = _activePublic;
        activePresale = _activePresale;

        emit Activate(activeGenesisPublic,activeGenesis,activePresale,activePublic);
    }


    function setPrefixURI(string calldata uri) external onlyOwner {
        _prefixURI = uri;
    }

    function tokenURI(uint256 tokenId) public view override returns(string memory) {
        require(_exists(tokenId), "ERC721A: owner query for nonexistent token");
        return string(abi.encodePacked(_prefixURI, tokenId.toString()));
    }


    function GenesisMint(
        uint256 amount,
        bytes32[] calldata merkleProof
    ) public payable nonReentrant {

        require(msg.sender == tx.origin, "NOT EOA");

        require(activeGenesis , "InactiveGenesis");

        require(amount > 0 && amount <= 10 &&  msg.value ==  (amount * 0.07 ether), "Bad amount or invalid eth sent");
        require(totalSupply() + amount <= maxGenesisNFT, "Too many Claimed");
        require(genesisClaim[msg.sender] + amount <= 10, "Too many Genesis Claimed");

        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(merkleProof, merkleRoot, node),
            "MerkleDistributor: Invalid proof."
        );

        genesisClaim[msg.sender]  += amount;

        _safeMint(msg.sender, amount);
    }

    function publicGenesis(uint256 amount) public payable nonReentrant{

        require(msg.sender == tx.origin, "NOT EOA");

        require(activeGenesisPublic , "InactivePublicGenesis");
        require(amount > 0 && amount <= 10 && msg.value ==  (amount * 0.09 ether), "Bad amount or Invalid eth sent");

        require(totalSupply() + amount <= maxGenesisNFT, "Too many Genesis Claimed");

        _safeMint(msg.sender, amount);
    }

    function PresaleMint(
        uint256 amount,
        bytes32[] calldata merkleProof
    ) public payable nonReentrant {

        require(msg.sender == tx.origin, "NOT EOA");

        require(activePresale ,"InactivePresale");

        require(amount > 0 && amount <= 10 &&  msg.value ==  (amount * 0.06 ether), "Bad amount or invalid eth sent");
        require(totalSupply() + amount <= maxNFT, "Too many Claimed");
        require(presaleClaim[msg.sender] + amount <= 10, "Too many Presale Claimed");

        bytes32 node = keccak256(abi.encodePacked(msg.sender));
        require(
            MerkleProof.verify(merkleProof, merkleRoot, node),
            "MerkleDistributor: Invalid proof."
        );

        presaleClaim[msg.sender]  += amount;

        _safeMint(msg.sender, amount);
    }


    function publicMint(uint256 amount) public payable nonReentrant{

        require(msg.sender == tx.origin, "NOT EOA");

        require(activePublic, "InactivePublic");

        require(amount > 0 && amount <= 10 && msg.value ==  (amount * 0.08 ether), "bad amount or Invalid eth sent");
        require(totalSupply() + amount <= maxNFT, "Too many Claimed");

        _safeMint(msg.sender, amount);
    }

    /**
     * @dev Reward RuneNFTs to previous holders. Before Activation
     */
    function rewardRuneNFTS(Reward[] memory rewards) external onlyOwner {
        require(!activeGenesis && !activeGenesisPublic && !activePresale && !activePublic, "All Inactive");
        for (uint i = 0; i < rewards.length; i++) {
            require(totalSupply() + rewards[i].amount <= maxNFT, "Too many Claimed");

            //require(genesisClaim[rewards[i].recipient] + rewards[i].amount <= 3, "Too many Genesis Claimed");
            //genesisClaim[rewards[i].recipient]  += rewards[i].amount;

            _safeMint(rewards[i].recipient, rewards[i].amount);
        }
    }


    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A) returns (bool) {
        return ERC721A.supportsInterface(interfaceId) || interfaceId == _INTERFACE_ID_ROYALTIES
               || interfaceId == _INTERFACE_ID_ROYALTIES_EIP2981 || interfaceId == _INTERFACE_ID_ROYALTIES_RARIBLE;
    }

     /**
     * ROYALTIES implem: check EIP-2981 https://eips.ethereum.org/EIPS/eip-2981
     **/

    function updateRoyalties(address payable recipient, uint256 bps) external onlyOwner {
        _royaltyRecipient = recipient;
        _royaltyBps = bps;
    }

    function getRoyalties(uint256) external view returns (address payable[] memory recipients, uint256[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return (recipients, bps);
    }

    function getFeeRecipients(uint256) external view returns (address payable[] memory recipients) {
        if (_royaltyRecipient != address(0x0)) {
            recipients = new address payable[](1);
            recipients[0] = _royaltyRecipient;
        }
        return recipients;
    }

    function getFeeBps(uint256) external view returns (uint[] memory bps) {
        if (_royaltyRecipient != address(0x0)) {
            bps = new uint256[](1);
            bps[0] = _royaltyBps;
        }
        return bps;
    }

    function royaltyInfo(uint256, uint256 value) external view returns (address, uint256) {
        return (_royaltyRecipient, value*_royaltyBps/10000);
    }

    function sendFund(address Addr, uint256 Share) internal {
          (bool success, ) = Addr.call{value: Share}("");
          require(success, "Withdrawal failed"); 
    }

    function withdraw() external onlyOwner {
       require(address(this).balance > 0, "No balance to withdraw");
        
       uint addr1Share = address(this).balance.mul(16000).div(100000);
       uint addr2Share = address(this).balance.mul(8500).div(100000);
       uint addr3Share = address(this).balance.mul(7500).div(100000);
       uint addr4Share = address(this).balance.mul(7000).div(100000);
       uint addr5Share = address(this).balance.mul(2000).div(100000);
       uint addr6Share = address(this).balance.mul(2000).div(100000);
       uint addr7Share = address(this).balance.mul(2000).div(100000);
       uint addr8Share = address(this).balance.mul(5000).div(100000);
       uint addr9Share = address(this).balance.mul(1500).div(100000);

       sendFund(addr1, addr1Share);
       sendFund(addr2, addr2Share);
       sendFund(addr3, addr3Share);
       sendFund(addr4, addr4Share);
       sendFund(addr5, addr5Share);
       sendFund(addr6, addr6Share);
       sendFund(addr7, addr7Share);
       sendFund(addr8, addr8Share);
       sendFund(addr9, addr9Share);

       sendFund(addr0, address(this).balance);

    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"activategenesispublic","type":"bool"},{"indexed":false,"internalType":"bool","name":"activategenesis","type":"bool"},{"indexed":false,"internalType":"bool","name":"activepresale","type":"bool"},{"indexed":false,"internalType":"bool","name":"activepublic","type":"bool"}],"name":"Activate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"SetMerkleRoot","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"GenesisMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"PresaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"_activateGenesisPublic","type":"bool"},{"internalType":"bool","name":"_activateGenesis","type":"bool"},{"internalType":"bool","name":"_activePresale","type":"bool"},{"internalType":"bool","name":"_activePublic","type":"bool"}],"name":"activate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"activeGenesis","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activeGenesisPublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePresale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"activePublic","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"genesisClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"bps","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGenesisNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicGenesis","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct RuneApes.Reward[]","name":"rewards","type":"tuple[]"}],"name":"rewardRuneNFTS","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setPrefixURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"},{"internalType":"uint256","name":"bps","type":"uint256"}],"name":"updateRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260006002819055600955600b80546001600160a01b03199081167376b9105fd7996e6e3bc4ff219fbc578f81df03de17909155600c80548216736dc44ebe4c206c3a6e10c8205a3e260331c7299c179055600d8054821673e88fc340e7213a4e5b4d8d8eafbb1a763cef8024179055600e80548216733cda0a3a579c8e9894ee4b2547640a2d38b605f2179055600f8054821673385ad17679a80fc0ff13cc4ef506ef9e8637c13117905560108054821673c6fd0a84c32be1c56de8e08ced206855c608e88f17905560118054821673ad846df46442e7b3bafe456b18199548983300301790556012805482167331a02fba4c2cb735e8099b616b70373970b1ad29179055601380548216738f2a2bdf2ed27ed7904b450714c9258adda86aaf1790556014805490911673a444f77c9d23fb014a0a024296cc74af0f874e8f1790553480156200015357600080fd5b5060405162003d3838038062003d388339810160408190526200017691620003b4565b60408051808201825260088082526752756e654170657360c01b6020808401829052845180860190955291845290830152600160005590600a6103e8620001c6620001c0620002b8565b620002bc565b60008111620001f25760405162461bcd60e51b8152600401620001e99062000414565b60405180910390fd5b60008211620002155760405162461bcd60e51b8152600401620001e990620003cd565b83516200022a9060039060208701906200030e565b508251620002409060049060208601906200030e565b5060a0919091526080525050601a80546001600160a01b031916331790556102da601955600a8190556040805180820190915260158082527f68747470733a2f2f697066732e696f2f697066732f0000000000000000000000602092909201918252620002b0916018916200030e565b50506200049f565b3390565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200031c9062000462565b90600052602060002090601f0160209004810192826200034057600085556200038b565b82601f106200035b57805160ff19168380011785556200038b565b828001600101855582156200038b579182015b828111156200038b5782518255916020019190600101906200036e565b50620003999291506200039d565b5090565b5b808211156200039957600081556001016200039e565b600060208284031215620003c6578081fd5b5051919050565b60208082526027908201527f455243373231413a206d61782062617463682073697a65206d757374206265206040820152666e6f6e7a65726f60c81b606082015260800190565b6020808252602e908201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060408201526d6e6f6e7a65726f20737570706c7960901b606082015260800190565b6002810460018216806200047757607f821691505b602082108114156200049957634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a051613868620004d060003960008181611fdd0152818161200701526123b20152600050506138686000f3fe60806040526004361061025c5760003560e01c8063715018a611610144578063bb3bafd6116100b6578063e456b01c1161007a578063e456b01c146106be578063e985e9c5146106d3578063eb1909b5146106f3578063ec41a76214610708578063f2fde38b14610728578063fb48dd95146107485761025c565b8063bb3bafd614610631578063c87b56dd1461065f578063cc2ae0251461067f578063d21d046214610694578063d7224ba0146106a95761025c565b8063a22cb46511610108578063a22cb4651461057c578063ab124c691461059c578063b2c94ee6146105af578063b3e47ba3146105cf578063b88d4fde146105e4578063b9c4d9fb146106045761025c565b8063715018a6146104fd5780637cb64759146105125780638da5cb5b1461053257806395d89b4114610547578063a122dfc81461055c5761025c565b80632f745c59116101dd57806342842e0e116101a157806342842e0e1461044a5780634f6ccce71461046a5780636352211e1461048a57806364bfaaf7146104aa5780636c2f5acd146104bd57806370a08231146104dd5761025c565b80632f745c59146103cd57806335fac604146103ed57806338f9d571146104005780633cb3e0e7146104205780633ccfd60b146104355761025c565b806318160ddd1161022457806318160ddd1461033557806323b872dd146103575780632a55205a146103775780632db11544146103a55780632eb4a7ab146103b85761025c565b806301ffc9a71461026157806306fdde0314610297578063081812fc146102b9578063095ea7b3146102e65780630ebd4c7f14610308575b600080fd5b34801561026d57600080fd5b5061028161027c366004612a2b565b610768565b60405161028e9190612d9f565b60405180910390f35b3480156102a357600080fd5b506102ac6107cc565b60405161028e9190612dd4565b3480156102c557600080fd5b506102d96102d4366004612a13565b61085e565b60405161028e9190612cea565b3480156102f257600080fd5b506103066103013660046128d8565b6108aa565b005b34801561031457600080fd5b50610328610323366004612a13565b610943565b60405161028e9190612d8c565b34801561034157600080fd5b5061034a6109ac565b60405161028e9190612dcb565b34801561036357600080fd5b506103066103723660046127a8565b6109b2565b34801561038357600080fd5b50610397610392366004612b49565b6109bd565b60405161028e929190612d3b565b6103066103b3366004612a13565b6109f7565b3480156103c457600080fd5b5061034a610af5565b3480156103d957600080fd5b5061034a6103e83660046128d8565b610afb565b6103066103fb366004612ad0565b610bf7565b34801561040c57600080fd5b5061034a61041b366004612729565b610dda565b34801561042c57600080fd5b50610281610dec565b34801561044157600080fd5b50610306610dfa565b34801561045657600080fd5b506103066104653660046127a8565b611016565b34801561047657600080fd5b5061034a610485366004612a13565b611031565b34801561049657600080fd5b506102d96104a5366004612a13565b61105d565b6103066104b8366004612ad0565b61106f565b3480156104c957600080fd5b506103066104d8366004612745565b61123e565b3480156104e957600080fd5b5061034a6104f8366004612729565b6112a3565b34801561050957600080fd5b506103066112f0565b34801561051e57600080fd5b5061030661052d366004612a13565b61133b565b34801561053e57600080fd5b506102d96113ba565b34801561055357600080fd5b506102ac6113c9565b34801561056857600080fd5b506103066105773660046129c0565b6113d8565b34801561058857600080fd5b506103066105973660046128a4565b6114b1565b6103066105aa366004612a13565b61157f565b3480156105bb57600080fd5b506103066105ca366004612a63565b61166a565b3480156105db57600080fd5b506102816116b5565b3480156105f057600080fd5b506103066105ff3660046127e8565b6116c5565b34801561061057600080fd5b5061062461061f366004612a13565b6116fe565b60405161028e9190612d54565b34801561063d57600080fd5b5061065161064c366004612a13565b611785565b60405161028e929190612d67565b34801561066b57600080fd5b506102ac61067a366004612a13565b611855565b34801561068b57600080fd5b506102816118ae565b3480156106a057600080fd5b5061034a6118b7565b3480156106b557600080fd5b5061034a6118bd565b3480156106ca57600080fd5b5061034a6118c3565b3480156106df57600080fd5b506102816106ee366004612770565b6118c9565b3480156106ff57600080fd5b506102816118f7565b34801561071457600080fd5b5061034a610723366004612729565b611906565b34801561073457600080fd5b50610306610743366004612729565b611918565b34801561075457600080fd5b506103066107633660046128ea565b611989565b600061077382611b0b565b8061078e57506001600160e01b03198216635d9dd7eb60e11b145b806107a957506001600160e01b0319821663152a902d60e11b145b806107c457506001600160e01b03198216632dde656160e21b145b90505b919050565b6060600380546107db9061375b565b80601f01602080910402602001604051908101604052809291908181526020018280546108079061375b565b80156108545780601f1061082957610100808354040283529160200191610854565b820191906000526020600020905b81548152906001019060200180831161083757829003601f168201915b5050505050905090565b600061086982611b66565b61088e5760405162461bcd60e51b815260040161088590613597565b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006108b58261105d565b9050806001600160a01b0316836001600160a01b031614156108e95760405162461bcd60e51b8152600401610885906132b2565b806001600160a01b03166108fb611b6d565b6001600160a01b031614806109175750610917816106ee611b6d565b6109335760405162461bcd60e51b815260040161088590612fe3565b61093e838383611b71565b505050565b601a546060906001600160a01b0316156107c75760408051600180825281830190925290602080830190803683370190505090506019548160008151811061099b57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050919050565b60025490565b61093e838383611bcd565b601a5460195460009182916001600160a01b0390911690612710906109e290866136ba565b6109ec91906136a6565b915091509250929050565b60026000541415610a1a5760405162461bcd60e51b8152600401610885906134bd565b6002600055333214610a3e5760405162461bcd60e51b81526004016108859061344e565b60175462010000900460ff16610a665760405162461bcd60e51b815260040161088590613253565b600081118015610a775750600a8111155b8015610a935750610a908167011c37937e0800006136ba565b34145b610aaf5760405162461bcd60e51b81526004016108859061327b565b6103e881610abb6109ac565b610ac5919061368e565b1115610ae35760405162461bcd60e51b815260040161088590612e29565b610aed3382611ee1565b506001600055565b600a5481565b6000610b06836112a3565b8210610b245760405162461bcd60e51b815260040161088590612de7565b6000610b2e6109ac565b905060008060005b83811015610bd8576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b8957805192505b876001600160a01b0316836001600160a01b03161415610bc55786841415610bb757509350610bf192505050565b83610bc181613796565b9450505b5080610bd081613796565b915050610b36565b5060405162461bcd60e51b81526004016108859061346f565b92915050565b60026000541415610c1a5760405162461bcd60e51b8152600401610885906134bd565b6002600055333214610c3e5760405162461bcd60e51b81526004016108859061344e565b60175460ff16610c605760405162461bcd60e51b815260040161088590613323565b600083118015610c715750600a8311155b8015610c8c5750610c898366f8b0a10e4700006136ba565b34145b610ca85760405162461bcd60e51b815260040161088590612ee3565b6101f483610cb46109ac565b610cbe919061368e565b1115610cdc5760405162461bcd60e51b815260040161088590612e29565b33600090815260156020526040902054600a90610cfa90859061368e565b1115610d185760405162461bcd60e51b8152600401610885906133d6565b600033604051602001610d2b9190612c24565b604051602081830303815290604052805190602001209050610d8483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a549150849050611efb565b610da05760405162461bcd60e51b815260040161088590612fa2565b3360009081526015602052604081208054869290610dbf90849061368e565b90915550610dcf90503385611ee1565b505060016000555050565b60166020526000908152604090205481565b601754610100900460ff1681565b610e02611b6d565b6001600160a01b0316610e136113ba565b6001600160a01b031614610e395760405162461bcd60e51b815260040161088590613108565b60004711610e595760405162461bcd60e51b8152600401610885906131ec565b6000610e74620186a0610e6e47613e80611f11565b90611f24565b90506000610e8b620186a0610e6e47612134611f11565b90506000610ea2620186a0610e6e47611d4c611f11565b90506000610eb9620186a0610e6e47611b58611f11565b90506000610ed0620186a0610e6e476107d0611f11565b90506000610ee7620186a0610e6e476107d0611f11565b90506000610efe620186a0610e6e476107d0611f11565b90506000610f15620186a0610e6e47611388611f11565b90506000610f2c620186a0610e6e476105dc611f11565b600c54909150610f45906001600160a01b03168a611f30565b600d54610f5b906001600160a01b031689611f30565b600e54610f71906001600160a01b031688611f30565b600f54610f87906001600160a01b031687611f30565b601054610f9d906001600160a01b031686611f30565b601154610fb3906001600160a01b031685611f30565b601254610fc9906001600160a01b031684611f30565b601354610fdf906001600160a01b031683611f30565b601454610ff5906001600160a01b031682611f30565b600b5461100b906001600160a01b031647611f30565b505050505050505050565b61093e838383604051806020016040528060008152506116c5565b600061103b6109ac565b82106110595760405162461bcd60e51b815260040161088590612f1a565b5090565b600061106882611fac565b5192915050565b600260005414156110925760405162461bcd60e51b8152600401610885906134bd565b60026000553332146110b65760405162461bcd60e51b81526004016108859061344e565b6017546301000000900460ff166110df5760405162461bcd60e51b81526004016108859061356e565b6000831180156110f05750600a8311155b801561110b57506111088366d529ae9e8600006136ba565b34145b6111275760405162461bcd60e51b815260040161088590612ee3565b6103e8836111336109ac565b61113d919061368e565b111561115b5760405162461bcd60e51b815260040161088590612e29565b33600090815260166020526040902054600a9061117990859061368e565b11156111975760405162461bcd60e51b815260040161088590613040565b6000336040516020016111aa9190612c24565b60405160208183030381529060405280519060200120905061120383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a549150849050611efb565b61121f5760405162461bcd60e51b815260040161088590612fa2565b3360009081526016602052604081208054869290610dbf90849061368e565b611246611b6d565b6001600160a01b03166112576113ba565b6001600160a01b03161461127d5760405162461bcd60e51b815260040161088590613108565b601a80546001600160a01b0319166001600160a01b039390931692909217909155601955565b60006001600160a01b0382166112cb5760405162461bcd60e51b815260040161088590613077565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6112f8611b6d565b6001600160a01b03166113096113ba565b6001600160a01b03161461132f5760405162461bcd60e51b815260040161088590613108565b61133960006120bf565b565b611343611b6d565b6001600160a01b03166113546113ba565b6001600160a01b03161461137a5760405162461bcd60e51b815260040161088590613108565b600a8190556040517f914960aef5e033ce5cae8a7992d4b7a6f0f9741227b66acb67c605b7019f8a46906113af908390612dcb565b60405180910390a150565b6001546001600160a01b031690565b6060600480546107db9061375b565b6113e0611b6d565b6001600160a01b03166113f16113ba565b6001600160a01b0316146114175760405162461bcd60e51b815260040161088590613108565b6017805460ff19168415151761ff00191661010086151581029190911762ff000019166201000084151581029190911763ff00000019166301000000861515810291909117938490556040517f4e3ce1d36b894db5de66247d0c9230ebd0a21f499ed076cecfda6a6ea0218b9b946114a39460ff90820481169481831694830482169392041690612daa565b60405180910390a150505050565b6114b9611b6d565b6001600160a01b0316826001600160a01b031614156114ea5760405162461bcd60e51b815260040161088590613163565b80600860006114f7611b6d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561153b611b6d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115739190612d9f565b60405180910390a35050565b600260005414156115a25760405162461bcd60e51b8152600401610885906134bd565b60026000553332146115c65760405162461bcd60e51b81526004016108859061344e565b601754610100900460ff166115ed5760405162461bcd60e51b8152600401610885906132f4565b6000811180156115fe5750600a8111155b801561161a57506116178167013fbe85edc900006136ba565b34145b6116365760405162461bcd60e51b81526004016108859061321c565b6101f4816116426109ac565b61164c919061368e565b1115610ae35760405162461bcd60e51b8152600401610885906133d6565b611672611b6d565b6001600160a01b03166116836113ba565b6001600160a01b0316146116a95760405162461bcd60e51b815260040161088590613108565b61093e6018838361266d565b6017546301000000900460ff1681565b6116d0848484611bcd565b6116dc84848484612111565b6116f85760405162461bcd60e51b81526004016108859061334c565b50505050565b601a546060906001600160a01b0316156107c75760408051600180825281830190925290602080830190803683375050601a5482519293506001600160a01b03169183915060009061176057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b601a5460609081906001600160a01b0316156118505760408051600180825281830190925290602080830190803683375050601a5482519294506001600160a01b0316918491506000906117e957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506019548160008151811061184357634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b915091565b606061186082611b66565b61187c5760405162461bcd60e51b815260040161088590612e99565b60186118878361222d565b604051602001611898929190612c41565b6040516020818303038152906040529050919050565b60175460ff1681565b6101f481565b60095481565b6103e881565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b60175462010000900460ff1681565b60156020526000908152604090205481565b611920611b6d565b6001600160a01b03166119316113ba565b6001600160a01b0316146119575760405162461bcd60e51b815260040161088590613108565b6001600160a01b03811661197d5760405162461bcd60e51b815260040161088590612e53565b611986816120bf565b50565b611991611b6d565b6001600160a01b03166119a26113ba565b6001600160a01b0316146119c85760405162461bcd60e51b815260040161088590613108565b60175460ff161580156119e35750601754610100900460ff16155b80156119f957506017546301000000900460ff16155b8015611a0e575060175462010000900460ff16155b611a2a5760405162461bcd60e51b81526004016108859061313d565b60005b8151811015611b07576103e8828281518110611a5957634e487b7160e01b600052603260045260246000fd5b602002602001015160200151611a6d6109ac565b611a77919061368e565b1115611a955760405162461bcd60e51b815260040161088590612e29565b611af5828281518110611ab857634e487b7160e01b600052603260045260246000fd5b602002602001015160000151838381518110611ae457634e487b7160e01b600052603260045260246000fd5b602002602001015160200151611ee1565b80611aff81613796565b915050611a2d565b5050565b60006001600160e01b031982166380ac58cd60e01b1480611b3c57506001600160e01b03198216635b5e139f60e01b145b80611b5757506001600160e01b0319821663780e9d6360e01b145b806107c457506107c482612348565b6002541190565b3390565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611bd882611fac565b9050600081600001516001600160a01b0316611bf2611b6d565b6001600160a01b03161480611c275750611c0a611b6d565b6001600160a01b0316611c1c8461085e565b6001600160a01b0316145b80611c3b57508151611c3b906106ee611b6d565b905080611c5a5760405162461bcd60e51b81526004016108859061319a565b846001600160a01b031682600001516001600160a01b031614611c8f5760405162461bcd60e51b8152600401610885906130c2565b6001600160a01b038416611cb55760405162461bcd60e51b815260040161088590612f5d565b611cc285858560016116f8565b611cd26000848460000151611b71565b6001600160a01b0385166000908152600660205260408120805460019290611d049084906001600160801b03166136d9565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d5091859116613663565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b0267ffffffffffffffff60a01b19929093166001600160a01b03199091161716179055611de684600161368e565b6000818152600560205260409020549091506001600160a01b0316611e8b57611e0e81611b66565b15611e8b5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526005909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ed986868660016116f8565b505050505050565b611b07828260405180602001604052806000815250612361565b600082611f0885846125d5565b14949350505050565b6000611f1d82846136ba565b9392505050565b6000611f1d82846136a6565b6000826001600160a01b031682604051611f4990612ce7565b60006040518083038185875af1925050503d8060008114611f86576040519150601f19603f3d011682016040523d82523d6000602084013e611f8b565b606091505b505090508061093e5760405162461bcd60e51b8152600401610885906134f4565b611fb46126ed565b611fbd82611b66565b611fd95760405162461bcd60e51b815260040161088590612e99565b60007f0000000000000000000000000000000000000000000000000000000000000000831061203a5761202c7f000000000000000000000000000000000000000000000000000000000000000084613701565b61203790600161368e565b90505b825b8181106120a6576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156120935792506107c7915050565b508061209e81613744565b91505061203c565b5060405162461bcd60e51b81526004016108859061351f565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612125846001600160a01b031661264f565b1561222157836001600160a01b031663150b7a02612141611b6d565b8786866040518563ffffffff1660e01b81526004016121639493929190612cfe565b602060405180830381600087803b15801561217d57600080fd5b505af19250505080156121ad575060408051601f3d908101601f191682019092526121aa91810190612a47565b60015b612207573d8080156121db576040519150601f19603f3d011682016040523d82523d6000602084013e6121e0565b606091505b5080516121ff5760405162461bcd60e51b81526004016108859061334c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612225565b5060015b949350505050565b60608161225257506040805180820190915260018152600360fc1b60208201526107c7565b8160005b811561227c578061226681613796565b91506122759050600a836136a6565b9150612256565b60008167ffffffffffffffff8111156122a557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122cf576020820181803683370190505b5090505b8415612225576122e4600183613701565b91506122f1600a866137b1565b6122fc90603061368e565b60f81b81838151811061231f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612341600a866136a6565b94506122d3565b6001600160e01b031981166301ffc9a760e01b14919050565b6002546001600160a01b03841661238a5760405162461bcd60e51b81526004016108859061340d565b61239381611b66565b156123b05760405162461bcd60e51b81526004016108859061339f565b7f00000000000000000000000000000000000000000000000000000000000000008311156123f05760405162461bcd60e51b8152600401610885906135e4565b6123fd60008583866116f8565b6001600160a01b0384166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612459908790613663565b6001600160801b031681526020018583602001516124779190613663565b6001600160801b039081169091526001600160a01b03808816600081815260066020908152604080832087518154988401518816600160801b029088166fffffffffffffffffffffffffffffffff1990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156125c25760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125866000888488612111565b6125a25760405162461bcd60e51b81526004016108859061334c565b816125ac81613796565b92505080806125ba90613796565b915050612539565b506002819055611ed960008785886116f8565b600081815b845181101561264757600085828151811061260557634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161262757612620838261265e565b9250612634565b612631818461265e565b92505b508061263f81613796565b9150506125da565b509392505050565b6001600160a01b03163b151590565b60009182526020526040902090565b8280546126799061375b565b90600052602060002090601f01602090048101928261269b57600085556126e1565b82601f106126b45782800160ff198235161785556126e1565b828001600101855582156126e1579182015b828111156126e15782358255916020019190600101906126c6565b50611059929150612704565b604080518082019091526000808252602082015290565b5b808211156110595760008155600101612705565b803580151581146107c757600080fd5b60006020828403121561273a578081fd5b8135611f1d81613807565b60008060408385031215612757578081fd5b823561276281613807565b946020939093013593505050565b60008060408385031215612782578182fd5b823561278d81613807565b9150602083013561279d81613807565b809150509250929050565b6000806000606084860312156127bc578081fd5b83356127c781613807565b925060208401356127d781613807565b929592945050506040919091013590565b600080600080608085870312156127fd578081fd5b843561280881613807565b935060208581013561281981613807565b935060408601359250606086013567ffffffffffffffff8082111561283c578384fd5b818801915088601f83011261284f578384fd5b813581811115612861576128616137f1565b612873601f8201601f19168501613626565b91508082528984828501011115612888578485fd5b8084840185840137810190920192909252939692955090935050565b600080604083850312156128b6578182fd5b82356128c181613807565b91506128cf60208401612719565b90509250929050565b60008060408385031215612757578182fd5b600060208083850312156128fc578182fd5b823567ffffffffffffffff80821115612913578384fd5b818501915085601f830112612926578384fd5b813581811115612938576129386137f1565b6129458485830201613626565b81815284810192508385016040808402860187018a1015612964578788fd5b8795505b838610156129b25780828b03121561297e578788fd5b61298781613626565b823561299281613807565b815282880135888201528552600195909501949386019390810190612968565b509098975050505050505050565b600080600080608085870312156129d5578384fd5b6129de85612719565b93506129ec60208601612719565b92506129fa60408601612719565b9150612a0860608601612719565b905092959194509250565b600060208284031215612a24578081fd5b5035919050565b600060208284031215612a3c578081fd5b8135611f1d8161381c565b600060208284031215612a58578081fd5b8151611f1d8161381c565b60008060208385031215612a75578182fd5b823567ffffffffffffffff80821115612a8c578384fd5b818501915085601f830112612a9f578384fd5b813581811115612aad578485fd5b866020828501011115612abe578485fd5b60209290920196919550909350505050565b600080600060408486031215612ae4578081fd5b83359250602084013567ffffffffffffffff80821115612b02578283fd5b818601915086601f830112612b15578283fd5b813581811115612b23578384fd5b8760208083028501011115612b36578384fd5b6020830194508093505050509250925092565b60008060408385031215612b5b578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015612ba25781516001600160a01b031687529582019590820190600101612b7d565b509495945050505050565b6000815180845260208085019450808401835b83811015612ba257815187529582019590820190600101612bc0565b60008151808452612bf4816020860160208601613718565b601f01601f19169290920160200192915050565b60008151612c1a818560208601613718565b9290920192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b8254600090819060028104600180831680612c5d57607f831692505b6020808410821415612c7d57634e487b7160e01b87526022600452602487fd5b818015612c915760018114612ca257612cce565b60ff19861689528489019650612cce565b612cab8b613657565b885b86811015612cc65781548b820152908501908301612cad565b505084890196505b505050505050612cde8185612c08565b95945050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3190830184612bdc565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060208252611f1d6020830184612b6a565b600060408252612d7a6040830185612b6a565b8281036020840152612cde8185612bad565b600060208252611f1d6020830184612bad565b901515815260200190565b93151584529115156020840152151560408301521515606082015260800190565b90815260200190565b600060208252611f1d6020830184612bdc565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526010908201526f151bdbc81b585b9e4810db185a5b595960821b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252601e908201527f42616420616d6f756e74206f7220696e76616c6964206574682073656e740000604082015260600190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526021908201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666040820152601760f91b606082015260800190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526018908201527f546f6f206d616e792050726573616c6520436c61696d65640000000000000000604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b416c6c20496e61637469766560a01b604082015260600190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252601690820152754e6f2062616c616e636520746f20776974686472617760501b604082015260600190565b6020808252601e908201527f42616420616d6f756e74206f7220496e76616c6964206574682073656e740000604082015260600190565b6020808252600e908201526d496e6163746976655075626c696360901b604082015260600190565b6020808252601e908201527f62616420616d6f756e74206f7220496e76616c6964206574682073656e740000604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b602080825260159082015274496e6163746976655075626c696347656e6573697360581b604082015260600190565b6020808252600f908201526e496e61637469766547656e6573697360881b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526018908201527f546f6f206d616e792047656e6573697320436c61696d65640000000000000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600790820152664e4f5420454f4160c81b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526011908201527015da5d1a191c985dd85b0819985a5b1959607a1b604082015260600190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b6020808252600f908201526e496e61637469766550726573616c6560881b604082015260600190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b60208082526022908201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696040820152610ced60f31b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561364f5761364f6137f1565b604052919050565b60009081526020902090565b60006001600160801b03808316818516808303821115613685576136856137c5565b01949350505050565b600082198211156136a1576136a16137c5565b500190565b6000826136b5576136b56137db565b500490565b60008160001904831182151516156136d4576136d46137c5565b500290565b60006001600160801b03838116908316818110156136f9576136f96137c5565b039392505050565b600082821015613713576137136137c5565b500390565b60005b8381101561373357818101518382015260200161371b565b838111156116f85750506000910152565b600081613753576137536137c5565b506000190190565b60028104600182168061376f57607f821691505b6020821081141561379057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137aa576137aa6137c5565b5060010190565b6000826137c0576137c06137db565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461198657600080fd5b6001600160e01b03198116811461198657600080fdfea2646970667358221220061e7ddd660d18d8614d4df54f822c4eab8c5cc98146fc1f60bb631e6bd8d7cd64736f6c634300080100334939886370a844a47113674fc6f85b625a554fbc2d62eb7a688929c62ac6953b

Deployed Bytecode

0x60806040526004361061025c5760003560e01c8063715018a611610144578063bb3bafd6116100b6578063e456b01c1161007a578063e456b01c146106be578063e985e9c5146106d3578063eb1909b5146106f3578063ec41a76214610708578063f2fde38b14610728578063fb48dd95146107485761025c565b8063bb3bafd614610631578063c87b56dd1461065f578063cc2ae0251461067f578063d21d046214610694578063d7224ba0146106a95761025c565b8063a22cb46511610108578063a22cb4651461057c578063ab124c691461059c578063b2c94ee6146105af578063b3e47ba3146105cf578063b88d4fde146105e4578063b9c4d9fb146106045761025c565b8063715018a6146104fd5780637cb64759146105125780638da5cb5b1461053257806395d89b4114610547578063a122dfc81461055c5761025c565b80632f745c59116101dd57806342842e0e116101a157806342842e0e1461044a5780634f6ccce71461046a5780636352211e1461048a57806364bfaaf7146104aa5780636c2f5acd146104bd57806370a08231146104dd5761025c565b80632f745c59146103cd57806335fac604146103ed57806338f9d571146104005780633cb3e0e7146104205780633ccfd60b146104355761025c565b806318160ddd1161022457806318160ddd1461033557806323b872dd146103575780632a55205a146103775780632db11544146103a55780632eb4a7ab146103b85761025c565b806301ffc9a71461026157806306fdde0314610297578063081812fc146102b9578063095ea7b3146102e65780630ebd4c7f14610308575b600080fd5b34801561026d57600080fd5b5061028161027c366004612a2b565b610768565b60405161028e9190612d9f565b60405180910390f35b3480156102a357600080fd5b506102ac6107cc565b60405161028e9190612dd4565b3480156102c557600080fd5b506102d96102d4366004612a13565b61085e565b60405161028e9190612cea565b3480156102f257600080fd5b506103066103013660046128d8565b6108aa565b005b34801561031457600080fd5b50610328610323366004612a13565b610943565b60405161028e9190612d8c565b34801561034157600080fd5b5061034a6109ac565b60405161028e9190612dcb565b34801561036357600080fd5b506103066103723660046127a8565b6109b2565b34801561038357600080fd5b50610397610392366004612b49565b6109bd565b60405161028e929190612d3b565b6103066103b3366004612a13565b6109f7565b3480156103c457600080fd5b5061034a610af5565b3480156103d957600080fd5b5061034a6103e83660046128d8565b610afb565b6103066103fb366004612ad0565b610bf7565b34801561040c57600080fd5b5061034a61041b366004612729565b610dda565b34801561042c57600080fd5b50610281610dec565b34801561044157600080fd5b50610306610dfa565b34801561045657600080fd5b506103066104653660046127a8565b611016565b34801561047657600080fd5b5061034a610485366004612a13565b611031565b34801561049657600080fd5b506102d96104a5366004612a13565b61105d565b6103066104b8366004612ad0565b61106f565b3480156104c957600080fd5b506103066104d8366004612745565b61123e565b3480156104e957600080fd5b5061034a6104f8366004612729565b6112a3565b34801561050957600080fd5b506103066112f0565b34801561051e57600080fd5b5061030661052d366004612a13565b61133b565b34801561053e57600080fd5b506102d96113ba565b34801561055357600080fd5b506102ac6113c9565b34801561056857600080fd5b506103066105773660046129c0565b6113d8565b34801561058857600080fd5b506103066105973660046128a4565b6114b1565b6103066105aa366004612a13565b61157f565b3480156105bb57600080fd5b506103066105ca366004612a63565b61166a565b3480156105db57600080fd5b506102816116b5565b3480156105f057600080fd5b506103066105ff3660046127e8565b6116c5565b34801561061057600080fd5b5061062461061f366004612a13565b6116fe565b60405161028e9190612d54565b34801561063d57600080fd5b5061065161064c366004612a13565b611785565b60405161028e929190612d67565b34801561066b57600080fd5b506102ac61067a366004612a13565b611855565b34801561068b57600080fd5b506102816118ae565b3480156106a057600080fd5b5061034a6118b7565b3480156106b557600080fd5b5061034a6118bd565b3480156106ca57600080fd5b5061034a6118c3565b3480156106df57600080fd5b506102816106ee366004612770565b6118c9565b3480156106ff57600080fd5b506102816118f7565b34801561071457600080fd5b5061034a610723366004612729565b611906565b34801561073457600080fd5b50610306610743366004612729565b611918565b34801561075457600080fd5b506103066107633660046128ea565b611989565b600061077382611b0b565b8061078e57506001600160e01b03198216635d9dd7eb60e11b145b806107a957506001600160e01b0319821663152a902d60e11b145b806107c457506001600160e01b03198216632dde656160e21b145b90505b919050565b6060600380546107db9061375b565b80601f01602080910402602001604051908101604052809291908181526020018280546108079061375b565b80156108545780601f1061082957610100808354040283529160200191610854565b820191906000526020600020905b81548152906001019060200180831161083757829003601f168201915b5050505050905090565b600061086982611b66565b61088e5760405162461bcd60e51b815260040161088590613597565b60405180910390fd5b506000908152600760205260409020546001600160a01b031690565b60006108b58261105d565b9050806001600160a01b0316836001600160a01b031614156108e95760405162461bcd60e51b8152600401610885906132b2565b806001600160a01b03166108fb611b6d565b6001600160a01b031614806109175750610917816106ee611b6d565b6109335760405162461bcd60e51b815260040161088590612fe3565b61093e838383611b71565b505050565b601a546060906001600160a01b0316156107c75760408051600180825281830190925290602080830190803683370190505090506019548160008151811061099b57634e487b7160e01b600052603260045260246000fd5b602002602001018181525050919050565b60025490565b61093e838383611bcd565b601a5460195460009182916001600160a01b0390911690612710906109e290866136ba565b6109ec91906136a6565b915091509250929050565b60026000541415610a1a5760405162461bcd60e51b8152600401610885906134bd565b6002600055333214610a3e5760405162461bcd60e51b81526004016108859061344e565b60175462010000900460ff16610a665760405162461bcd60e51b815260040161088590613253565b600081118015610a775750600a8111155b8015610a935750610a908167011c37937e0800006136ba565b34145b610aaf5760405162461bcd60e51b81526004016108859061327b565b6103e881610abb6109ac565b610ac5919061368e565b1115610ae35760405162461bcd60e51b815260040161088590612e29565b610aed3382611ee1565b506001600055565b600a5481565b6000610b06836112a3565b8210610b245760405162461bcd60e51b815260040161088590612de7565b6000610b2e6109ac565b905060008060005b83811015610bd8576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff169183019190915215610b8957805192505b876001600160a01b0316836001600160a01b03161415610bc55786841415610bb757509350610bf192505050565b83610bc181613796565b9450505b5080610bd081613796565b915050610b36565b5060405162461bcd60e51b81526004016108859061346f565b92915050565b60026000541415610c1a5760405162461bcd60e51b8152600401610885906134bd565b6002600055333214610c3e5760405162461bcd60e51b81526004016108859061344e565b60175460ff16610c605760405162461bcd60e51b815260040161088590613323565b600083118015610c715750600a8311155b8015610c8c5750610c898366f8b0a10e4700006136ba565b34145b610ca85760405162461bcd60e51b815260040161088590612ee3565b6101f483610cb46109ac565b610cbe919061368e565b1115610cdc5760405162461bcd60e51b815260040161088590612e29565b33600090815260156020526040902054600a90610cfa90859061368e565b1115610d185760405162461bcd60e51b8152600401610885906133d6565b600033604051602001610d2b9190612c24565b604051602081830303815290604052805190602001209050610d8483838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a549150849050611efb565b610da05760405162461bcd60e51b815260040161088590612fa2565b3360009081526015602052604081208054869290610dbf90849061368e565b90915550610dcf90503385611ee1565b505060016000555050565b60166020526000908152604090205481565b601754610100900460ff1681565b610e02611b6d565b6001600160a01b0316610e136113ba565b6001600160a01b031614610e395760405162461bcd60e51b815260040161088590613108565b60004711610e595760405162461bcd60e51b8152600401610885906131ec565b6000610e74620186a0610e6e47613e80611f11565b90611f24565b90506000610e8b620186a0610e6e47612134611f11565b90506000610ea2620186a0610e6e47611d4c611f11565b90506000610eb9620186a0610e6e47611b58611f11565b90506000610ed0620186a0610e6e476107d0611f11565b90506000610ee7620186a0610e6e476107d0611f11565b90506000610efe620186a0610e6e476107d0611f11565b90506000610f15620186a0610e6e47611388611f11565b90506000610f2c620186a0610e6e476105dc611f11565b600c54909150610f45906001600160a01b03168a611f30565b600d54610f5b906001600160a01b031689611f30565b600e54610f71906001600160a01b031688611f30565b600f54610f87906001600160a01b031687611f30565b601054610f9d906001600160a01b031686611f30565b601154610fb3906001600160a01b031685611f30565b601254610fc9906001600160a01b031684611f30565b601354610fdf906001600160a01b031683611f30565b601454610ff5906001600160a01b031682611f30565b600b5461100b906001600160a01b031647611f30565b505050505050505050565b61093e838383604051806020016040528060008152506116c5565b600061103b6109ac565b82106110595760405162461bcd60e51b815260040161088590612f1a565b5090565b600061106882611fac565b5192915050565b600260005414156110925760405162461bcd60e51b8152600401610885906134bd565b60026000553332146110b65760405162461bcd60e51b81526004016108859061344e565b6017546301000000900460ff166110df5760405162461bcd60e51b81526004016108859061356e565b6000831180156110f05750600a8311155b801561110b57506111088366d529ae9e8600006136ba565b34145b6111275760405162461bcd60e51b815260040161088590612ee3565b6103e8836111336109ac565b61113d919061368e565b111561115b5760405162461bcd60e51b815260040161088590612e29565b33600090815260166020526040902054600a9061117990859061368e565b11156111975760405162461bcd60e51b815260040161088590613040565b6000336040516020016111aa9190612c24565b60405160208183030381529060405280519060200120905061120383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600a549150849050611efb565b61121f5760405162461bcd60e51b815260040161088590612fa2565b3360009081526016602052604081208054869290610dbf90849061368e565b611246611b6d565b6001600160a01b03166112576113ba565b6001600160a01b03161461127d5760405162461bcd60e51b815260040161088590613108565b601a80546001600160a01b0319166001600160a01b039390931692909217909155601955565b60006001600160a01b0382166112cb5760405162461bcd60e51b815260040161088590613077565b506001600160a01b03166000908152600660205260409020546001600160801b031690565b6112f8611b6d565b6001600160a01b03166113096113ba565b6001600160a01b03161461132f5760405162461bcd60e51b815260040161088590613108565b61133960006120bf565b565b611343611b6d565b6001600160a01b03166113546113ba565b6001600160a01b03161461137a5760405162461bcd60e51b815260040161088590613108565b600a8190556040517f914960aef5e033ce5cae8a7992d4b7a6f0f9741227b66acb67c605b7019f8a46906113af908390612dcb565b60405180910390a150565b6001546001600160a01b031690565b6060600480546107db9061375b565b6113e0611b6d565b6001600160a01b03166113f16113ba565b6001600160a01b0316146114175760405162461bcd60e51b815260040161088590613108565b6017805460ff19168415151761ff00191661010086151581029190911762ff000019166201000084151581029190911763ff00000019166301000000861515810291909117938490556040517f4e3ce1d36b894db5de66247d0c9230ebd0a21f499ed076cecfda6a6ea0218b9b946114a39460ff90820481169481831694830482169392041690612daa565b60405180910390a150505050565b6114b9611b6d565b6001600160a01b0316826001600160a01b031614156114ea5760405162461bcd60e51b815260040161088590613163565b80600860006114f7611b6d565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561153b611b6d565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115739190612d9f565b60405180910390a35050565b600260005414156115a25760405162461bcd60e51b8152600401610885906134bd565b60026000553332146115c65760405162461bcd60e51b81526004016108859061344e565b601754610100900460ff166115ed5760405162461bcd60e51b8152600401610885906132f4565b6000811180156115fe5750600a8111155b801561161a57506116178167013fbe85edc900006136ba565b34145b6116365760405162461bcd60e51b81526004016108859061321c565b6101f4816116426109ac565b61164c919061368e565b1115610ae35760405162461bcd60e51b8152600401610885906133d6565b611672611b6d565b6001600160a01b03166116836113ba565b6001600160a01b0316146116a95760405162461bcd60e51b815260040161088590613108565b61093e6018838361266d565b6017546301000000900460ff1681565b6116d0848484611bcd565b6116dc84848484612111565b6116f85760405162461bcd60e51b81526004016108859061334c565b50505050565b601a546060906001600160a01b0316156107c75760408051600180825281830190925290602080830190803683375050601a5482519293506001600160a01b03169183915060009061176057634e487b7160e01b600052603260045260246000fd5b60200260200101906001600160a01b031690816001600160a01b031681525050919050565b601a5460609081906001600160a01b0316156118505760408051600180825281830190925290602080830190803683375050601a5482519294506001600160a01b0316918491506000906117e957634e487b7160e01b600052603260045260246000fd5b6001600160a01b03929092166020928302919091018201526040805160018082528183019092529182810190803683370190505090506019548160008151811061184357634e487b7160e01b600052603260045260246000fd5b6020026020010181815250505b915091565b606061186082611b66565b61187c5760405162461bcd60e51b815260040161088590612e99565b60186118878361222d565b604051602001611898929190612c41565b6040516020818303038152906040529050919050565b60175460ff1681565b6101f481565b60095481565b6103e881565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205460ff1690565b60175462010000900460ff1681565b60156020526000908152604090205481565b611920611b6d565b6001600160a01b03166119316113ba565b6001600160a01b0316146119575760405162461bcd60e51b815260040161088590613108565b6001600160a01b03811661197d5760405162461bcd60e51b815260040161088590612e53565b611986816120bf565b50565b611991611b6d565b6001600160a01b03166119a26113ba565b6001600160a01b0316146119c85760405162461bcd60e51b815260040161088590613108565b60175460ff161580156119e35750601754610100900460ff16155b80156119f957506017546301000000900460ff16155b8015611a0e575060175462010000900460ff16155b611a2a5760405162461bcd60e51b81526004016108859061313d565b60005b8151811015611b07576103e8828281518110611a5957634e487b7160e01b600052603260045260246000fd5b602002602001015160200151611a6d6109ac565b611a77919061368e565b1115611a955760405162461bcd60e51b815260040161088590612e29565b611af5828281518110611ab857634e487b7160e01b600052603260045260246000fd5b602002602001015160000151838381518110611ae457634e487b7160e01b600052603260045260246000fd5b602002602001015160200151611ee1565b80611aff81613796565b915050611a2d565b5050565b60006001600160e01b031982166380ac58cd60e01b1480611b3c57506001600160e01b03198216635b5e139f60e01b145b80611b5757506001600160e01b0319821663780e9d6360e01b145b806107c457506107c482612348565b6002541190565b3390565b60008281526007602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611bd882611fac565b9050600081600001516001600160a01b0316611bf2611b6d565b6001600160a01b03161480611c275750611c0a611b6d565b6001600160a01b0316611c1c8461085e565b6001600160a01b0316145b80611c3b57508151611c3b906106ee611b6d565b905080611c5a5760405162461bcd60e51b81526004016108859061319a565b846001600160a01b031682600001516001600160a01b031614611c8f5760405162461bcd60e51b8152600401610885906130c2565b6001600160a01b038416611cb55760405162461bcd60e51b815260040161088590612f5d565b611cc285858560016116f8565b611cd26000848460000151611b71565b6001600160a01b0385166000908152600660205260408120805460019290611d049084906001600160801b03166136d9565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526006602052604081208054600194509092611d5091859116613663565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b03808716825267ffffffffffffffff428116602080850191825260008981526005909152948520935184549151909216600160a01b0267ffffffffffffffff60a01b19929093166001600160a01b03199091161716179055611de684600161368e565b6000818152600560205260409020549091506001600160a01b0316611e8b57611e0e81611b66565b15611e8b5760408051808201825284516001600160a01b03908116825260208087015167ffffffffffffffff90811682850190815260008781526005909352949091209251835494516001600160a01b031990951692169190911767ffffffffffffffff60a01b1916600160a01b93909116929092029190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ed986868660016116f8565b505050505050565b611b07828260405180602001604052806000815250612361565b600082611f0885846125d5565b14949350505050565b6000611f1d82846136ba565b9392505050565b6000611f1d82846136a6565b6000826001600160a01b031682604051611f4990612ce7565b60006040518083038185875af1925050503d8060008114611f86576040519150601f19603f3d011682016040523d82523d6000602084013e611f8b565b606091505b505090508061093e5760405162461bcd60e51b8152600401610885906134f4565b611fb46126ed565b611fbd82611b66565b611fd95760405162461bcd60e51b815260040161088590612e99565b60007f000000000000000000000000000000000000000000000000000000000000000a831061203a5761202c7f000000000000000000000000000000000000000000000000000000000000000a84613701565b61203790600161368e565b90505b825b8181106120a6576000818152600560209081526040918290208251808401909352546001600160a01b038116808452600160a01b90910467ffffffffffffffff1691830191909152156120935792506107c7915050565b508061209e81613744565b91505061203c565b5060405162461bcd60e51b81526004016108859061351f565b600180546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000612125846001600160a01b031661264f565b1561222157836001600160a01b031663150b7a02612141611b6d565b8786866040518563ffffffff1660e01b81526004016121639493929190612cfe565b602060405180830381600087803b15801561217d57600080fd5b505af19250505080156121ad575060408051601f3d908101601f191682019092526121aa91810190612a47565b60015b612207573d8080156121db576040519150601f19603f3d011682016040523d82523d6000602084013e6121e0565b606091505b5080516121ff5760405162461bcd60e51b81526004016108859061334c565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612225565b5060015b949350505050565b60608161225257506040805180820190915260018152600360fc1b60208201526107c7565b8160005b811561227c578061226681613796565b91506122759050600a836136a6565b9150612256565b60008167ffffffffffffffff8111156122a557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122cf576020820181803683370190505b5090505b8415612225576122e4600183613701565b91506122f1600a866137b1565b6122fc90603061368e565b60f81b81838151811061231f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612341600a866136a6565b94506122d3565b6001600160e01b031981166301ffc9a760e01b14919050565b6002546001600160a01b03841661238a5760405162461bcd60e51b81526004016108859061340d565b61239381611b66565b156123b05760405162461bcd60e51b81526004016108859061339f565b7f000000000000000000000000000000000000000000000000000000000000000a8311156123f05760405162461bcd60e51b8152600401610885906135e4565b6123fd60008583866116f8565b6001600160a01b0384166000908152600660209081526040918290208251808401845290546001600160801b038082168352600160801b9091041691810191909152815180830190925280519091908190612459908790613663565b6001600160801b031681526020018583602001516124779190613663565b6001600160801b039081169091526001600160a01b03808816600081815260066020908152604080832087518154988401518816600160801b029088166fffffffffffffffffffffffffffffffff1990991698909817909616969096179094558451808601865291825267ffffffffffffffff4281168386019081528883526005909552948120915182549451909516600160a01b0267ffffffffffffffff60a01b19959093166001600160a01b031990941693909317939093161790915582905b858110156125c25760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46125866000888488612111565b6125a25760405162461bcd60e51b81526004016108859061334c565b816125ac81613796565b92505080806125ba90613796565b915050612539565b506002819055611ed960008785886116f8565b600081815b845181101561264757600085828151811061260557634e487b7160e01b600052603260045260246000fd5b6020026020010151905080831161262757612620838261265e565b9250612634565b612631818461265e565b92505b508061263f81613796565b9150506125da565b509392505050565b6001600160a01b03163b151590565b60009182526020526040902090565b8280546126799061375b565b90600052602060002090601f01602090048101928261269b57600085556126e1565b82601f106126b45782800160ff198235161785556126e1565b828001600101855582156126e1579182015b828111156126e15782358255916020019190600101906126c6565b50611059929150612704565b604080518082019091526000808252602082015290565b5b808211156110595760008155600101612705565b803580151581146107c757600080fd5b60006020828403121561273a578081fd5b8135611f1d81613807565b60008060408385031215612757578081fd5b823561276281613807565b946020939093013593505050565b60008060408385031215612782578182fd5b823561278d81613807565b9150602083013561279d81613807565b809150509250929050565b6000806000606084860312156127bc578081fd5b83356127c781613807565b925060208401356127d781613807565b929592945050506040919091013590565b600080600080608085870312156127fd578081fd5b843561280881613807565b935060208581013561281981613807565b935060408601359250606086013567ffffffffffffffff8082111561283c578384fd5b818801915088601f83011261284f578384fd5b813581811115612861576128616137f1565b612873601f8201601f19168501613626565b91508082528984828501011115612888578485fd5b8084840185840137810190920192909252939692955090935050565b600080604083850312156128b6578182fd5b82356128c181613807565b91506128cf60208401612719565b90509250929050565b60008060408385031215612757578182fd5b600060208083850312156128fc578182fd5b823567ffffffffffffffff80821115612913578384fd5b818501915085601f830112612926578384fd5b813581811115612938576129386137f1565b6129458485830201613626565b81815284810192508385016040808402860187018a1015612964578788fd5b8795505b838610156129b25780828b03121561297e578788fd5b61298781613626565b823561299281613807565b815282880135888201528552600195909501949386019390810190612968565b509098975050505050505050565b600080600080608085870312156129d5578384fd5b6129de85612719565b93506129ec60208601612719565b92506129fa60408601612719565b9150612a0860608601612719565b905092959194509250565b600060208284031215612a24578081fd5b5035919050565b600060208284031215612a3c578081fd5b8135611f1d8161381c565b600060208284031215612a58578081fd5b8151611f1d8161381c565b60008060208385031215612a75578182fd5b823567ffffffffffffffff80821115612a8c578384fd5b818501915085601f830112612a9f578384fd5b813581811115612aad578485fd5b866020828501011115612abe578485fd5b60209290920196919550909350505050565b600080600060408486031215612ae4578081fd5b83359250602084013567ffffffffffffffff80821115612b02578283fd5b818601915086601f830112612b15578283fd5b813581811115612b23578384fd5b8760208083028501011115612b36578384fd5b6020830194508093505050509250925092565b60008060408385031215612b5b578182fd5b50508035926020909101359150565b6000815180845260208085019450808401835b83811015612ba25781516001600160a01b031687529582019590820190600101612b7d565b509495945050505050565b6000815180845260208085019450808401835b83811015612ba257815187529582019590820190600101612bc0565b60008151808452612bf4816020860160208601613718565b601f01601f19169290920160200192915050565b60008151612c1a818560208601613718565b9290920192915050565b60609190911b6bffffffffffffffffffffffff1916815260140190565b8254600090819060028104600180831680612c5d57607f831692505b6020808410821415612c7d57634e487b7160e01b87526022600452602487fd5b818015612c915760018114612ca257612cce565b60ff19861689528489019650612cce565b612cab8b613657565b885b86811015612cc65781548b820152908501908301612cad565b505084890196505b505050505050612cde8185612c08565b95945050505050565b90565b6001600160a01b0391909116815260200190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090612d3190830184612bdc565b9695505050505050565b6001600160a01b03929092168252602082015260400190565b600060208252611f1d6020830184612b6a565b600060408252612d7a6040830185612b6a565b8281036020840152612cde8185612bad565b600060208252611f1d6020830184612bad565b901515815260200190565b93151584529115156020840152151560408301521515606082015260800190565b90815260200190565b600060208252611f1d6020830184612bdc565b60208082526022908201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526010908201526f151bdbc81b585b9e4810db185a5b595960821b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252602a908201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736040820152693a32b73a103a37b5b2b760b11b606082015260800190565b6020808252601e908201527f42616420616d6f756e74206f7220696e76616c6964206574682073656e740000604082015260600190565b60208082526023908201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756040820152626e647360e81b606082015260800190565b60208082526025908201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b60208082526021908201527f4d65726b6c654469737472696275746f723a20496e76616c69642070726f6f666040820152601760f91b606082015260800190565b60208082526039908201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000606082015260800190565b60208082526018908201527f546f6f206d616e792050726573616c6520436c61696d65640000000000000000604082015260600190565b6020808252602b908201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60408201526a65726f206164647265737360a81b606082015260800190565b60208082526026908201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746040820152651037bbb732b960d11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600c908201526b416c6c20496e61637469766560a01b604082015260600190565b6020808252601a908201527f455243373231413a20617070726f766520746f2063616c6c6572000000000000604082015260600190565b60208082526032908201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252601690820152754e6f2062616c616e636520746f20776974686472617760501b604082015260600190565b6020808252601e908201527f42616420616d6f756e74206f7220496e76616c6964206574682073656e740000604082015260600190565b6020808252600e908201526d496e6163746976655075626c696360901b604082015260600190565b6020808252601e908201527f62616420616d6f756e74206f7220496e76616c6964206574682073656e740000604082015260600190565b60208082526022908201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60408201526132b960f11b606082015260800190565b602080825260159082015274496e6163746976655075626c696347656e6573697360581b604082015260600190565b6020808252600f908201526e496e61637469766547656e6573697360881b604082015260600190565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b6020808252601d908201527f455243373231413a20746f6b656e20616c7265616479206d696e746564000000604082015260600190565b60208082526018908201527f546f6f206d616e792047656e6573697320436c61696d65640000000000000000604082015260600190565b60208082526021908201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736040820152607360f81b606082015260800190565b6020808252600790820152664e4f5420454f4160c81b604082015260600190565b6020808252602e908201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060408201526d0deeedccae440c4f240d2dcc8caf60931b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526011908201527015da5d1a191c985dd85b0819985a5b1959607a1b604082015260600190565b6020808252602f908201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560408201526e1037bbb732b91037b3103a37b5b2b760891b606082015260800190565b6020808252600f908201526e496e61637469766550726573616c6560881b604082015260600190565b6020808252602d908201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560408201526c3c34b9ba32b73a103a37b5b2b760991b606082015260800190565b60208082526022908201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696040820152610ced60f31b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff8111828210171561364f5761364f6137f1565b604052919050565b60009081526020902090565b60006001600160801b03808316818516808303821115613685576136856137c5565b01949350505050565b600082198211156136a1576136a16137c5565b500190565b6000826136b5576136b56137db565b500490565b60008160001904831182151516156136d4576136d46137c5565b500290565b60006001600160801b03838116908316818110156136f9576136f96137c5565b039392505050565b600082821015613713576137136137c5565b500390565b60005b8381101561373357818101518382015260200161371b565b838111156116f85750506000910152565b600081613753576137536137c5565b506000190190565b60028104600182168061376f57607f821691505b6020821081141561379057634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156137aa576137aa6137c5565b5060010190565b6000826137c0576137c06137db565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461198657600080fd5b6001600160e01b03198116811461198657600080fdfea2646970667358221220061e7ddd660d18d8614d4df54f822c4eab8c5cc98146fc1f60bb631e6bd8d7cd64736f6c63430008010033

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

4939886370a844a47113674fc6f85b625a554fbc2d62eb7a688929c62ac6953b

-----Decoded View---------------
Arg [0] : _merkleRoot (bytes32): 0x4939886370a844a47113674fc6f85b625a554fbc2d62eb7a688929c62ac6953b

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 4939886370a844a47113674fc6f85b625a554fbc2d62eb7a688929c62ac6953b


Deployed Bytecode Sourcemap

51434:9788:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58179:322;;;;;;;;;;-1:-1:-1;58179:322:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24323:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;25848:204::-;;;;;;;;;;-1:-1:-1;25848:204:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25411:379::-;;;;;;;;;;-1:-1:-1;25411:379:0;;;;;:::i;:::-;;:::i;:::-;;59477:232;;;;;;;;;;-1:-1:-1;59477:232:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;21158:94::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26698:142::-;;;;;;;;;;-1:-1:-1;26698:142:0;;;;;:::i;:::-;;:::i;59717:156::-;;;;;;;;;;-1:-1:-1;59717:156:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;57006:414::-;;;;;;:::i;:::-;;:::i;51566:25::-;;;;;;;;;;;;;:::i;21789:744::-;;;;;;;;;;-1:-1:-1;21789:744:0;;;;;:::i;:::-;;:::i;54883:829::-;;;;;;:::i;:::-;;:::i;52744:48::-;;;;;;;;;;-1:-1:-1;52744:48:0;;;;;:::i;:::-;;:::i;52833:31::-;;;;;;;;;;;;;:::i;60063:1154::-;;;;;;;;;;;;;:::i;26903:157::-;;;;;;;;;;-1:-1:-1;26903:157:0;;;;;:::i;:::-;;:::i;21321:177::-;;;;;;;;;;-1:-1:-1;21321:177:0;;;;;:::i;:::-;;:::i;24146:118::-;;;;;;;;;;-1:-1:-1;24146:118:0;;;;;:::i;:::-;;:::i;56175:821::-;;;;;;:::i;:::-;;:::i;58612:160::-;;;;;;;;;;-1:-1:-1;58612:160:0;;;;;:::i;:::-;;:::i;23023:211::-;;;;;;;;;;-1:-1:-1;23023:211:0;;;;;:::i;:::-;;:::i;39245:103::-;;;;;;;;;;;;;:::i;53910:149::-;;;;;;;;;;-1:-1:-1;53910:149:0;;;;;:::i;:::-;;:::i;38594:87::-;;;;;;;;;;;;;:::i;24478:98::-;;;;;;;;;;;;;:::i;54112:403::-;;;;;;;;;;-1:-1:-1;54112:403:0;;;;;:::i;:::-;;:::i;26116:274::-;;;;;;;;;;-1:-1:-1;26116:274:0;;;;;:::i;:::-;;:::i;55720:447::-;;;;;;:::i;:::-;;:::i;54525:97::-;;;;;;;;;;-1:-1:-1;54525:97:0;;;;;:::i;:::-;;:::i;52902:25::-;;;;;;;;;;;;;:::i;27123:311::-;;;;;;;;;;-1:-1:-1;27123:311:0;;;;;:::i;:::-;;:::i;59177:292::-;;;;;;;;;;-1:-1:-1;59177:292:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;58780:389::-;;;;;;;;;;-1:-1:-1;58780:389:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;54630:243::-;;;;;;;;;;-1:-1:-1;54630:243:0;;;;;:::i;:::-;;:::i;52801:25::-;;;;;;;;;;;;;:::i;51644:43::-;;;;;;;;;;;;;:::i;31538:::-;;;;;;;;;;;;;:::i;51600:37::-;;;;;;;;;;;;;:::i;26453:186::-;;;;;;;;;;-1:-1:-1;26453:186:0;;;;;:::i;:::-;;:::i;52871:24::-;;;;;;;;;;;;;:::i;52689:48::-;;;;;;;;;;-1:-1:-1;52689:48:0;;;;;:::i;:::-;;:::i;39503:201::-;;;;;;;;;;-1:-1:-1;39503:201:0;;;;;:::i;:::-;;:::i;57514:591::-;;;;;;;;;;-1:-1:-1;57514:591:0;;;;;:::i;:::-;;:::i;58179:322::-;58273:4;58297:38;58323:11;58297:25;:38::i;:::-;:80;;;-1:-1:-1;;;;;;;58339:38:0;;-1:-1:-1;;;58339:38:0;58297:80;:146;;;-1:-1:-1;;;;;;;58397:46:0;;-1:-1:-1;;;58397:46:0;58297:146;:196;;;-1:-1:-1;;;;;;;58447:46:0;;-1:-1:-1;;;58447:46:0;58297:196;58290:203;;58179:322;;;;:::o;24323:94::-;24377:13;24406:5;24399:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24323:94;:::o;25848:204::-;25916:7;25940:16;25948:7;25940;:16::i;:::-;25932:74;;;;-1:-1:-1;;;25932:74:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;26022:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;26022:24:0;;25848:204::o;25411:379::-;25480:13;25496:24;25512:7;25496:15;:24::i;:::-;25480:40;;25541:5;-1:-1:-1;;;;;25535:11:0;:2;-1:-1:-1;;;;;25535:11:0;;;25527:58;;;;-1:-1:-1;;;25527:58:0;;;;;;;:::i;:::-;25626:5;-1:-1:-1;;;;;25610:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;25610:21:0;;:62;;;;25635:37;25652:5;25659:12;:10;:12::i;25635:37::-;25594:153;;;;-1:-1:-1;;;25594:153:0;;;;;;;:::i;:::-;25756:28;25765:2;25769:7;25778:5;25756:8;:28::i;:::-;25411:379;;;:::o;59477:232::-;59562:17;;59528;;-1:-1:-1;;;;;59562:17:0;:33;59558:123;;59618:16;;;59632:1;59618:16;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59618:16:0;59612:22;;59658:11;;59649:3;59653:1;59649:6;;;;;;-1:-1:-1;;;59649:6:0;;;;;;;;;;;;;;:20;;;;;59477:232;;;:::o;21158:94::-;21234:12;;21158:94;:::o;26698:142::-;26806:28;26816:4;26822:2;26826:7;26806:9;:28::i;59717:156::-;59822:17;;59847:11;;59785:7;;;;-1:-1:-1;;;;;59822:17:0;;;;59859:5;;59841:17;;:5;:17;:::i;:::-;:23;;;;:::i;:::-;59814:51;;;;59717:156;;;;;:::o;57006:414::-;36644:1;37242:7;;:19;;37234:63;;;;-1:-1:-1;;;37234:63:0;;;;;;;:::i;:::-;36644:1;37375:7;:18;57090:10:::1;57104:9;57090:23;57082:43;;;;-1:-1:-1::0;;;57082:43:0::1;;;;;;;:::i;:::-;57146:12;::::0;;;::::1;;;57138:39;;;;-1:-1:-1::0;;;57138:39:0::1;;;;;;;:::i;:::-;57207:1;57198:6;:10;:26;;;;;57222:2;57212:6;:12;;57198:26;:65;;;;-1:-1:-1::0;57243:19:0::1;:6:::0;57252:10:::1;57243:19;:::i;:::-;57228:9;:35;57198:65;57190:108;;;;-1:-1:-1::0;;;57190:108:0::1;;;;;;;:::i;:::-;51633:4;57333:6;57317:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:32;;57309:61;;;;-1:-1:-1::0;;;57309:61:0::1;;;;;;;:::i;:::-;57383:29;57393:10;57405:6;57383:9;:29::i;:::-;-1:-1:-1::0;36600:1:0;37554:7;:22;57006:414::o;51566:25::-;;;;:::o;21789:744::-;21898:7;21933:16;21943:5;21933:9;:16::i;:::-;21925:5;:24;21917:71;;;;-1:-1:-1;;;21917:71:0;;;;;;;:::i;:::-;21995:22;22020:13;:11;:13::i;:::-;21995:38;;22040:19;22070:25;22120:9;22115:350;22139:14;22135:1;:18;22115:350;;;22169:31;22203:14;;;:11;:14;;;;;;;;;22169:48;;;;;;;;;-1:-1:-1;;;;;22169:48:0;;;;;-1:-1:-1;;;22169:48:0;;;;;;;;;;;;22230:28;22226:89;;22291:14;;;-1:-1:-1;22226:89:0;22348:5;-1:-1:-1;;;;;22327:26:0;:17;-1:-1:-1;;;;;22327:26:0;;22323:135;;;22385:5;22370:11;:20;22366:59;;;-1:-1:-1;22412:1:0;-1:-1:-1;22405:8:0;;-1:-1:-1;;;22405:8:0;22366:59;22435:13;;;;:::i;:::-;;;;22323:135;-1:-1:-1;22155:3:0;;;;:::i;:::-;;;;22115:350;;;;22471:56;;-1:-1:-1;;;22471:56:0;;;;;;;:::i;21789:744::-;;;;;:::o;54883:829::-;36644:1;37242:7;;:19;;37234:63;;;;-1:-1:-1;;;37234:63:0;;;;;;;:::i;:::-;36644:1;37375:7;:18;55026:10:::1;55040:9;55026:23;55018:43;;;;-1:-1:-1::0;;;55018:43:0::1;;;;;;;:::i;:::-;55082:13;::::0;::::1;;55074:42;;;;-1:-1:-1::0;;;55074:42:0::1;;;;;;;:::i;:::-;55146:1;55137:6;:10;:26;;;;;55161:2;55151:6;:12;;55137:26;:66;;;;-1:-1:-1::0;55183:19:0::1;:6:::0;55192:10:::1;55183:19;:::i;:::-;55168:9;:35;55137:66;55129:109;;;;-1:-1:-1::0;;;55129:109:0::1;;;;;;;:::i;:::-;51684:3;55273:6;55257:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:39;;55249:68;;;;-1:-1:-1::0;;;55249:68:0::1;;;;;;;:::i;:::-;55349:10;55336:24;::::0;;;:12:::1;:24;::::0;;;;;55373:2:::1;::::0;55336:33:::1;::::0;55363:6;;55336:33:::1;:::i;:::-;:39;;55328:76;;;;-1:-1:-1::0;;;55328:76:0::1;;;;;;;:::i;:::-;55417:12;55459:10;55442:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;55432:39;;;;;;55417:54;;55504:49;55523:11;;55504:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;55536:10:0::1;::::0;;-1:-1:-1;55548:4:0;;-1:-1:-1;55504:18:0::1;:49::i;:::-;55482:132;;;;-1:-1:-1::0;;;55482:132:0::1;;;;;;;:::i;:::-;55640:10;55627:24;::::0;;;:12:::1;:24;::::0;;;;:35;;55656:6;;55627:24;:35:::1;::::0;55656:6;;55627:35:::1;:::i;:::-;::::0;;;-1:-1:-1;55675:29:0::1;::::0;-1:-1:-1;55685:10:0::1;55697:6:::0;55675:9:::1;:29::i;:::-;-1:-1:-1::0;;36600:1:0;37554:7;:22;-1:-1:-1;;54883:829:0:o;52744:48::-;;;;;;;;;;;;;:::o;52833:31::-;;;;;;;;;:::o;60063:1154::-;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;60144:1:::1;60120:21;:25;60112:60;;;;-1:-1:-1::0;;;60112:60:0::1;;;;;;;:::i;:::-;60192:15;60210:44;60247:6;60210:32;:21;60236:5;60210:25;:32::i;:::-;:36:::0;::::1;:44::i;:::-;60192:62:::0;-1:-1:-1;60264:15:0::1;60282:43;60318:6;60282:31;:21;60308:4;60282:25;:31::i;:43::-;60264:61:::0;-1:-1:-1;60335:15:0::1;60353:43;60389:6;60353:31;:21;60379:4;60353:25;:31::i;:43::-;60335:61:::0;-1:-1:-1;60406:15:0::1;60424:43;60460:6;60424:31;:21;60450:4;60424:25;:31::i;:43::-;60406:61:::0;-1:-1:-1;60477:15:0::1;60495:43;60531:6;60495:31;:21;60521:4;60495:25;:31::i;:43::-;60477:61:::0;-1:-1:-1;60548:15:0::1;60566:43;60602:6;60566:31;:21;60592:4;60566:25;:31::i;:43::-;60548:61:::0;-1:-1:-1;60619:15:0::1;60637:43;60673:6;60637:31;:21;60663:4;60637:25;:31::i;:43::-;60619:61:::0;-1:-1:-1;60690:15:0::1;60708:43;60744:6;60708:31;:21;60734:4;60708:25;:31::i;:43::-;60690:61:::0;-1:-1:-1;60761:15:0::1;60779:43;60815:6;60779:31;:21;60805:4;60779:25;:31::i;:43::-;60843:5;::::0;60761:61;;-1:-1:-1;60834:27:0::1;::::0;-1:-1:-1;;;;;60843:5:0::1;60850:10:::0;60834:8:::1;:27::i;:::-;60880:5;::::0;60871:27:::1;::::0;-1:-1:-1;;;;;60880:5:0::1;60887:10:::0;60871:8:::1;:27::i;:::-;60917:5;::::0;60908:27:::1;::::0;-1:-1:-1;;;;;60917:5:0::1;60924:10:::0;60908:8:::1;:27::i;:::-;60954:5;::::0;60945:27:::1;::::0;-1:-1:-1;;;;;60954:5:0::1;60961:10:::0;60945:8:::1;:27::i;:::-;60991:5;::::0;60982:27:::1;::::0;-1:-1:-1;;;;;60991:5:0::1;60998:10:::0;60982:8:::1;:27::i;:::-;61028:5;::::0;61019:27:::1;::::0;-1:-1:-1;;;;;61028:5:0::1;61035:10:::0;61019:8:::1;:27::i;:::-;61065:5;::::0;61056:27:::1;::::0;-1:-1:-1;;;;;61065:5:0::1;61072:10:::0;61056:8:::1;:27::i;:::-;61102:5;::::0;61093:27:::1;::::0;-1:-1:-1;;;;;61102:5:0::1;61109:10:::0;61093:8:::1;:27::i;:::-;61139:5;::::0;61130:27:::1;::::0;-1:-1:-1;;;;;61139:5:0::1;61146:10:::0;61130:8:::1;:27::i;:::-;61178:5;::::0;61169:38:::1;::::0;-1:-1:-1;;;;;61178:5:0::1;61185:21;61169:8;:38::i;:::-;38885:1;;;;;;;;;60063:1154::o:0;26903:157::-;27015:39;27032:4;27038:2;27042:7;27015:39;;;;;;;;;;;;:16;:39::i;21321:177::-;21388:7;21420:13;:11;:13::i;:::-;21412:5;:21;21404:69;;;;-1:-1:-1;;;21404:69:0;;;;;;;:::i;:::-;-1:-1:-1;21487:5:0;21321:177::o;24146:118::-;24210:7;24233:20;24245:7;24233:11;:20::i;:::-;:25;;24146:118;-1:-1:-1;;24146:118:0:o;56175:821::-;36644:1;37242:7;;:19;;37234:63;;;;-1:-1:-1;;;37234:63:0;;;;;;;:::i;:::-;36644:1;37375:7;:18;56318:10:::1;56332:9;56318:23;56310:43;;;;-1:-1:-1::0;;;56310:43:0::1;;;;;;;:::i;:::-;56374:13;::::0;;;::::1;;;56366:41;;;;-1:-1:-1::0;;;56366:41:0::1;;;;;;;:::i;:::-;56437:1;56428:6;:10;:26;;;;;56452:2;56442:6;:12;;56428:26;:66;;;;-1:-1:-1::0;56474:19:0::1;:6:::0;56483:10:::1;56474:19;:::i;:::-;56459:9;:35;56428:66;56420:109;;;;-1:-1:-1::0;;;56420:109:0::1;;;;;;;:::i;:::-;51633:4;56564:6;56548:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:32;;56540:61;;;;-1:-1:-1::0;;;56540:61:0::1;;;;;;;:::i;:::-;56633:10;56620:24;::::0;;;:12:::1;:24;::::0;;;;;56657:2:::1;::::0;56620:33:::1;::::0;56647:6;;56620:33:::1;:::i;:::-;:39;;56612:76;;;;-1:-1:-1::0;;;56612:76:0::1;;;;;;;:::i;:::-;56701:12;56743:10;56726:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;56716:39;;;;;;56701:54;;56788:49;56807:11;;56788:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;56820:10:0::1;::::0;;-1:-1:-1;56832:4:0;;-1:-1:-1;56788:18:0::1;:49::i;:::-;56766:132;;;;-1:-1:-1::0;;;56766:132:0::1;;;;;;;:::i;:::-;56924:10;56911:24;::::0;;;:12:::1;:24;::::0;;;;:35;;56940:6;;56911:24;:35:::1;::::0;56940:6;;56911:35:::1;:::i;58612:160::-:0;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;58707:17:::1;:29:::0;;-1:-1:-1;;;;;;58707:29:0::1;-1:-1:-1::0;;;;;58707:29:0;;;::::1;::::0;;;::::1;::::0;;;58747:11:::1;:17:::0;58612:160::o;23023:211::-;23087:7;-1:-1:-1;;;;;23111:19:0;;23103:75;;;;-1:-1:-1;;;23103:75:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;23200:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;23200:27:0;;23023:211::o;39245:103::-;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;39310:30:::1;39337:1;39310:18;:30::i;:::-;39245:103::o:0;53910:149::-;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;53984:10:::1;:24:::0;;;54026:25:::1;::::0;::::1;::::0;::::1;::::0;53997:11;;54026:25:::1;:::i;:::-;;;;;;;;53910:149:::0;:::o;38594:87::-;38667:6;;-1:-1:-1;;;;;38667:6:0;38594:87;:::o;24478:98::-;24534:13;24563:7;24556:14;;;;;:::i;54112:403::-;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;54252:13:::1;:32:::0;;-1:-1:-1;;54252:32:0::1;::::0;::::1;;;-1:-1:-1::0;;54295:44:0::1;54252:32;54295:44:::0;::::1;;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;;54350:28:0::1;::::0;;::::1;;::::0;::::1;::::0;;;::::1;-1:-1:-1::0;;54389:30:0::1;::::0;;::::1;;::::0;::::1;::::0;;;::::1;::::0;;;;54437:70:::1;::::0;::::1;::::0;::::1;::::0;54252:32:::1;54446:19:::0;;::::1;::::0;::::1;::::0;54466:13;;::::1;::::0;54480;::::1;::::0;::::1;::::0;54494:12;::::1;;::::0;54437:70:::1;:::i;:::-;;;;;;;;54112:403:::0;;;;:::o;26116:274::-;26219:12;:10;:12::i;:::-;-1:-1:-1;;;;;26207:24:0;:8;-1:-1:-1;;;;;26207:24:0;;;26199:63;;;;-1:-1:-1;;;26199:63:0;;;;;;;:::i;:::-;26316:8;26271:18;:32;26290:12;:10;:12::i;:::-;-1:-1:-1;;;;;26271:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;26271:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;26271:53:0;;;;;;;;;;;26351:12;:10;:12::i;:::-;-1:-1:-1;;;;;26336:48:0;;26375:8;26336:48;;;;;;:::i;:::-;;;;;;;;26116:274;;:::o;55720:447::-;36644:1;37242:7;;:19;;37234:63;;;;-1:-1:-1;;;37234:63:0;;;;;;;:::i;:::-;36644:1;37375:7;:18;55807:10:::1;55821:9;55807:23;55799:43;;;;-1:-1:-1::0;;;55799:43:0::1;;;;;;;:::i;:::-;55863:19;::::0;::::1;::::0;::::1;;;55855:54;;;;-1:-1:-1::0;;;55855:54:0::1;;;;;;;:::i;:::-;55937:1;55928:6;:10;:26;;;;;55952:2;55942:6;:12;;55928:26;:65;;;;-1:-1:-1::0;55973:19:0::1;:6:::0;55982:10:::1;55973:19;:::i;:::-;55958:9;:35;55928:65;55920:108;;;;-1:-1:-1::0;;;55920:108:0::1;;;;;;;:::i;:::-;51684:3;56065:6;56049:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:39;;56041:76;;;;-1:-1:-1::0;;;56041:76:0::1;;;;;;;:::i;54525:97::-:0;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;54598:16:::1;:10;54611:3:::0;;54598:16:::1;:::i;52902:25::-:0;;;;;;;;;:::o;27123:311::-;27260:28;27270:4;27276:2;27280:7;27260:9;:28::i;:::-;27311:48;27334:4;27340:2;27344:7;27353:5;27311:22;:48::i;:::-;27295:133;;;;-1:-1:-1;;;27295:133:0;;;;;;;:::i;:::-;27123:311;;;;:::o;59177:292::-;59287:17;;59235:35;;-1:-1:-1;;;;;59287:17:0;:33;59283:151;;59350:24;;;59372:1;59350:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59405:17:0;;59389:13;;;;-1:-1:-1;;;;;;59405:17:0;;59389:13;;-1:-1:-1;59405:17:0;;59389:13;;-1:-1:-1;;;59389:13:0;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;59389:33:0;;;-1:-1:-1;;;;;59389:33:0;;;;;59177:292;;;:::o;58780:389::-;58908:17;;58834:35;;;;-1:-1:-1;;;;;58908:17:0;:33;58904:223;;58971:24;;;58993:1;58971:24;;;;;;;;;;;;;;;;;;;-1:-1:-1;;59026:17:0;;59010:13;;;;-1:-1:-1;;;;;;59026:17:0;;59010:13;;-1:-1:-1;59026:17:0;;59010:13;;-1:-1:-1;;;59010:13:0;;;;;;;;;-1:-1:-1;;;;;59010:33:0;;;;:13;;;;;;;;;;:33;59064:16;;;59078:1;59064:16;;;;;;;;;;;;;;59010:13;59064:16;;;;;-1:-1:-1;59064:16:0;59058:22;;59104:11;;59095:3;59099:1;59095:6;;;;;;-1:-1:-1;;;59095:6:0;;;;;;;;;;;;;;:20;;;;;58904:223;58780:389;;;:::o;54630:243::-;54694:13;54728:16;54736:7;54728;:16::i;:::-;54720:71;;;;-1:-1:-1;;;54720:71:0;;;;;;;:::i;:::-;54833:10;54845:18;:7;:16;:18::i;:::-;54816:48;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54802:63;;54630:243;;;:::o;52801:25::-;;;;;;:::o;51644:43::-;51684:3;51644:43;:::o;31538:::-;;;;:::o;51600:37::-;51633:4;51600:37;:::o;26453:186::-;-1:-1:-1;;;;;26598:25:0;;;26575:4;26598:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;26453:186::o;52871:24::-;;;;;;;;;:::o;52689:48::-;;;;;;;;;;;;;:::o;39503:201::-;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;39592:22:0;::::1;39584:73;;;;-1:-1:-1::0;;;39584:73:0::1;;;;;;;:::i;:::-;39668:28;39687:8;39668:18;:28::i;:::-;39503:201:::0;:::o;57514:591::-;38825:12;:10;:12::i;:::-;-1:-1:-1;;;;;38814:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;38814:23:0;;38806:68;;;;-1:-1:-1;;;38806:68:0;;;;;;;:::i;:::-;57602:13:::1;::::0;::::1;;57601:14;:38:::0;::::1;;;-1:-1:-1::0;57620:19:0::1;::::0;::::1;::::0;::::1;;;57619:20;57601:38;:56;;;;-1:-1:-1::0;57644:13:0::1;::::0;;;::::1;;;57643:14;57601:56;:73;;;;-1:-1:-1::0;57662:12:0::1;::::0;;;::::1;;;57661:13;57601:73;57593:98;;;;-1:-1:-1::0;;;57593:98:0::1;;;;;;;:::i;:::-;57707:6;57702:396;57723:7;:14;57719:1;:18;57702:396;;;51633:4;57783:7;57791:1;57783:10;;;;;;-1:-1:-1::0;;;57783:10:0::1;;;;;;;;;;;;;;;:17;;;57767:13;:11;:13::i;:::-;:33;;;;:::i;:::-;:43;;57759:72;;;;-1:-1:-1::0;;;57759:72:0::1;;;;;;;:::i;:::-;58036:50;58046:7;58054:1;58046:10;;;;;;-1:-1:-1::0;;;58046:10:0::1;;;;;;;;;;;;;;;:20;;;58068:7;58076:1;58068:10;;;;;;-1:-1:-1::0;;;58068:10:0::1;;;;;;;;;;;;;;;:17;;;58036:9;:50::i;:::-;57739:3:::0;::::1;::::0;::::1;:::i;:::-;;;;57702:396;;;;57514:591:::0;:::o;22597:370::-;22724:4;-1:-1:-1;;;;;;22754:40:0;;-1:-1:-1;;;22754:40:0;;:99;;-1:-1:-1;;;;;;;22805:48:0;;-1:-1:-1;;;22805:48:0;22754:99;:160;;;-1:-1:-1;;;;;;;22864:50:0;;-1:-1:-1;;;22864:50:0;22754:160;:207;;;;22925:36;22949:11;22925:23;:36::i;27673:105::-;27760:12;;-1:-1:-1;27750:22:0;27673:105::o;9494:98::-;9574:10;9494:98;:::o;31360:172::-;31457:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;31457:29:0;-1:-1:-1;;;;;31457:29:0;;;;;;;;;31498:28;;31457:24;;31498:28;;;;;;;31360:172;;;:::o;29725:1529::-;29822:35;29860:20;29872:7;29860:11;:20::i;:::-;29822:58;;29889:22;29931:13;:18;;;-1:-1:-1;;;;;29915:34:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;29915:34:0;;:81;;;;29984:12;:10;:12::i;:::-;-1:-1:-1;;;;;29960:36:0;:20;29972:7;29960:11;:20::i;:::-;-1:-1:-1;;;;;29960:36:0;;29915:81;:142;;;-1:-1:-1;30024:18:0;;30007:50;;30044:12;:10;:12::i;30007:50::-;29889:169;;30083:17;30067:101;;;;-1:-1:-1;;;30067:101:0;;;;;;;:::i;:::-;30215:4;-1:-1:-1;;;;;30193:26:0;:13;:18;;;-1:-1:-1;;;;;30193:26:0;;30177:98;;;;-1:-1:-1;;;30177:98:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;30290:16:0;;30282:66;;;;-1:-1:-1;;;30282:66:0;;;;;;;:::i;:::-;30357:43;30379:4;30385:2;30389:7;30398:1;30357:21;:43::i;:::-;30457:49;30474:1;30478:7;30487:13;:18;;;30457:8;:49::i;:::-;-1:-1:-1;;;;;30515:18:0;;;;;;:12;:18;;;;;:31;;30545:1;;30515:18;:31;;30545:1;;-1:-1:-1;;;;;30515:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;30515:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;30553:16:0;;-1:-1:-1;30553:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;30553:16:0;;:29;;-1:-1:-1;;30553:29:0;;:::i;:::-;;;-1:-1:-1;;;;;30553:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30612:43:0;;;;;;;;-1:-1:-1;;;;;30612:43:0;;;;;;30638:15;30612:43;;;;;;;;;-1:-1:-1;30589:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;30589:66:0;-1:-1:-1;;;;30589:66:0;;;;-1:-1:-1;;;;;;30589:66:0;;;;;;;;30905:11;30601:7;-1:-1:-1;30905:11:0;:::i;:::-;30968:1;30927:24;;;:11;:24;;;;;:29;30883:33;;-1:-1:-1;;;;;;30927:29:0;30923:236;;30985:20;30993:11;30985:7;:20::i;:::-;30981:171;;;31045:97;;;;;;;;31072:18;;-1:-1:-1;;;;;31045:97:0;;;;;;31103:28;;;;31045:97;;;;;;;;;;-1:-1:-1;31018:24:0;;;:11;:24;;;;;;;:124;;;;;;-1:-1:-1;;;;;;31018:124:0;;;;;;;;;-1:-1:-1;;;;31018:124:0;-1:-1:-1;;;31018:124:0;;;;;;;;;;;;;;30981:171;31191:7;31187:2;-1:-1:-1;;;;;31172:27:0;31181:4;-1:-1:-1;;;;;31172:27:0;;;;;;;;;;;31206:42;31227:4;31233:2;31237:7;31246:1;31206:20;:42::i;:::-;29725:1529;;;;;;:::o;27784:98::-;27849:27;27859:2;27863:8;27849:27;;;;;;;;;;;;:9;:27::i;40910:190::-;41035:4;41088;41059:25;41072:5;41079:4;41059:12;:25::i;:::-;:33;;40910:190;-1:-1:-1;;;;40910:190:0:o;45912:98::-;45970:7;45997:5;46001:1;45997;:5;:::i;:::-;45990:12;45912:98;-1:-1:-1;;;45912:98:0:o;46311:::-;46369:7;46396:5;46400:1;46396;:5;:::i;59881:174::-;59951:12;59969:4;-1:-1:-1;;;;;59969:9:0;59986:5;59969:27;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59950:46;;;60017:7;60009:37;;;;-1:-1:-1;;;60009:37:0;;;;;;;:::i;23486:606::-;23562:21;;:::i;:::-;23603:16;23611:7;23603;:16::i;:::-;23595:71;;;;-1:-1:-1;;;23595:71:0;;;;;;;:::i;:::-;23675:26;23723:12;23712:7;:23;23708:93;;23767:22;23777:12;23767:7;:22;:::i;:::-;:26;;23792:1;23767:26;:::i;:::-;23746:47;;23708:93;23829:7;23809:212;23846:18;23838:4;:26;23809:212;;23883:31;23917:17;;;:11;:17;;;;;;;;;23883:51;;;;;;;;;-1:-1:-1;;;;;23883:51:0;;;;;-1:-1:-1;;;23883:51:0;;;;;;;;;;;;23947:28;23943:71;;23995:9;-1:-1:-1;23988:16:0;;-1:-1:-1;;23988:16:0;23943:71;-1:-1:-1;23866:6:0;;;;:::i;:::-;;;;23809:212;;;;24029:57;;-1:-1:-1;;;24029:57:0;;;;;;;:::i;39864:191::-;39957:6;;;-1:-1:-1;;;;;39974:17:0;;;-1:-1:-1;;;;;;39974:17:0;;;;;;;40007:40;;39957:6;;;39974:17;39957:6;;40007:40;;39938:16;;40007:40;39864:191;;:::o;33075:690::-;33212:4;33229:15;:2;-1:-1:-1;;;;;33229:13:0;;:15::i;:::-;33225:535;;;33284:2;-1:-1:-1;;;;;33268:36:0;;33305:12;:10;:12::i;:::-;33319:4;33325:7;33334:5;33268:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33268:72:0;;;;;;;;-1:-1:-1;;33268:72:0;;;;;;;;;;;;:::i;:::-;;;33255:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33499:13:0;;33495:215;;33532:61;;-1:-1:-1;;;33532:61:0;;;;;;;:::i;33495:215::-;33678:6;33672:13;33663:6;33659:2;33655:15;33648:38;33255:464;-1:-1:-1;;;;;;33390:55:0;-1:-1:-1;;;33390:55:0;;-1:-1:-1;33383:62:0;;33225:535;-1:-1:-1;33748:4:0;33225:535;33075:690;;;;;;:::o;49646:723::-;49702:13;49923:10;49919:53;;-1:-1:-1;49950:10:0;;;;;;;;;;;;-1:-1:-1;;;49950:10:0;;;;;;49919:53;49997:5;49982:12;50038:78;50045:9;;50038:78;;50071:8;;;;:::i;:::-;;-1:-1:-1;50094:10:0;;-1:-1:-1;50102:2:0;50094:10;;:::i;:::-;;;50038:78;;;50126:19;50158:6;50148:17;;;;;;-1:-1:-1;;;50148:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;50148:17:0;;50126:39;;50176:154;50183:10;;50176:154;;50210:11;50220:1;50210:11;;:::i;:::-;;-1:-1:-1;50279:10:0;50287:2;50279:5;:10;:::i;:::-;50266:24;;:2;:24;:::i;:::-;50253:39;;50236:6;50243;50236:14;;;;;;-1:-1:-1;;;50236:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;50236:56:0;;;;;;;;-1:-1:-1;50307:11:0;50316:2;50307:11;;:::i;:::-;;;50176:154;;11252:157;-1:-1:-1;;;;;;11361:40:0;;-1:-1:-1;;;11361:40:0;11252:157;;;:::o;28221:1272::-;28349:12;;-1:-1:-1;;;;;28376:16:0;;28368:62;;;;-1:-1:-1;;;28368:62:0;;;;;;;:::i;:::-;28567:21;28575:12;28567:7;:21::i;:::-;28566:22;28558:64;;;;-1:-1:-1;;;28558:64:0;;;;;;;:::i;:::-;28649:12;28637:8;:24;;28629:71;;;;-1:-1:-1;;;28629:71:0;;;;;;;:::i;:::-;28709:61;28739:1;28743:2;28747:12;28761:8;28709:21;:61::i;:::-;-1:-1:-1;;;;;28812:16:0;;28779:30;28812:16;;;:12;:16;;;;;;;;;28779:49;;;;;;;;;-1:-1:-1;;;;;28779:49:0;;;;;-1:-1:-1;;;28779:49:0;;;;;;;;;;;28854:119;;;;;;;;28874:19;;28779:49;;28854:119;;;28874:39;;28904:8;;28874:39;:::i;:::-;-1:-1:-1;;;;;28854:119:0;;;;;28957:8;28922:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;28854:119:0;;;;;;-1:-1:-1;;;;;28835:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;;;-1:-1:-1;;;28835:138:0;;;;-1:-1:-1;;28835:138:0;;;;;;;;;;;;;;;;;29008:43;;;;;;;;;;;29034:15;29008:43;;;;;;;;28980:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;28980:71:0;-1:-1:-1;;;;28980:71:0;;;;-1:-1:-1;;;;;;28980:71:0;;;;;;;;;;;;;;;28992:12;;29104:281;29128:8;29124:1;:12;29104:281;;;29157:38;;29182:12;;-1:-1:-1;;;;;29157:38:0;;;29174:1;;29157:38;;29174:1;;29157:38;29222:59;29253:1;29257:2;29261:12;29275:5;29222:22;:59::i;:::-;29204:150;;;;-1:-1:-1;;;29204:150:0;;;;;;;:::i;:::-;29363:14;;;;:::i;:::-;;;;29138:3;;;;;:::i;:::-;;;;29104:281;;;-1:-1:-1;29393:12:0;:27;;;29427:60;29456:1;29460:2;29464:12;29478:8;29427:20;:60::i;41462:675::-;41545:7;41588:4;41545:7;41603:497;41627:5;:12;41623:1;:16;41603:497;;;41661:20;41684:5;41690:1;41684:8;;;;;;-1:-1:-1;;;41684:8:0;;;;;;;;;;;;;;;41661:31;;41727:12;41711;:28;41707:382;;41854:42;41869:12;41883;41854:14;:42::i;:::-;41839:57;;41707:382;;;42031:42;42046:12;42060;42031:14;:42::i;:::-;42016:57;;41707:382;-1:-1:-1;41641:3:0;;;;:::i;:::-;;;;41603:497;;;-1:-1:-1;42117:12:0;41462:675;-1:-1:-1;;;41462:675:0:o;1603:326::-;-1:-1:-1;;;;;1898:19:0;;:23;;;1603:326::o;42145:224::-;42213:13;42263:15;;;42299:4;42292:15;42346:4;42330:21;;;42248:114::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;14:162:1;81:20;;137:13;;130:21;120:32;;110:2;;166:1;163;156:12;181:259;;293:2;281:9;272:7;268:23;264:32;261:2;;;314:6;306;299:22;261:2;358:9;345:23;377:33;404:5;377:33;:::i;445:335::-;;;582:2;570:9;561:7;557:23;553:32;550:2;;;603:6;595;588:22;550:2;647:9;634:23;666:33;693:5;666:33;:::i;:::-;718:5;770:2;755:18;;;;742:32;;-1:-1:-1;;;540:240:1:o;785:402::-;;;914:2;902:9;893:7;889:23;885:32;882:2;;;935:6;927;920:22;882:2;979:9;966:23;998:33;1025:5;998:33;:::i;:::-;1050:5;-1:-1:-1;1107:2:1;1092:18;;1079:32;1120:35;1079:32;1120:35;:::i;:::-;1174:7;1164:17;;;872:315;;;;;:::o;1192:470::-;;;;1338:2;1326:9;1317:7;1313:23;1309:32;1306:2;;;1359:6;1351;1344:22;1306:2;1403:9;1390:23;1422:33;1449:5;1422:33;:::i;:::-;1474:5;-1:-1:-1;1531:2:1;1516:18;;1503:32;1544:35;1503:32;1544:35;:::i;:::-;1296:366;;1598:7;;-1:-1:-1;;;1652:2:1;1637:18;;;;1624:32;;1296:366::o;1667:1157::-;;;;;1839:3;1827:9;1818:7;1814:23;1810:33;1807:2;;;1861:6;1853;1846:22;1807:2;1905:9;1892:23;1924:33;1951:5;1924:33;:::i;:::-;1976:5;-1:-1:-1;2000:2:1;2039:18;;;2026:32;2067:35;2026:32;2067:35;:::i;:::-;2121:7;-1:-1:-1;2175:2:1;2160:18;;2147:32;;-1:-1:-1;2230:2:1;2215:18;;2202:32;2253:18;2283:14;;;2280:2;;;2315:6;2307;2300:22;2280:2;2358:6;2347:9;2343:22;2333:32;;2403:7;2396:4;2392:2;2388:13;2384:27;2374:2;;2430:6;2422;2415:22;2374:2;2471;2458:16;2493:2;2489;2486:10;2483:2;;;2499:18;;:::i;:::-;2541:53;2584:2;2565:13;;-1:-1:-1;;2561:27:1;2557:36;;2541:53;:::i;:::-;2528:66;;2617:2;2610:5;2603:17;2657:7;2652:2;2647;2643;2639:11;2635:20;2632:33;2629:2;;;2683:6;2675;2668:22;2629:2;2743;2738;2734;2730:11;2725:2;2718:5;2714:14;2701:45;2766:14;;2762:23;;;2755:39;;;;1797:1027;;;;-1:-1:-1;1797:1027:1;;-1:-1:-1;;1797:1027:1:o;2829:329::-;;;2955:2;2943:9;2934:7;2930:23;2926:32;2923:2;;;2976:6;2968;2961:22;2923:2;3020:9;3007:23;3039:33;3066:5;3039:33;:::i;:::-;3091:5;-1:-1:-1;3115:37:1;3148:2;3133:18;;3115:37;:::i;:::-;3105:47;;2913:245;;;;;:::o;3163:327::-;;;3292:2;3280:9;3271:7;3267:23;3263:32;3260:2;;;3313:6;3305;3298:22;3495:1331;;3634:2;3677;3665:9;3656:7;3652:23;3648:32;3645:2;;;3698:6;3690;3683:22;3645:2;3743:9;3730:23;3772:18;3813:2;3805:6;3802:14;3799:2;;;3834:6;3826;3819:22;3799:2;3877:6;3866:9;3862:22;3852:32;;3922:7;3915:4;3911:2;3907:13;3903:27;3893:2;;3949:6;3941;3934:22;3893:2;3990;3977:16;4012:2;4008;4005:10;4002:2;;;4018:18;;:::i;:::-;4058:37;4091:2;4086;4082;4078:11;4074:20;4058:37;:::i;:::-;4129:15;;;4160:12;;;;-1:-1:-1;4192:11:1;;;4222:4;4253:11;;;4245:20;;4241:29;;4238:42;-1:-1:-1;4235:2:1;;;4298:6;4290;4283:22;4235:2;4325:6;4316:15;;4340:456;4354:2;4351:1;4348:9;4340:456;;;4425:2;4419:3;4410:7;4406:17;4402:26;4399:2;;;4446:6;4438;4431:22;4399:2;4481:19;4497:2;4481:19;:::i;:::-;4541:3;4528:17;4558:35;4585:7;4558:35;:::i;:::-;4606:22;;4677:12;;;4664:26;4648:14;;;4641:50;4704:18;;4372:1;4365:9;;;;;4742:12;;;;4774;;;;4340:456;;;-1:-1:-1;4815:5:1;;3614:1212;-1:-1:-1;;;;;;;;3614:1212:1:o;4831:403::-;;;;;4982:3;4970:9;4961:7;4957:23;4953:33;4950:2;;;5004:6;4996;4989:22;4950:2;5032:28;5050:9;5032:28;:::i;:::-;5022:38;;5079:37;5112:2;5101:9;5097:18;5079:37;:::i;:::-;5069:47;;5135:37;5168:2;5157:9;5153:18;5135:37;:::i;:::-;5125:47;;5191:37;5224:2;5213:9;5209:18;5191:37;:::i;:::-;5181:47;;4940:294;;;;;;;:::o;5239:190::-;;5351:2;5339:9;5330:7;5326:23;5322:32;5319:2;;;5372:6;5364;5357:22;5319:2;-1:-1:-1;5400:23:1;;5309:120;-1:-1:-1;5309:120:1:o;5434:257::-;;5545:2;5533:9;5524:7;5520:23;5516:32;5513:2;;;5566:6;5558;5551:22;5513:2;5610:9;5597:23;5629:32;5655:5;5629:32;:::i;5696:261::-;;5818:2;5806:9;5797:7;5793:23;5789:32;5786:2;;;5839:6;5831;5824:22;5786:2;5876:9;5870:16;5895:32;5921:5;5895:32;:::i;5962:642::-;;;6094:2;6082:9;6073:7;6069:23;6065:32;6062:2;;;6115:6;6107;6100:22;6062:2;6160:9;6147:23;6189:18;6230:2;6222:6;6219:14;6216:2;;;6251:6;6243;6236:22;6216:2;6294:6;6283:9;6279:22;6269:32;;6339:7;6332:4;6328:2;6324:13;6320:27;6310:2;;6366:6;6358;6351:22;6310:2;6411;6398:16;6437:2;6429:6;6426:14;6423:2;;;6458:6;6450;6443:22;6423:2;6508:7;6503:2;6494:6;6490:2;6486:15;6482:24;6479:37;6476:2;;;6534:6;6526;6519:22;6476:2;6570;6562:11;;;;;6592:6;;-1:-1:-1;6052:552:1;;-1:-1:-1;;;;6052:552:1:o;6804:734::-;;;;6968:2;6956:9;6947:7;6943:23;6939:32;6936:2;;;6989:6;6981;6974:22;6936:2;7030:9;7017:23;7007:33;;7091:2;7080:9;7076:18;7063:32;7114:18;7155:2;7147:6;7144:14;7141:2;;;7176:6;7168;7161:22;7141:2;7219:6;7208:9;7204:22;7194:32;;7264:7;7257:4;7253:2;7249:13;7245:27;7235:2;;7291:6;7283;7276:22;7235:2;7336;7323:16;7362:2;7354:6;7351:14;7348:2;;;7383:6;7375;7368:22;7348:2;7442:7;7437:2;7431;7423:6;7419:15;7415:2;7411:24;7407:33;7404:46;7401:2;;;7468:6;7460;7453:22;7401:2;7504;7500;7496:11;7486:21;;7526:6;7516:16;;;;;6926:612;;;;;:::o;7543:258::-;;;7672:2;7660:9;7651:7;7647:23;7643:32;7640:2;;;7693:6;7685;7678:22;7640:2;-1:-1:-1;;7721:23:1;;;7791:2;7776:18;;;7763:32;;-1:-1:-1;7630:171:1:o;7806:477::-;;7911:5;7905:12;7938:6;7933:3;7926:19;7964:4;7993:2;7988:3;7984:12;7977:19;;8030:2;8023:5;8019:14;8051:3;8063:195;8077:6;8074:1;8071:13;8063:195;;;8142:13;;-1:-1:-1;;;;;8138:39:1;8126:52;;8198:12;;;;8233:15;;;;8174:1;8092:9;8063:195;;;-1:-1:-1;8274:3:1;;7881:402;-1:-1:-1;;;;;7881:402:1:o;8288:443::-;;8385:5;8379:12;8412:6;8407:3;8400:19;8438:4;8467:2;8462:3;8458:12;8451:19;;8504:2;8497:5;8493:14;8525:3;8537:169;8551:6;8548:1;8545:13;8537:169;;;8612:13;;8600:26;;8646:12;;;;8681:15;;;;8573:1;8566:9;8537:169;;8736:259;;8817:5;8811:12;8844:6;8839:3;8832:19;8860:63;8916:6;8909:4;8904:3;8900:14;8893:4;8886:5;8882:16;8860:63;:::i;:::-;8977:2;8956:15;-1:-1:-1;;8952:29:1;8943:39;;;;8984:4;8939:50;;8787:208;-1:-1:-1;;8787:208:1:o;9000:187::-;;9082:5;9076:12;9097:52;9142:6;9137:3;9130:4;9123:5;9119:16;9097:52;:::i;:::-;9165:16;;;;;9052:135;-1:-1:-1;;9052:135:1:o;9192:229::-;9341:2;9337:15;;;;-1:-1:-1;;9333:53:1;9321:66;;9412:2;9403:12;;9311:110::o;9426:1181::-;9660:13;;9426:1181;;;;9733:1;9718:17;;9754:1;9790:18;;;;9817:2;;9871:4;9863:6;9859:17;9849:27;;9817:2;9897;9945;9937:6;9934:14;9914:18;9911:38;9908:2;;;-1:-1:-1;;;9972:33:1;;10028:4;10025:1;10018:15;10058:4;9979:3;10046:17;9908:2;10089:18;10116:104;;;;10234:1;10229:324;;;;10082:471;;10116:104;-1:-1:-1;;10149:24:1;;10137:37;;10194:16;;;;-1:-1:-1;10116:104:1;;10229:324;10265:39;10297:6;10265:39;:::i;:::-;10326:3;10342:165;10356:6;10353:1;10350:13;10342:165;;;10434:14;;10421:11;;;10414:35;10477:16;;;;10371:10;;10342:165;;;10346:3;;10536:6;10531:3;10527:16;10520:23;;10082:471;;;;;;;10569:32;10597:3;10589:6;10569:32;:::i;:::-;10562:39;9610:997;-1:-1:-1;;;;;9610:997:1:o;10612:205::-;10812:3;10803:14::o;10822:203::-;-1:-1:-1;;;;;10986:32:1;;;;10968:51;;10956:2;10941:18;;10923:102::o;11030:490::-;-1:-1:-1;;;;;11299:15:1;;;11281:34;;11351:15;;11346:2;11331:18;;11324:43;11398:2;11383:18;;11376:34;;;11446:3;11441:2;11426:18;;11419:31;;;11030:490;;11467:47;;11494:19;;11486:6;11467:47;:::i;:::-;11459:55;11233:287;-1:-1:-1;;;;;;11233:287:1:o;11525:274::-;-1:-1:-1;;;;;11717:32:1;;;;11699:51;;11781:2;11766:18;;11759:34;11687:2;11672:18;;11654:145::o;11804:291::-;;11999:2;11988:9;11981:21;12019:70;12085:2;12074:9;12070:18;12062:6;12019:70;:::i;12100:501::-;;12373:2;12362:9;12355:21;12399:70;12465:2;12454:9;12450:18;12442:6;12399:70;:::i;:::-;12517:9;12509:6;12505:22;12500:2;12489:9;12485:18;12478:50;12545;12588:6;12580;12545:50;:::i;12606:267::-;;12785:2;12774:9;12767:21;12805:62;12863:2;12852:9;12848:18;12840:6;12805:62;:::i;12878:187::-;13043:14;;13036:22;13018:41;;13006:2;12991:18;;12973:92::o;13070:431::-;13302:14;;13295:22;13277:41;;13361:14;;13354:22;13349:2;13334:18;;13327:50;13420:14;13413:22;13408:2;13393:18;;13386:50;13479:14;13472:22;13467:2;13452:18;;13445:50;13264:3;13249:19;;13231:270::o;13506:177::-;13652:25;;;13640:2;13625:18;;13607:76::o;13688:221::-;;13837:2;13826:9;13819:21;13857:46;13899:2;13888:9;13884:18;13876:6;13857:46;:::i;13914:398::-;14116:2;14098:21;;;14155:2;14135:18;;;14128:30;14194:34;14189:2;14174:18;;14167:62;-1:-1:-1;;;14260:2:1;14245:18;;14238:32;14302:3;14287:19;;14088:224::o;14317:340::-;14519:2;14501:21;;;14558:2;14538:18;;;14531:30;-1:-1:-1;;;14592:2:1;14577:18;;14570:46;14648:2;14633:18;;14491:166::o;14662:402::-;14864:2;14846:21;;;14903:2;14883:18;;;14876:30;14942:34;14937:2;14922:18;;14915:62;-1:-1:-1;;;15008:2:1;14993:18;;14986:36;15054:3;15039:19;;14836:228::o;15069:406::-;15271:2;15253:21;;;15310:2;15290:18;;;15283:30;15349:34;15344:2;15329:18;;15322:62;-1:-1:-1;;;15415:2:1;15400:18;;15393:40;15465:3;15450:19;;15243:232::o;15480:354::-;15682:2;15664:21;;;15721:2;15701:18;;;15694:30;15760:32;15755:2;15740:18;;15733:60;15825:2;15810:18;;15654:180::o;15839:399::-;16041:2;16023:21;;;16080:2;16060:18;;;16053:30;16119:34;16114:2;16099:18;;16092:62;-1:-1:-1;;;16185:2:1;16170:18;;16163:33;16228:3;16213:19;;16013:225::o;16243:401::-;16445:2;16427:21;;;16484:2;16464:18;;;16457:30;16523:34;16518:2;16503:18;;16496:62;-1:-1:-1;;;16589:2:1;16574:18;;16567:35;16634:3;16619:19;;16417:227::o;16649:397::-;16851:2;16833:21;;;16890:2;16870:18;;;16863:30;16929:34;16924:2;16909:18;;16902:62;-1:-1:-1;;;16995:2:1;16980:18;;16973:31;17036:3;17021:19;;16823:223::o;17051:421::-;17253:2;17235:21;;;17292:2;17272:18;;;17265:30;17331:34;17326:2;17311:18;;17304:62;17402:27;17397:2;17382:18;;17375:55;17462:3;17447:19;;17225:247::o;17477:348::-;17679:2;17661:21;;;17718:2;17698:18;;;17691:30;17757:26;17752:2;17737:18;;17730:54;17816:2;17801:18;;17651:174::o;17830:407::-;18032:2;18014:21;;;18071:2;18051:18;;;18044:30;18110:34;18105:2;18090:18;;18083:62;-1:-1:-1;;;18176:2:1;18161:18;;18154:41;18227:3;18212:19;;18004:233::o;18242:402::-;18444:2;18426:21;;;18483:2;18463:18;;;18456:30;18522:34;18517:2;18502:18;;18495:62;-1:-1:-1;;;18588:2:1;18573:18;;18566:36;18634:3;18619:19;;18416:228::o;18649:356::-;18851:2;18833:21;;;18870:18;;;18863:30;18929:34;18924:2;18909:18;;18902:62;18996:2;18981:18;;18823:182::o;19010:336::-;19212:2;19194:21;;;19251:2;19231:18;;;19224:30;-1:-1:-1;;;19285:2:1;19270:18;;19263:42;19337:2;19322:18;;19184:162::o;19351:350::-;19553:2;19535:21;;;19592:2;19572:18;;;19565:30;19631:28;19626:2;19611:18;;19604:56;19692:2;19677:18;;19525:176::o;19706:414::-;19908:2;19890:21;;;19947:2;19927:18;;;19920:30;19986:34;19981:2;19966:18;;19959:62;-1:-1:-1;;;20052:2:1;20037:18;;20030:48;20110:3;20095:19;;19880:240::o;20125:346::-;20327:2;20309:21;;;20366:2;20346:18;;;20339:30;-1:-1:-1;;;20400:2:1;20385:18;;20378:52;20462:2;20447:18;;20299:172::o;20476:354::-;20678:2;20660:21;;;20717:2;20697:18;;;20690:30;20756:32;20751:2;20736:18;;20729:60;20821:2;20806:18;;20650:180::o;20835:338::-;21037:2;21019:21;;;21076:2;21056:18;;;21049:30;-1:-1:-1;;;21110:2:1;21095:18;;21088:44;21164:2;21149:18;;21009:164::o;21178:354::-;21380:2;21362:21;;;21419:2;21399:18;;;21392:30;21458:32;21453:2;21438:18;;21431:60;21523:2;21508:18;;21352:180::o;21537:398::-;21739:2;21721:21;;;21778:2;21758:18;;;21751:30;21817:34;21812:2;21797:18;;21790:62;-1:-1:-1;;;21883:2:1;21868:18;;21861:32;21925:3;21910:19;;21711:224::o;21940:345::-;22142:2;22124:21;;;22181:2;22161:18;;;22154:30;-1:-1:-1;;;22215:2:1;22200:18;;22193:51;22276:2;22261:18;;22114:171::o;22290:339::-;22492:2;22474:21;;;22531:2;22511:18;;;22504:30;-1:-1:-1;;;22565:2:1;22550:18;;22543:45;22620:2;22605:18;;22464:165::o;22634:415::-;22836:2;22818:21;;;22875:2;22855:18;;;22848:30;22914:34;22909:2;22894:18;;22887:62;-1:-1:-1;;;22980:2:1;22965:18;;22958:49;23039:3;23024:19;;22808:241::o;23054:353::-;23256:2;23238:21;;;23295:2;23275:18;;;23268:30;23334:31;23329:2;23314:18;;23307:59;23398:2;23383:18;;23228:179::o;23412:348::-;23614:2;23596:21;;;23653:2;23633:18;;;23626:30;23692:26;23687:2;23672:18;;23665:54;23751:2;23736:18;;23586:174::o;23765:397::-;23967:2;23949:21;;;24006:2;23986:18;;;23979:30;24045:34;24040:2;24025:18;;24018:62;-1:-1:-1;;;24111:2:1;24096:18;;24089:31;24152:3;24137:19;;23939:223::o;24167:330::-;24369:2;24351:21;;;24408:1;24388:18;;;24381:29;-1:-1:-1;;;24441:2:1;24426:18;;24419:37;24488:2;24473:18;;24341:156::o;24502:410::-;24704:2;24686:21;;;24743:2;24723:18;;;24716:30;24782:34;24777:2;24762:18;;24755:62;-1:-1:-1;;;24848:2:1;24833:18;;24826:44;24902:3;24887:19;;24676:236::o;24917:355::-;25119:2;25101:21;;;25158:2;25138:18;;;25131:30;25197:33;25192:2;25177:18;;25170:61;25263:2;25248:18;;25091:181::o;25277:341::-;25479:2;25461:21;;;25518:2;25498:18;;;25491:30;-1:-1:-1;;;25552:2:1;25537:18;;25530:47;25609:2;25594:18;;25451:167::o;25623:411::-;25825:2;25807:21;;;25864:2;25844:18;;;25837:30;25903:34;25898:2;25883:18;;25876:62;-1:-1:-1;;;25969:2:1;25954:18;;25947:45;26024:3;26009:19;;25797:237::o;26039:339::-;26241:2;26223:21;;;26280:2;26260:18;;;26253:30;-1:-1:-1;;;26314:2:1;26299:18;;26292:45;26369:2;26354:18;;26213:165::o;26383:409::-;26585:2;26567:21;;;26624:2;26604:18;;;26597:30;26663:34;26658:2;26643:18;;26636:62;-1:-1:-1;;;26729:2:1;26714:18;;26707:43;26782:3;26767:19;;26557:235::o;26797:398::-;26999:2;26981:21;;;27038:2;27018:18;;;27011:30;27077:34;27072:2;27057:18;;27050:62;-1:-1:-1;;;27143:2:1;27128:18;;27121:32;27185:3;27170:19;;26971:224::o;27382:275::-;27453:2;27447:9;27518:2;27499:13;;-1:-1:-1;;27495:27:1;27483:40;;27553:18;27538:34;;27574:22;;;27535:62;27532:2;;;27600:18;;:::i;:::-;27636:2;27629:22;27427:230;;-1:-1:-1;27427:230:1:o;27662:129::-;;27730:17;;;27780:4;27764:21;;;27720:71::o;27796:253::-;;-1:-1:-1;;;;;27925:2:1;27922:1;27918:10;27955:2;27952:1;27948:10;27986:3;27982:2;27978:12;27973:3;27970:21;27967:2;;;27994:18;;:::i;:::-;28030:13;;27844:205;-1:-1:-1;;;;27844:205:1:o;28054:128::-;;28125:1;28121:6;28118:1;28115:13;28112:2;;;28131:18;;:::i;:::-;-1:-1:-1;28167:9:1;;28102:80::o;28187:120::-;;28253:1;28243:2;;28258:18;;:::i;:::-;-1:-1:-1;28292:9:1;;28233:74::o;28312:168::-;;28418:1;28414;28410:6;28406:14;28403:1;28400:21;28395:1;28388:9;28381:17;28377:45;28374:2;;;28425:18;;:::i;:::-;-1:-1:-1;28465:9:1;;28364:116::o;28485:246::-;;-1:-1:-1;;;;;28638:10:1;;;;28608;;28660:12;;;28657:2;;;28675:18;;:::i;:::-;28712:13;;28534:197;-1:-1:-1;;;28534:197:1:o;28736:125::-;;28804:1;28801;28798:8;28795:2;;;28809:18;;:::i;:::-;-1:-1:-1;28846:9:1;;28785:76::o;28866:258::-;28938:1;28948:113;28962:6;28959:1;28956:13;28948:113;;;29038:11;;;29032:18;29019:11;;;29012:39;28984:2;28977:10;28948:113;;;29079:6;29076:1;29073:13;29070:2;;;-1:-1:-1;;29114:1:1;29096:16;;29089:27;28919:205::o;29129:136::-;;29196:5;29186:2;;29205:18;;:::i;:::-;-1:-1:-1;;;29241:18:1;;29176:89::o;29270:380::-;29355:1;29345:12;;29402:1;29392:12;;;29413:2;;29467:4;29459:6;29455:17;29445:27;;29413:2;29520;29512:6;29509:14;29489:18;29486:38;29483:2;;;29566:10;29561:3;29557:20;29554:1;29547:31;29601:4;29598:1;29591:15;29629:4;29626:1;29619:15;29483:2;;29325:325;;;:::o;29655:135::-;;-1:-1:-1;;29715:17:1;;29712:2;;;29735:18;;:::i;:::-;-1:-1:-1;29782:1:1;29771:13;;29702:88::o;29795:112::-;;29853:1;29843:2;;29858:18;;:::i;:::-;-1:-1:-1;29892:9:1;;29833:74::o;29912:127::-;29973:10;29968:3;29964:20;29961:1;29954:31;30004:4;30001:1;29994:15;30028:4;30025:1;30018:15;30044:127;30105:10;30100:3;30096:20;30093:1;30086:31;30136:4;30133:1;30126:15;30160:4;30157:1;30150:15;30176:127;30237:10;30232:3;30228:20;30225:1;30218:31;30268:4;30265:1;30258:15;30292:4;30289:1;30282:15;30308:133;-1:-1:-1;;;;;30385:31:1;;30375:42;;30365:2;;30431:1;30428;30421:12;30446:133;-1:-1:-1;;;;;;30522:32:1;;30512:43;;30502:2;;30569:1;30566;30559:12

Swarm Source

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