ETH Price: $3,379.29 (+1.51%)
Gas: 3.63 Gwei

Token

Timith (TIMITH)
 

Overview

Max Total Supply

245 TIMITH

Holders

96

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
poorpoor.eth
Balance
1 TIMITH
0x6f96A08D5CCFE4c9712670dC17a0118441CC621d
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:
Timith

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 250 runs

Other Settings:
default evmVersion, MIT license
File 1 of 12 : Timith.sol
// SPDX-License-Identifier: MIT

/*
__/\\\\\\\\\\\\\\\__/\\\\\\\\\\\__/\\\\____________/\\\\__/\\\\\\\\\\\__/\\\\\\\\\\\\\\\__/\\\________/\\\_        
 _\///////\\\/////__\/////\\\///__\/\\\\\\________/\\\\\\_\/////\\\///__\///////\\\/////__\/\\\_______\/\\\_       
  _______\/\\\___________\/\\\_____\/\\\//\\\____/\\\//\\\_____\/\\\___________\/\\\_______\/\\\_______\/\\\_      
   _______\/\\\___________\/\\\_____\/\\\\///\\\/\\\/_\/\\\_____\/\\\___________\/\\\_______\/\\\\\\\\\\\\\\\_     
    _______\/\\\___________\/\\\_____\/\\\__\///\\\/___\/\\\_____\/\\\___________\/\\\_______\/\\\/////////\\\_    
     _______\/\\\___________\/\\\_____\/\\\____\///_____\/\\\_____\/\\\___________\/\\\_______\/\\\_______\/\\\_   
      _______\/\\\___________\/\\\_____\/\\\_____________\/\\\_____\/\\\___________\/\\\_______\/\\\_______\/\\\_  
       _______\/\\\________/\\\\\\\\\\\_\/\\\_____________\/\\\__/\\\\\\\\\\\_______\/\\\_______\/\\\_______\/\\\_ 
        _______\///________\///////////__\///______________\///__\///////////________\///________\///________\///__
*/
pragma solidity >=0.8.0 <0.9.0;

import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/Counters.sol";

import "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import "erc721a/contracts/ERC721A.sol";
import "operator-filter-registry/src/DefaultOperatorFilterer.sol";

contract Timith is ERC721A, Ownable, ReentrancyGuard, DefaultOperatorFilterer {
  event MonthlyMinted(uint256 _id, uint256 _expiredTime);
  event LifetimeMinted(uint256 _id);
  event TokenRenewed(uint256 _id, uint256 _expiredTime);
  event TokenLocked(uint256 _id, address _receiver);

  using Strings for uint;
  using Counters for Counters.Counter;
  Counters.Counter public lifetimeMinted;
  Counters.Counter public monthlyMinted;
  struct MintInfo {
    uint256 price;
    uint256 supply;
    bool paused;
  }

  struct RenewalDiscount {
    bytes32 root;
    uint256 discount;
    bool valid;
  }

  struct LockInfo {
    bool locked;
    address receiver;
  }

  enum Phases {
    None,
    Partner,
    Whitelist,
    Public,
    Waitlist
  }

  enum TokenType {
    Monthly,
    Lifetime
  }

  bytes32 public partnerMerkleRoot;
  bytes32 public whitelistMerkleRoot;
  bytes32 public waitlistMerkleRoot;

  string private _tokenURI;

  address private dev = address(0);
  uint256 public renewPrice = 0.1 ether;

  Phases public currentPhase = Phases.None;

  bool public renewalsPaused = false;
  bool public transfersPaused = false;

  mapping(bytes32 => RenewalDiscount) public renewalDiscount;

  mapping(address => bool) public lifetimeEligible;

  mapping(address => bool) public hasMinted;
  mapping(uint256 => uint256) public expiryTime;
  mapping(uint256 => bool) private isLifetime;

  mapping(TokenType => MintInfo) public mintingInfo;
  mapping(uint256 => LockInfo) public lockedTokens;

  constructor() ERC721A("Timith", "TIMITH") {
    mintingInfo[TokenType.Monthly] = MintInfo(0.4 ether, 800, true);
    mintingInfo[TokenType.Lifetime] = MintInfo(1.5 ether, 200, true);

    _tokenURI = "https://timith.io/api/metadata/";
  }

  /**
   *
   *
   * MODIFIERS
   *
   */
  modifier onlyOwnerOrDev() {
    if (dev == address(0)) {
      require(_msgSender() == owner(), "Must be the owner");
    } else {
      require(_msgSender() == owner() || _msgSender() == dev, "Must be the owner or the dev");
    }
    _;
  }

  modifier callerIsUser() {
    require(tx.origin == _msgSender(), "The caller is another contract");
    _;
  }

  modifier lockCheck(uint256 tokenId, address _to) {
    if (lockedTokens[tokenId].locked && lockedTokens[tokenId].receiver != address(0)) {
      require(lockedTokens[tokenId].receiver == _to, "Token is locked. Contact owner in https://discord.gg/timith");
    }
    _;
  }

  modifier validateRenewPrice(bytes32 _key, bytes32[] calldata _proof) {
    if (_key == bytes32(0)) {
      require(msg.value == renewPrice, "Must send equal renew price");
      _;
    } else {
      RenewalDiscount storage discount = renewalDiscount[_key];
      require(discount.valid, "Discount is no longer valid");

      bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
      require(MerkleProof.verify(_proof, discount.root, leaf), "You don't have access to this discount");
      require(msg.value == ((renewPrice * discount.discount) / 10000), "Must send equal renew price");
      _;
    }
  }

  modifier validateRenewToken(uint256 _tokenId) {
    require(!renewalsPaused, "The renewals are paused");
    require(_exists(_tokenId), "This token does not exist");
    require(!checkIfLifetime(_tokenId), "This token is a lifetime subscription");
    _;
  }

  modifier phaseLogicCheck(Phases _phase, bytes32[] calldata _merkleProof) {
    if (currentPhase == Phases.None) revert("You cannot mint during this phase");

    if (currentPhase == Phases.Public) {
      _;
    }

    if (_phase == Phases.Partner) {
      bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
      require(MerkleProof.verify(_merkleProof, partnerMerkleRoot, leaf), "Invalid Partner proof!");
      _;
    } else if (_phase == Phases.Whitelist) {
      bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
      require(MerkleProof.verify(_merkleProof, whitelistMerkleRoot, leaf), "Invalid Whitelist proof!");
      _;
    } else if (_phase == Phases.Waitlist) {
      bytes32 leaf = keccak256(abi.encodePacked(_msgSender()));
      require(MerkleProof.verify(_merkleProof, waitlistMerkleRoot, leaf), "Invalid Waitlist proof!");
      _;
    } else {
      revert("Not Eligible");
    }
  }

  modifier mintPriceCheck(TokenType _tokenType) {
    require(msg.value == mintingInfo[_tokenType].price, "Must send correct price");
    _;
  }

  modifier isAbleToMintLifetime() {
    require(!mintingInfo[TokenType.Lifetime].paused, "Lifetime Minting is Paused");
    require(!hasMinted[_msgSender()], "This wallet has already minted");
    require(lifetimeEligible[_msgSender()], "You are not eligable to mint lifetime");
    _;
  }

  modifier isAbleToMintMonthly() {
    require(!mintingInfo[TokenType.Monthly].paused, "Monthly Minting is Paused");
    require(!hasMinted[_msgSender()], "This wallet has already minted");
    _;
  }

  modifier lifetimeSupplyCheck() {
    lifetimeMinted.increment();
    require(lifetimeMinted.current() <= mintingInfo[TokenType.Lifetime].supply, "Lifetime supply has been minted");
    _;
  }

  modifier monthlySupplyCheck() {
    monthlyMinted.increment();
    require(monthlyMinted.current() <= mintingInfo[TokenType.Monthly].supply, "Monthly supply has been minted");
    _;
  }

  /**
   *
   *
   * Owner Functions
   *
   */
  function random() internal view returns (bytes32) {
    return keccak256(abi.encodePacked(tx.origin, blockhash(block.number - 1), block.timestamp));
  }

  function createDiscount(RenewalDiscount memory discount) public onlyOwner returns (bytes32) {
    bytes32 randKey = random();

    renewalDiscount[randKey] = discount;
    return randKey;
  }

  function removeDiscount(bytes32 key) public onlyOwner {
    renewalDiscount[key].valid = false;
  }

  function vaultMint() public onlyOwner {
    require((lifetimeMinted.current() + 150) <= mintingInfo[TokenType.Lifetime].supply, "Will exceed supply");
    _safeMint(owner(), 150);
    lifetimeMinted._value += 150;
  }

  function setMerkleRoot(Phases _phase, bytes32 _merkleRoot) public onlyOwner {
    if (Phases.Partner == _phase) {
      partnerMerkleRoot = _merkleRoot;
    }
    if (Phases.Whitelist == _phase) {
      whitelistMerkleRoot = _merkleRoot;
    }
    if (Phases.Waitlist == _phase) {
      waitlistMerkleRoot = _merkleRoot;
    }
  }

  function addLifetimeEligibleWallets(address[] calldata _addresses) public onlyOwner {
    for (uint256 i = 0; i < _addresses.length; i++) {
      lifetimeEligible[_addresses[i]] = true;
    }
  }

  function removeLifetimeEligibleWallets(address[] calldata _addresses) public onlyOwner {
    for (uint256 i = 0; i < _addresses.length; i++) {
      lifetimeEligible[_addresses[i]] = false;
    }
  }

  function setPhase(Phases _phase) public onlyOwner {
    require(_phase != currentPhase, "Choose a different phase");
    currentPhase = _phase;
  }

  function getDevWallet() public view onlyOwner returns (address) {
    return dev;
  }

  function withdrawBalance() public onlyOwner {
    payable(_msgSender()).transfer(address(this).balance);
  }

  function setDevWallet(address _devWallet) public onlyOwner returns (address) {
    require(_devWallet != address(0), "Address must no be zero");
    dev = _devWallet;
    return _devWallet;
  }

  function setRenewPrice(uint256 _renewPrice) public onlyOwner returns (uint256) {
    require(renewPrice != _renewPrice, "Pick a different renew Price");
    renewPrice = _renewPrice;
    return _renewPrice;
  }

  function updateMintSupply(TokenType _type, uint256 _supply) public onlyOwner {
    require(mintingInfo[_type].supply != _supply, "Pick a different Supply");
    mintingInfo[_type].supply = _supply;
  }

  function updateMintPauseStatus(TokenType _type, bool _paused) public onlyOwner {
    mintingInfo[_type].paused = _paused;
  }

  function updateMintPrice(TokenType _type, uint256 _price) public onlyOwner {
    mintingInfo[_type].price = _price;
  }

  function setTokenURI(string calldata _newURI) external onlyOwner {
    _tokenURI = _newURI;
  }

  function onlyOwnerMintLifetime(address _receiver) public onlyOwner lifetimeSupplyCheck {
    mint(_receiver, TokenType.Lifetime);
  }

  function onlyOwnerMintMonthly(address _receiver) public onlyOwner monthlySupplyCheck {
    mint(_receiver, TokenType.Monthly);
  }

  function ownerBatchMintMonthly(address[] calldata _addresses) public onlyOwner {
    uint256 quantity = _addresses.length;
    for (uint256 i = 0; i < quantity; ) {
      onlyOwnerMintMonthly(_addresses[i]);
      unchecked {
        ++i;
      }
    }
  }

  function ownerBatchMintLifetime(address[] calldata _addresses) public onlyOwner {
    uint256 quantity = _addresses.length;
    for (uint256 i = 0; i < quantity; ) {
      onlyOwnerMintMonthly(_addresses[i]);
      unchecked {
        ++i;
      }
    }
  }

  function ownerRenewToken(uint256 _tokenId) public onlyOwnerOrDev {
    require(_exists(_tokenId), "This token does not exist");
    require(!checkIfLifetime(_tokenId), "This token is a lifetime subscription");

    _renewToken(_tokenId);
  }

  function ownerBatchRenewToken(uint256[] calldata _batchIds) public onlyOwnerOrDev {
    uint256 tokenIds = _batchIds.length;
    uint256 i = 0;
    for (i; i < tokenIds; ) {
      ownerRenewToken(_batchIds[i]);
      unchecked {
        ++i;
      }
    }
  }

  /**
   * Pausing renewals are less impactful, but we are keeping pause transfers to be the owner
   */

  function pauseRenewals(bool _paused) external onlyOwnerOrDev returns (bool) {
    renewalsPaused = _paused;
    return _paused;
  }

  function pauseTransfers(bool _paused) external onlyOwner returns (bool) {
    transfersPaused = _paused;
    return _paused;
  }

  function revokeDev() public onlyOwner {
    dev = address(0);
  }

  function lockToken(uint256 _tokenId, address _receiver) public onlyOwnerOrDev {
    require(_receiver != address(0), "Receiver must not be zero address");
    lockedTokens[_tokenId] = LockInfo(true, _receiver);
    emit TokenLocked(_tokenId, _receiver);
  }

  function unLockToken(uint256 _tokenId) public onlyOwnerOrDev {
    lockedTokens[_tokenId] = LockInfo(false, address(0));
    emit TokenLocked(_tokenId, address(0));
  }

  function checkIfLifetime(uint256 _tokenId) public view returns (bool) {
    require(_exists(_tokenId), "Token does not exist");
    return _tokenId <= 150 ? true : isLifetime[_tokenId];
  }

  /**
   *
   *
   * Minting Logic
   *
   */

  function mint(address _receiver, TokenType _tokenType) private {
    uint256 id = _nextTokenId();

    _mintToken(_tokenType, _receiver, id);
  }

  function mint(TokenType _tokenType) private {
    uint256 id = _nextTokenId();

    _mintToken(_tokenType, _msgSender(), id);
  }

  function _mintToken(TokenType _tokenType, address _receiver, uint256 id) private {
    _safeMint(_receiver, 1);
    hasMinted[_receiver] = true;

    if (TokenType.Lifetime == _tokenType) {
      isLifetime[id] = true;
      emit LifetimeMinted(id);
    } else {
      expiryTime[id] = block.timestamp + 30 days;
      emit MonthlyMinted(id, expiryTime[id]);
    }
  }

  function mintMonthly(
    Phases _phase,
    bytes32[] calldata proof
  ) public payable callerIsUser nonReentrant phaseLogicCheck(_phase, proof) mintPriceCheck(TokenType.Monthly) isAbleToMintMonthly monthlySupplyCheck {
    mint(TokenType.Monthly);
  }

  function mintLifetime(
    Phases _phase,
    bytes32[] calldata proof
  ) public payable callerIsUser nonReentrant phaseLogicCheck(_phase, proof) mintPriceCheck(TokenType.Lifetime) isAbleToMintLifetime lifetimeSupplyCheck {
    mint(TokenType.Lifetime);
  }

  /**
   *
   * Renew Logic
   *
   */

  function _renewToken(uint256 _tokenId) private {
    bool tokenExpired = block.timestamp > expiryTime[_tokenId];

    if (tokenExpired) {
      expiryTime[_tokenId] = block.timestamp + 30 days;
    } else {
      expiryTime[_tokenId] += 30 days;
    }
    emit TokenRenewed(_tokenId, expiryTime[_tokenId]);
  }

  function renewToken(
    uint256 _tokenId,
    bytes32 _key,
    bytes32[] calldata _proof
  ) public payable callerIsUser validateRenewToken(_tokenId) validateRenewPrice(_key, _proof) {
    _renewToken(_tokenId);
  }

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

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

  /**
   *
   * OS Required Overrides
   *
   */

  function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
    super.setApprovalForAll(operator, approved);
  }

  function approve(address operator, uint256 tokenId) public payable override onlyAllowedOperatorApproval(operator) {
    super.approve(operator, tokenId);
  }

  function transferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) lockCheck(tokenId, to) {
    require(!transfersPaused, "Transfers are paused");
    super.transferFrom(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId) public payable override onlyAllowedOperator(from) lockCheck(tokenId, to) {
    require(!transfersPaused, "Transfers are paused");
    super.safeTransferFrom(from, to, tokenId);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory data
  ) public payable override onlyAllowedOperator(from) lockCheck(tokenId, to) {
    require(!transfersPaused, "Transfers are paused");
    super.safeTransferFrom(from, to, tokenId, data);
  }
}

File 2 of 12 : DefaultOperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {OperatorFilterer} from "./OperatorFilterer.sol";

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

File 3 of 12 : ERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import './IERC721A.sol';

/**
 * @dev Interface of ERC721 token receiver.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a `--via-ir` bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant _BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant _BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant _BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant _BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant _BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITMASK_NEXT_INITIALIZED = 1 << 225;

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`.
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum `quantity` that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The `Transfer` event signature is given by:
    // `keccak256(bytes("Transfer(address,address,uint256)"))`.
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID to be minted.
    uint256 private _currentIndex;

    // The number of tokens burned.
    uint256 private _burnCounter;

    // 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 {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @dev Returns the starting token ID.
     * To change the starting token ID, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view virtual returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view virtual returns (uint256) {
        // Counter underflow is impossible as `_currentIndex` does not decrement,
        // and it is initialized to `_startTokenId()`.
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_MINTED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> _BITPOS_NUMBER_BURNED) & _BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

    /**
     * @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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal virtual {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // `owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags`.
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the `nextInitialized` flag set if `quantity` equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the `nextInitialized` flag.
        assembly {
            // `(quantity == 1) << _BITPOS_NEXT_INITIALIZED`.
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

        if (_msgSenderERC721A() != owner)
            if (!isApprovedForAll(owner, _msgSenderERC721A())) {
                revert ApprovalCallerNotOwnerNorApproved();
            }

        _tokenApprovals[tokenId].value = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether `msgSender` is equal to `approvedAddress` or `owner`.
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // `msgSender == owner || msgSender == approvedAddress`.
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of `tokenId`.
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId].value`.
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token IDs
     * are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * `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`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    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.
     * And also called after one token has been burned.
     *
     * `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` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the `Transfer` event for gas savings.
            // The duplicated `log4` removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask `to` to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the `Transfer` event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // `address(0)`.
                    toMasked, // `to`.
                    startTokenId // `tokenId`.
                )

                // The `iszero(eq(,))` check ensures that large values of `quantity`
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the `iszero` away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the `Transfer` event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        address from = address(uint160(prevOwnershipPacked));

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to `delete _tokenApprovals[tokenId]`.
                sstore(approvedAddressSlot, 0)
            }
        }

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & _BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data `index`.
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast `extraData` with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

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

File 4 of 12 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 5 of 12 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// 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;
    }
}

File 6 of 12 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

    /**
     * @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);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

File 7 of 12 : Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 8 of 12 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree 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.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
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 Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle 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++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 9 of 12 : OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol";

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

File 10 of 12 : IOperatorFilterRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

File 11 of 12 : IERC721A.sol
// SPDX-License-Identifier: MIT
// ERC721A Contracts v4.2.3
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the
     * ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

    /**
     * The `quantity` minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The `extraData` cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to `startTimestamp` that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

    // =============================================================
    //                            IERC721
    // =============================================================

    /**
     * @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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers `tokenId` 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 payable;

    /**
     * @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 payable;

    /**
     * @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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @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);

    // =============================================================
    //                        IERC721Metadata
    // =============================================================

    /**
     * @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);

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in `fromTokenId` to `toTokenId`
     * (inclusive) is transferred from `from` to `to`, as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

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

pragma solidity ^0.8.0;

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

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

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 250
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {
    "": {
      "__CACHE_BREAKER__": "0x00000000d41867734bbee4c6863d9255b2b06ac1"
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"LifetimeMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expiredTime","type":"uint256"}],"name":"MonthlyMinted","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":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"address","name":"_receiver","type":"address"}],"name":"TokenLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_expiredTime","type":"uint256"}],"name":"TokenRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"addLifetimeEligibleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"checkIfLifetime","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"internalType":"struct Timith.RenewalDiscount","name":"discount","type":"tuple"}],"name":"createDiscount","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentPhase","outputs":[{"internalType":"enum Timith.Phases","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"expiryTime","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":[],"name":"getDevWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"hasMinted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lifetimeEligible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lifetimeMinted","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"lockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockedTokens","outputs":[{"internalType":"bool","name":"locked","type":"bool"},{"internalType":"address","name":"receiver","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"enum Timith.Phases","name":"_phase","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintLifetime","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum Timith.Phases","name":"_phase","type":"uint8"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintMonthly","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"enum Timith.TokenType","name":"","type":"uint8"}],"name":"mintingInfo","outputs":[{"internalType":"uint256","name":"price","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"bool","name":"paused","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"monthlyMinted","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"onlyOwnerMintLifetime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"onlyOwnerMintMonthly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"ownerBatchMintLifetime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"ownerBatchMintMonthly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_batchIds","type":"uint256[]"}],"name":"ownerBatchRenewToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"ownerRenewToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"partnerMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseRenewals","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"pauseTransfers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"key","type":"bytes32"}],"name":"removeDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removeLifetimeEligibleWallets","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renewPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"bytes32","name":"_key","type":"bytes32"},{"internalType":"bytes32[]","name":"_proof","type":"bytes32[]"}],"name":"renewToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"renewalDiscount","outputs":[{"internalType":"bytes32","name":"root","type":"bytes32"},{"internalType":"uint256","name":"discount","type":"uint256"},{"internalType":"bool","name":"valid","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renewalsPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devWallet","type":"address"}],"name":"setDevWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Timith.Phases","name":"_phase","type":"uint8"},{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Timith.Phases","name":"_phase","type":"uint8"}],"name":"setPhase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_renewPrice","type":"uint256"}],"name":"setRenewPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"transfersPaused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"unLockToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Timith.TokenType","name":"_type","type":"uint8"},{"internalType":"bool","name":"_paused","type":"bool"}],"name":"updateMintPauseStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Timith.TokenType","name":"_type","type":"uint8"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"updateMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Timith.TokenType","name":"_type","type":"uint8"},{"internalType":"uint256","name":"_supply","type":"uint256"}],"name":"updateMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"waitlistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistMerkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052601080546001600160a01b031916905567016345785d8a00006011556012805462ffffff191690553480156200003957600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb66001604051806040016040528060068152602001650a8d2dad2e8d60d31b815250604051806040016040528060068152602001650a8929a92a8960d31b8152508160029080519060200190620000a792919062000402565b508051620000bd90600390602084019062000402565b5050600160005550620000d033620003b0565b60016009556daaeb6d7670e522a718067333cd4e3b156200021a5780156200016857604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200014957600080fd5b505af11580156200015e573d6000803e3d6000fd5b505050506200021a565b6001600160a01b03821615620001b95760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af2903906044016200012e565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b1580156200020057600080fd5b505af115801562000215573d6000803e3d6000fd5b505050505b5050604080516060808201835267058d15e1762800008252610320602080840191825260018486018181526000808052601880855296517f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd75593517f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd855517f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd9805491151560ff19928316179055865194850187526714d1120d7b160000855260c88584019081528588018381529290945294825292517ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4d5590517ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e5590517ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4f805491151591909316179091558151808301909252601f8083527f68747470733a2f2f74696d6974682e696f2f6170692f6d657461646174612f0092909101918252620003a991600f9162000402565b50620004e4565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200041090620004a8565b90600052602060002090601f0160209004810192826200043457600085556200047f565b82601f106200044f57805160ff19168380011785556200047f565b828001600101855582156200047f579182015b828111156200047f57825182559160200191906001019062000462565b506200048d92915062000491565b5090565b5b808211156200048d576000815560010162000492565b600181811c90821680620004bd57607f821691505b602082108103620004de57634e487b7160e01b600052602260045260246000fd5b50919050565b6144a380620004f46000396000f3fe6080604052600436106103b85760003560e01c8063715018a6116101f2578063b88d4fde1161010d578063e0df5b6f116100a0578063f95745bc1161006f578063f95745bc14610b68578063faab3def14610b88578063fb81233d14610ba8578063fbea3a7d14610bc857600080fd5b8063e0df5b6f14610abf578063e985e9c514610adf578063f11aafe114610b28578063f2fde38b14610b4857600080fd5b8063cec1460b116100dc578063cec1460b14610a09578063cf53b44d14610a29578063d854b99114610a40578063dcec329414610a6057600080fd5b8063b88d4fde14610989578063be010c401461099c578063c03afb59146109c9578063c87b56dd146109e957600080fd5b806395d89b4111610185578063a22cb46511610154578063a22cb4651461091d578063a9391fc01461093d578063a94341e414610953578063aa98e0c61461097357600080fd5b806395d89b411461089e57806399bf40da146108b357806399ce8f59146108c95780639cc2faaf1461090857600080fd5b806387a23934116101c157806387a239341461082d5780638b1591001461084d5780638cdf1a5a146108605780638da5cb5b1461088057600080fd5b8063715018a614610789578063795507531461079e5780637dd15c23146107fa5780637de65a7e1461081a57600080fd5b806338e21cce116102e257806354d77e0e116102755780636352211e116102445780636352211e146107095780636b2ba269146107295780636c476a9c1461074957806370a082311461076957600080fd5b806354d77e0e1461069e5780635592d61b146106be5780635fd8c710146106d4578063634315a8146106e957600080fd5b8063453dd97f116102b1578063453dd97f1461062a5780634563f30a1461063f5780634abe2b991461065f57806350fed32a1461067e57600080fd5b806338e21cce146105a55780633d1ed249146105d557806341f43434146105f557806342842e0e1461061757600080fd5b80630e5b9efd1161035a5780632209653611610329578063220965361461053d57806323b872dd1461055d5780632e5cb2e91461057057806332fbbea31461058557600080fd5b80630e5b9efd146104cd57806318160ddd146104ed5780631a9f5c561461050a5780631f53ac021461051d57600080fd5b8063055ad42e11610396578063055ad42e1461043757806306fdde031461045e578063081812fc14610480578063095ea7b3146104b857600080fd5b806301ffc9a7146103bd57806304c05029146103f257806304f7f0e014610412575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004613ade565b610bf8565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b506103dd61040d366004613afb565b610c4a565b34801561041e57600080fd5b50600a546104299081565b6040519081526020016103e9565b34801561044357600080fd5b506012546104519060ff1681565b6040516103e99190613b2a565b34801561046a57600080fd5b50610473610cc5565b6040516103e99190613baa565b34801561048c57600080fd5b506104a061049b366004613afb565b610d57565b6040516001600160a01b0390911681526020016103e9565b6104cb6104c6366004613bd4565b610d9b565b005b3480156104d957600080fd5b506104cb6104e8366004613c0d565b610db4565b3480156104f957600080fd5b506001546000540360001901610429565b6104cb610518366004613c84565b610e83565b34801561052957600080fd5b506104a0610538366004613cd7565b611538565b34801561054957600080fd5b50610429610558366004613d47565b6115bb565b6104cb61056b366004613da9565b61160d565b34801561057c57600080fd5b506104cb61170a565b34801561059157600080fd5b506104296105a0366004613afb565b6117c8565b3480156105b157600080fd5b506103dd6105c0366004613cd7565b60156020526000908152604090205460ff1681565b3480156105e157600080fd5b506104cb6105f0366004613de5565b61182c565b34801561060157600080fd5b506104a06daaeb6d7670e522a718067333cd4e81565b6104cb610625366004613da9565b6118a6565b34801561063657600080fd5b506104a061199b565b34801561064b57600080fd5b506012546103dd9062010000900460ff1681565b34801561066b57600080fd5b506012546103dd90610100900460ff1681565b34801561068a57600080fd5b506104cb610699366004613c0d565b6119b5565b3480156106aa57600080fd5b506104cb6106b9366004613e27565b6119fa565b3480156106ca57600080fd5b5061042960115481565b3480156106e057600080fd5b506104cb611a63565b3480156106f557600080fd5b506104cb610704366004613cd7565b611a9a565b34801561071557600080fd5b506104a0610724366004613afb565b611b38565b34801561073557600080fd5b506104cb610744366004613afb565b611b43565b34801561075557600080fd5b506104cb610764366004613e43565b611c58565b34801561077557600080fd5b50610429610784366004613cd7565b611cae565b34801561079557600080fd5b506104cb611cfd565b3480156107aa57600080fd5b506107dd6107b9366004613e7a565b60186020526000908152604090208054600182015460029092015490919060ff1683565b6040805193845260208401929092521515908201526060016103e9565b34801561080657600080fd5b506104cb610815366004613cd7565b611d11565b6104cb610828366004613e95565b611dae565b34801561083957600080fd5b506104cb610848366004613afb565b6120e0565b6104cb61085b366004613c84565b612103565b34801561086c57600080fd5b506103dd61087b366004613ee8565b6127db565b34801561088c57600080fd5b506008546001600160a01b03166104a0565b3480156108aa57600080fd5b5061047361287c565b3480156108bf57600080fd5b50610429600e5481565b3480156108d557600080fd5b506107dd6108e4366004613afb565b60136020526000908152604090208054600182015460029092015490919060ff1683565b34801561091457600080fd5b506104cb61288b565b34801561092957600080fd5b506104cb610938366004613f05565b6128a5565b34801561094957600080fd5b50610429600c5481565b34801561095f57600080fd5b506104cb61096e366004613de5565b6128b9565b34801561097f57600080fd5b50610429600d5481565b6104cb610997366004613f21565b612933565b3480156109a857600080fd5b506104296109b7366004613afb565b60166020526000908152604090205481565b3480156109d557600080fd5b506104cb6109e4366004613fe1565b612a32565b3480156109f557600080fd5b50610473610a04366004613afb565b612ad7565b348015610a1557600080fd5b506104cb610a24366004613ffc565b612b5b565b348015610a3557600080fd5b50600b546104299081565b348015610a4c57600080fd5b506104cb610a5b366004613de5565b612cda565b348015610a6c57600080fd5b50610aa0610a7b366004613afb565b60196020526000908152604090205460ff81169061010090046001600160a01b031682565b6040805192151583526001600160a01b039091166020830152016103e9565b348015610acb57600080fd5b506104cb610ada366004614028565b612d9c565b348015610aeb57600080fd5b506103dd610afa36600461409a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b3457600080fd5b506103dd610b43366004613ee8565b612db0565b348015610b5457600080fd5b506104cb610b63366004613cd7565b612dd3565b348015610b7457600080fd5b506104cb610b83366004613de5565b612e49565b348015610b9457600080fd5b506104cb610ba3366004613afb565b612e8f565b348015610bb457600080fd5b506104cb610bc3366004613de5565b612f96565b348015610bd457600080fd5b506103dd610be3366004613cd7565b60146020526000908152604090205460ff1681565b60006301ffc9a760e01b6001600160e01b031983161480610c2957506380ac58cd60e01b6001600160e01b03198316145b80610c445750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000610c5582612fc7565b610c9d5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064015b60405180910390fd5b6096821115610cbd5760008281526017602052604090205460ff16610c44565b600192915050565b606060028054610cd4906140c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d00906140c4565b8015610d4d5780601f10610d2257610100808354040283529160200191610d4d565b820191906000526020600020905b815481529060010190602001808311610d3057829003601f168201915b5050505050905090565b6000610d6282612fc7565b610d7f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610da581612ffc565b610daf83836130b5565b505050565b610dbc613155565b8060186000846001811115610dd357610dd3613b14565b6001811115610de457610de4613b14565b81526020019081526020016000206001015403610e435760405162461bcd60e51b815260206004820152601760248201527f5069636b206120646966666572656e7420537570706c790000000000000000006044820152606401610c94565b8060186000846001811115610e5a57610e5a613b14565b6001811115610e6b57610e6b613b14565b81526020810191909152604001600020600101555050565b323314610ed25760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610c94565b600260095403610f245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c94565b6002600955828282600060125460ff166004811115610f4557610f45613b14565b03610f625760405162461bcd60e51b8152600401610c94906140fe565b600360125460ff166004811115610f7b57610f7b613b14565b0361110757600080805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd7543414610fca5760405162461bcd60e51b8152600401610c949061413f565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd95460ff16156110415760405162461bcd60e51b8152602060048201526019602482015278135bdb9d1a1b1e48135a5b9d1a5b99c81a5cc814185d5cd959603a1b6044820152606401610c94565b3360009081526015602052604090205460ff16156110715760405162461bcd60e51b8152600401610c9490614176565b61107f600b80546001019055565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd854600b5411156110fb5760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c7920737570706c7920686173206265656e206d696e74656400006044820152606401610c94565b61110560006131af565b505b600183600481111561111b5761111b613b14565b0361135d5760003360405160200161113391906141ad565b60405160208183030381529060405280519060200120905061118c83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506131bd565b6111d15760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420506172746e65722070726f6f662160501b6044820152606401610c94565b600080805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd754341461121b5760405162461bcd60e51b8152600401610c949061413f565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd95460ff16156112925760405162461bcd60e51b8152602060048201526019602482015278135bdb9d1a1b1e48135a5b9d1a5b99c81a5cc814185d5cd959603a1b6044820152606401610c94565b3360009081526015602052604090205460ff16156112c25760405162461bcd60e51b8152600401610c9490614176565b6112d0600b80546001019055565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd854600b54111561134c5760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c7920737570706c7920686173206265656e206d696e74656400006044820152606401610c94565b61135660006131af565b505061152b565b600283600481111561137157611371613b14565b036114295760003360405160200161138991906141ad565b6040516020818303038152906040528051906020012090506113e283838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490506131bd565b6111d15760405162461bcd60e51b8152602060048201526018602482015277496e76616c69642057686974656c6973742070726f6f662160401b6044820152606401610c94565b600483600481111561143d5761143d613b14565b036114f45760003360405160200161145591906141ad565b6040516020818303038152906040528051906020012090506114ae83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491508490506131bd565b6111d15760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420576169746c6973742070726f6f662160481b6044820152606401610c94565b60405162461bcd60e51b815260206004820152600c60248201526b4e6f7420456c696769626c6560a01b6044820152606401610c94565b5050600160095550505050565b6000611542613155565b6001600160a01b0382166115985760405162461bcd60e51b815260206004820152601760248201527f41646472657373206d757374206e6f206265207a65726f0000000000000000006044820152606401610c94565b50601080546001600160a01b0319166001600160a01b038316179055805b919050565b60006115c5613155565b60006115cf6131d3565b600081815260136020908152604091829020865181559086015160018201559401516002909401805460ff1916941515949094179093555090919050565b826001600160a01b03811633146116275761162733612ffc565b6000828152601960205260409020548290849060ff168015611664575060008281526019602052604090205461010090046001600160a01b031615155b156116a7576000828152601960205260409020546001600160a01b0382811661010090920416146116a75760405162461bcd60e51b8152600401610c94906141ca565b60125462010000900460ff16156116f75760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610c94565b611702868686613228565b505050505050565b611712613155565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a5461174c90609661423d565b111561178f5760405162461bcd60e51b815260206004820152601260248201527157696c6c2065786365656420737570706c7960701b6044820152606401610c94565b6117ab6117a46008546001600160a01b031690565b60966133bd565b6096600a60000160008282546117c1919061423d565b9091555050565b60006117d2613155565b81601154036118235760405162461bcd60e51b815260206004820152601c60248201527f5069636b206120646966666572656e742072656e6577205072696365000000006044820152606401610c94565b50601181905590565b611834613155565b60005b81811015610daf5760006014600085858581811061185757611857614255565b905060200201602081019061186c9190613cd7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061189e8161426b565b915050611837565b826001600160a01b03811633146118c0576118c033612ffc565b6000828152601960205260409020548290849060ff1680156118fd575060008281526019602052604090205461010090046001600160a01b031615155b15611940576000828152601960205260409020546001600160a01b0382811661010090920416146119405760405162461bcd60e51b8152600401610c94906141ca565b60125462010000900460ff16156119905760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610c94565b6117028686866133d7565b60006119a5613155565b506010546001600160a01b031690565b6119bd613155565b80601860008460018111156119d4576119d4613b14565b60018111156119e5576119e5613b14565b81526020810191909152604001600020555050565b611a02613155565b816004811115611a1457611a14613b14565b600103611a2157600c8190555b816004811115611a3357611a33613b14565b600203611a4057600d8190555b816004811115611a5257611a52613b14565b600403611a5f57600e8190555b5050565b611a6b613155565b60405133904780156108fc02916000818181858888f19350505050158015611a97573d6000803e3d6000fd5b50565b611aa2613155565b611ab0600a80546001019055565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a541115611b2d5760405162461bcd60e51b815260206004820152601f60248201527f4c69666574696d6520737570706c7920686173206265656e206d696e746564006044820152606401610c94565b611a978160016133f2565b6000610c4482613400565b6010546001600160a01b0316611b82576008546001600160a01b03163314611b7d5760405162461bcd60e51b8152600401610c9490614284565b611bca565b6008546001600160a01b0316331480611bae57506010546001600160a01b0316336001600160a01b0316145b611bca5760405162461bcd60e51b8152600401610c94906142af565b60408051808201825260008082526020808301828152858352601982528483209351845491516001600160a81b0319909216901515610100600160a81b031916176101006001600160a01b0390921691909102179092558251848152918201527f9ecfd70e9ff36df72989324a49559383d39f9290d700b10cf5ac10dcb68d2643910160405180910390a150565b611c60613155565b8060186000846001811115611c7757611c77613b14565b6001811115611c8857611c88613b14565b81526020810191909152604001600020600201805460ff19169115159190911790555050565b60006001600160a01b038216611cd7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611d05613155565b611d0f600061346f565b565b611d19613155565b611d27600b80546001019055565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd854600b541115611da35760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c7920737570706c7920686173206265656e206d696e74656400006044820152606401610c94565b611a978160006133f2565b323314611dfd5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610c94565b6012548490610100900460ff1615611e575760405162461bcd60e51b815260206004820152601760248201527f5468652072656e6577616c7320617265207061757365640000000000000000006044820152606401610c94565b611e6081612fc7565b611ea85760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81d1bdad95b88191bd95cc81b9bdd08195e1a5cdd603a1b6044820152606401610c94565b611eb181610c4a565b15611ece5760405162461bcd60e51b8152600401610c94906142e6565b83838382611f35576011543414611f275760405162461bcd60e51b815260206004820152601b60248201527f4d7573742073656e6420657175616c2072656e657720707269636500000000006044820152606401610c94565b611f30886134c1565b6120d6565b6000838152601360205260409020600281015460ff16611f975760405162461bcd60e51b815260206004820152601b60248201527f446973636f756e74206973206e6f206c6f6e6765722076616c696400000000006044820152606401610c94565b600033604051602001611faa91906141ad565b60405160208183030381529060405280519060200120905061200284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050855491508490506131bd565b61205d5760405162461bcd60e51b815260206004820152602660248201527f596f7520646f6e277420686176652061636365737320746f20746869732064696044820152651cd8dbdd5b9d60d21b6064820152608401610c94565b6127108260010154601154612072919061432b565b61207c919061434a565b34146120ca5760405162461bcd60e51b815260206004820152601b60248201527f4d7573742073656e6420657175616c2072656e657720707269636500000000006044820152606401610c94565b6120d38a6134c1565b50505b5050505050505050565b6120e8613155565b6000908152601360205260409020600201805460ff19169055565b3233146121525760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610c94565b6002600954036121a45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c94565b6002600955828282600060125460ff1660048111156121c5576121c5613b14565b036121e25760405162461bcd60e51b8152600401610c94906140fe565b600360125460ff1660048111156121fb576121fb613b14565b036123be576001600081905260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4d54341461224c5760405162461bcd60e51b8152600401610c949061413f565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4f5460ff16156122c85760405162461bcd60e51b815260206004820152601a60248201527f4c69666574696d65204d696e74696e67206973205061757365640000000000006044820152606401610c94565b3360009081526015602052604090205460ff16156122f85760405162461bcd60e51b8152600401610c9490614176565b3360009081526014602052604090205460ff166123275760405162461bcd60e51b8152600401610c949061436c565b612335600a80546001019055565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a5411156123b25760405162461bcd60e51b815260206004820152601f60248201527f4c69666574696d6520737570706c7920686173206265656e206d696e746564006044820152606401610c94565b6123bc60016131af565b505b60018360048111156123d2576123d2613b14565b03612644576000336040516020016123ea91906141ad565b60405160208183030381529060405280519060200120905061244383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506131bd565b6124885760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420506172746e65722070726f6f662160501b6044820152606401610c94565b6001600081905260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4d5434146124d45760405162461bcd60e51b8152600401610c949061413f565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4f5460ff16156125505760405162461bcd60e51b815260206004820152601a60248201527f4c69666574696d65204d696e74696e67206973205061757365640000000000006044820152606401610c94565b3360009081526015602052604090205460ff16156125805760405162461bcd60e51b8152600401610c9490614176565b3360009081526014602052604090205460ff166125af5760405162461bcd60e51b8152600401610c949061436c565b6125bd600a80546001019055565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a54111561263a5760405162461bcd60e51b815260206004820152601f60248201527f4c69666574696d6520737570706c7920686173206265656e206d696e746564006044820152606401610c94565b61135660016131af565b600283600481111561265857612658613b14565b036127105760003360405160200161267091906141ad565b6040516020818303038152906040528051906020012090506126c983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490506131bd565b6124885760405162461bcd60e51b8152602060048201526018602482015277496e76616c69642057686974656c6973742070726f6f662160401b6044820152606401610c94565b600483600481111561272457612724613b14565b036114f45760003360405160200161273c91906141ad565b60405160208183030381529060405280519060200120905061279583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491508490506131bd565b6124885760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420576169746c6973742070726f6f662160481b6044820152606401610c94565b6010546000906001600160a01b031661281d576008546001600160a01b031633146128185760405162461bcd60e51b8152600401610c9490614284565b612865565b6008546001600160a01b031633148061284957506010546001600160a01b0316336001600160a01b0316145b6128655760405162461bcd60e51b8152600401610c94906142af565b506012805461ff0019166101008315150217905590565b606060038054610cd4906140c4565b612893613155565b601080546001600160a01b0319169055565b816128af81612ffc565b610daf8383613564565b6128c1613155565b60005b81811015610daf576001601460008585858181106128e4576128e4614255565b90506020020160208101906128f99190613cd7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061292b8161426b565b9150506128c4565b836001600160a01b038116331461294d5761294d33612ffc565b6000838152601960205260409020548390859060ff16801561298a575060008281526019602052604090205461010090046001600160a01b031615155b156129cd576000828152601960205260409020546001600160a01b0382811661010090920416146129cd5760405162461bcd60e51b8152600401610c94906141ca565b60125462010000900460ff1615612a1d5760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610c94565b612a29878787876135d0565b50505050505050565b612a3a613155565b60125460ff166004811115612a5157612a51613b14565b816004811115612a6357612a63613b14565b03612ab05760405162461bcd60e51b815260206004820152601860248201527f43686f6f7365206120646966666572656e7420706861736500000000000000006044820152606401610c94565b6012805482919060ff19166001836004811115612acf57612acf613b14565b021790555050565b6060612ae282612fc7565b612aff57604051630a14c4b560e41b815260040160405180910390fd5b6000612b09613614565b90508051600003612b295760405180602001604052806000815250612b54565b80612b3384613623565b604051602001612b449291906143b1565b6040516020818303038152906040525b9392505050565b6010546001600160a01b0316612b9a576008546001600160a01b03163314612b955760405162461bcd60e51b8152600401610c9490614284565b612be2565b6008546001600160a01b0316331480612bc657506010546001600160a01b0316336001600160a01b0316145b612be25760405162461bcd60e51b8152600401610c94906142af565b6001600160a01b038116612c425760405162461bcd60e51b815260206004820152602160248201527f5265636569766572206d757374206e6f74206265207a65726f206164647265736044820152607360f81b6064820152608401610c94565b604080518082018252600181526001600160a01b0383811660208084018281526000888152601983528690209451855491516001600160a81b0319909216901515610100600160a81b031916176101009190941602929092179092558251858152908101919091527f9ecfd70e9ff36df72989324a49559383d39f9290d700b10cf5ac10dcb68d264391015b60405180910390a15050565b6010546001600160a01b0316612d19576008546001600160a01b03163314612d145760405162461bcd60e51b8152600401610c9490614284565b612d61565b6008546001600160a01b0316331480612d4557506010546001600160a01b0316336001600160a01b0316145b612d615760405162461bcd60e51b8152600401610c94906142af565b8060005b81811015612d9657612d8e848483818110612d8257612d82614255565b90506020020135612e8f565b600101612d65565b50505050565b612da4613155565b610daf600f8383613a2f565b6000612dba613155565b506012805462ff00001916620100008315150217905590565b612ddb613155565b6001600160a01b038116612e405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c94565b611a978161346f565b612e51613155565b8060005b81811015612d9657612e87848483818110612e7257612e72614255565b90506020020160208101906108159190613cd7565b600101612e55565b6010546001600160a01b0316612ece576008546001600160a01b03163314612ec95760405162461bcd60e51b8152600401610c9490614284565b612f16565b6008546001600160a01b0316331480612efa57506010546001600160a01b0316336001600160a01b0316145b612f165760405162461bcd60e51b8152600401610c94906142af565b612f1f81612fc7565b612f675760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81d1bdad95b88191bd95cc81b9bdd08195e1a5cdd603a1b6044820152606401610c94565b612f7081610c4a565b15612f8d5760405162461bcd60e51b8152600401610c94906142e6565b611a97816134c1565b612f9e613155565b8060005b81811015612d9657612fbf848483818110612e7257612e72614255565b600101612fa2565b600081600111158015612fdb575060005482105b8015610c44575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b15611a9757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015613069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308d91906143e0565b611a9757604051633b79c77360e21b81526001600160a01b0382166004820152602401610c94565b60006130c082611b38565b9050336001600160a01b038216146130f9576130dc8133610afa565b6130f9576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314611d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c94565b600054611a5f823383613667565b6000826131ca8584613760565b14949350505050565b6000326131e16001436143fd565b60405160609290921b6bffffffffffffffffffffffff1916602083015240603482015242605482015260740160405160208183030381529060405280519060200120905090565b600061323382613400565b9050836001600160a01b0316816001600160a01b0316146132665760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176132b3576132968633610afa565b6132b357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166132da57604051633a954ecd60e21b815260040160405180910390fd5b80156132e557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003613377576001840160008181526004602052604081205490036133755760005481146133755760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611702565b611a5f8282604051806020016040528060008152506137ad565b610daf83838360405180602001604052806000815250612933565b600054610daf828483613667565b60008180600111613456576000548110156134565760008181526004602052604081205490600160e01b82169003613454575b80600003612b54575060001901600081815260046020526040902054613433565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081815260166020526040902054421180156134f9576134e54262278d0061423d565b600083815260166020526040902055613520565b6000828152601660205260408120805462278d00929061351a90849061423d565b90915550505b600082815260166020908152604091829020548251858152918201527f5a337ee8148efcbebf88dd5350f776d12817849fa06eef6cfd9913cb19a5a08e9101612cce565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6135db84848461160d565b6001600160a01b0383163b15612d96576135f78484848461381a565b612d96576040516368d2bf6b60e11b815260040160405180910390fd5b6060600f8054610cd4906140c4565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061363d5750819003601f19909101908152919050565b6136728260016133bd565b6001600160a01b0382166000908152601560205260409020805460ff1916600190811790915583908111156136a9576136a9613b14565b6001036137085760008181526017602052604090819020805460ff19166001179055517f1a00c29abfc99b376952b253cb19bc011019c9a885f05f7244f27ee829dc629c906136fb9083815260200190565b60405180910390a1505050565b6137154262278d0061423d565b60008281526016602052604090819020829055517f7705e197a138c9fde27b19dc60358ba5ccef4009d3522c5aad04f707493d7021916136fb91849190918252602082015260400190565b600081815b84518110156137a5576137918286838151811061378457613784614255565b6020026020010151613905565b91508061379d8161426b565b915050613765565b509392505050565b6137b78383613931565b6001600160a01b0383163b15610daf576000548281035b6137e1600086838060010194508661381a565b6137fe576040516368d2bf6b60e11b815260040160405180910390fd5b8181106137ce57816000541461381357600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061384f903390899088908890600401614414565b6020604051808303816000875af192505050801561388a575060408051601f3d908101601f1916820190925261388791810190614450565b60015b6138e8573d8080156138b8576040519150601f19603f3d011682016040523d82523d6000602084013e6138bd565b606091505b5080516000036138e0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000818310613921576000828152602084905260409020612b54565b5060009182526020526040902090565b60008054908290036139565760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613a0557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016139cd565b5081600003613a2657604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054613a3b906140c4565b90600052602060002090601f016020900481019282613a5d5760008555613aa3565b82601f10613a765782800160ff19823516178555613aa3565b82800160010185558215613aa3579182015b82811115613aa3578235825591602001919060010190613a88565b50613aaf929150613ab3565b5090565b5b80821115613aaf5760008155600101613ab4565b6001600160e01b031981168114611a9757600080fd5b600060208284031215613af057600080fd5b8135612b5481613ac8565b600060208284031215613b0d57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6020810160058310613b4c57634e487b7160e01b600052602160045260246000fd5b91905290565b60005b83811015613b6d578181015183820152602001613b55565b83811115612d965750506000910152565b60008151808452613b96816020860160208601613b52565b601f01601f19169290920160200192915050565b602081526000612b546020830184613b7e565b80356001600160a01b03811681146115b657600080fd5b60008060408385031215613be757600080fd5b613bf083613bbd565b946020939093013593505050565b8035600281106115b657600080fd5b60008060408385031215613c2057600080fd5b613bf083613bfe565b8035600581106115b657600080fd5b60008083601f840112613c4a57600080fd5b50813567ffffffffffffffff811115613c6257600080fd5b6020830191508360208260051b8501011115613c7d57600080fd5b9250929050565b600080600060408486031215613c9957600080fd5b613ca284613c29565b9250602084013567ffffffffffffffff811115613cbe57600080fd5b613cca86828701613c38565b9497909650939450505050565b600060208284031215613ce957600080fd5b612b5482613bbd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d3157613d31613cf2565b604052919050565b8015158114611a9757600080fd5b600060608284031215613d5957600080fd5b6040516060810181811067ffffffffffffffff82111715613d7c57613d7c613cf2565b806040525082358152602083013560208201526040830135613d9d81613d39565b60408201529392505050565b600080600060608486031215613dbe57600080fd5b613dc784613bbd565b9250613dd560208501613bbd565b9150604084013590509250925092565b60008060208385031215613df857600080fd5b823567ffffffffffffffff811115613e0f57600080fd5b613e1b85828601613c38565b90969095509350505050565b60008060408385031215613e3a57600080fd5b613bf083613c29565b60008060408385031215613e5657600080fd5b613e5f83613bfe565b91506020830135613e6f81613d39565b809150509250929050565b600060208284031215613e8c57600080fd5b612b5482613bfe565b60008060008060608587031215613eab57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613ed057600080fd5b613edc87828801613c38565b95989497509550505050565b600060208284031215613efa57600080fd5b8135612b5481613d39565b60008060408385031215613f1857600080fd5b613e5f83613bbd565b60008060008060808587031215613f3757600080fd5b613f4085613bbd565b93506020613f4f818701613bbd565b935060408601359250606086013567ffffffffffffffff80821115613f7357600080fd5b818801915088601f830112613f8757600080fd5b813581811115613f9957613f99613cf2565b613fab601f8201601f19168501613d08565b91508082528984828501011115613fc157600080fd5b808484018584013760008482840101525080935050505092959194509250565b600060208284031215613ff357600080fd5b612b5482613c29565b6000806040838503121561400f57600080fd5b8235915061401f60208401613bbd565b90509250929050565b6000806020838503121561403b57600080fd5b823567ffffffffffffffff8082111561405357600080fd5b818501915085601f83011261406757600080fd5b81358181111561407657600080fd5b86602082850101111561408857600080fd5b60209290920196919550909350505050565b600080604083850312156140ad57600080fd5b6140b683613bbd565b915061401f60208401613bbd565b600181811c908216806140d857607f821691505b6020821081036140f857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f596f752063616e6e6f74206d696e7420647572696e67207468697320706861736040820152606560f81b606082015260800190565b60208082526017908201527f4d7573742073656e6420636f7272656374207072696365000000000000000000604082015260600190565b6020808252601e908201527f546869732077616c6c65742068617320616c7265616479206d696e7465640000604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6020808252603b908201527f546f6b656e206973206c6f636b65642e20436f6e74616374206f776e6572206960408201527f6e2068747470733a2f2f646973636f72642e67672f74696d6974680000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561425057614250614227565b500190565b634e487b7160e01b600052603260045260246000fd5b60006001820161427d5761427d614227565b5060010190565b60208082526011908201527026bab9ba103132903a34329037bbb732b960791b604082015260600190565b6020808252601c908201527f4d75737420626520746865206f776e6572206f72207468652064657600000000604082015260600190565b60208082526025908201527f5468697320746f6b656e2069732061206c69666574696d652073756273637269604082015264383a34b7b760d91b606082015260800190565b600081600019048311821515161561434557614345614227565b500290565b60008261436757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f596f7520617265206e6f7420656c696761626c6520746f206d696e74206c69666040820152646574696d6560d81b606082015260800190565b600083516143c3818460208801613b52565b8351908301906143d7818360208801613b52565b01949350505050565b6000602082840312156143f257600080fd5b8151612b5481613d39565b60008282101561440f5761440f614227565b500390565b60006001600160a01b038087168352808616602084015250836040830152608060608301526144466080830184613b7e565b9695505050505050565b60006020828403121561446257600080fd5b8151612b5481613ac856fea264697066735822122038b4382e51670fddf0697b4c5f26ba47d22ef11eb1ce4eb0c9c23df8704c89dc64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106103b85760003560e01c8063715018a6116101f2578063b88d4fde1161010d578063e0df5b6f116100a0578063f95745bc1161006f578063f95745bc14610b68578063faab3def14610b88578063fb81233d14610ba8578063fbea3a7d14610bc857600080fd5b8063e0df5b6f14610abf578063e985e9c514610adf578063f11aafe114610b28578063f2fde38b14610b4857600080fd5b8063cec1460b116100dc578063cec1460b14610a09578063cf53b44d14610a29578063d854b99114610a40578063dcec329414610a6057600080fd5b8063b88d4fde14610989578063be010c401461099c578063c03afb59146109c9578063c87b56dd146109e957600080fd5b806395d89b4111610185578063a22cb46511610154578063a22cb4651461091d578063a9391fc01461093d578063a94341e414610953578063aa98e0c61461097357600080fd5b806395d89b411461089e57806399bf40da146108b357806399ce8f59146108c95780639cc2faaf1461090857600080fd5b806387a23934116101c157806387a239341461082d5780638b1591001461084d5780638cdf1a5a146108605780638da5cb5b1461088057600080fd5b8063715018a614610789578063795507531461079e5780637dd15c23146107fa5780637de65a7e1461081a57600080fd5b806338e21cce116102e257806354d77e0e116102755780636352211e116102445780636352211e146107095780636b2ba269146107295780636c476a9c1461074957806370a082311461076957600080fd5b806354d77e0e1461069e5780635592d61b146106be5780635fd8c710146106d4578063634315a8146106e957600080fd5b8063453dd97f116102b1578063453dd97f1461062a5780634563f30a1461063f5780634abe2b991461065f57806350fed32a1461067e57600080fd5b806338e21cce146105a55780633d1ed249146105d557806341f43434146105f557806342842e0e1461061757600080fd5b80630e5b9efd1161035a5780632209653611610329578063220965361461053d57806323b872dd1461055d5780632e5cb2e91461057057806332fbbea31461058557600080fd5b80630e5b9efd146104cd57806318160ddd146104ed5780631a9f5c561461050a5780631f53ac021461051d57600080fd5b8063055ad42e11610396578063055ad42e1461043757806306fdde031461045e578063081812fc14610480578063095ea7b3146104b857600080fd5b806301ffc9a7146103bd57806304c05029146103f257806304f7f0e014610412575b600080fd5b3480156103c957600080fd5b506103dd6103d8366004613ade565b610bf8565b60405190151581526020015b60405180910390f35b3480156103fe57600080fd5b506103dd61040d366004613afb565b610c4a565b34801561041e57600080fd5b50600a546104299081565b6040519081526020016103e9565b34801561044357600080fd5b506012546104519060ff1681565b6040516103e99190613b2a565b34801561046a57600080fd5b50610473610cc5565b6040516103e99190613baa565b34801561048c57600080fd5b506104a061049b366004613afb565b610d57565b6040516001600160a01b0390911681526020016103e9565b6104cb6104c6366004613bd4565b610d9b565b005b3480156104d957600080fd5b506104cb6104e8366004613c0d565b610db4565b3480156104f957600080fd5b506001546000540360001901610429565b6104cb610518366004613c84565b610e83565b34801561052957600080fd5b506104a0610538366004613cd7565b611538565b34801561054957600080fd5b50610429610558366004613d47565b6115bb565b6104cb61056b366004613da9565b61160d565b34801561057c57600080fd5b506104cb61170a565b34801561059157600080fd5b506104296105a0366004613afb565b6117c8565b3480156105b157600080fd5b506103dd6105c0366004613cd7565b60156020526000908152604090205460ff1681565b3480156105e157600080fd5b506104cb6105f0366004613de5565b61182c565b34801561060157600080fd5b506104a06daaeb6d7670e522a718067333cd4e81565b6104cb610625366004613da9565b6118a6565b34801561063657600080fd5b506104a061199b565b34801561064b57600080fd5b506012546103dd9062010000900460ff1681565b34801561066b57600080fd5b506012546103dd90610100900460ff1681565b34801561068a57600080fd5b506104cb610699366004613c0d565b6119b5565b3480156106aa57600080fd5b506104cb6106b9366004613e27565b6119fa565b3480156106ca57600080fd5b5061042960115481565b3480156106e057600080fd5b506104cb611a63565b3480156106f557600080fd5b506104cb610704366004613cd7565b611a9a565b34801561071557600080fd5b506104a0610724366004613afb565b611b38565b34801561073557600080fd5b506104cb610744366004613afb565b611b43565b34801561075557600080fd5b506104cb610764366004613e43565b611c58565b34801561077557600080fd5b50610429610784366004613cd7565b611cae565b34801561079557600080fd5b506104cb611cfd565b3480156107aa57600080fd5b506107dd6107b9366004613e7a565b60186020526000908152604090208054600182015460029092015490919060ff1683565b6040805193845260208401929092521515908201526060016103e9565b34801561080657600080fd5b506104cb610815366004613cd7565b611d11565b6104cb610828366004613e95565b611dae565b34801561083957600080fd5b506104cb610848366004613afb565b6120e0565b6104cb61085b366004613c84565b612103565b34801561086c57600080fd5b506103dd61087b366004613ee8565b6127db565b34801561088c57600080fd5b506008546001600160a01b03166104a0565b3480156108aa57600080fd5b5061047361287c565b3480156108bf57600080fd5b50610429600e5481565b3480156108d557600080fd5b506107dd6108e4366004613afb565b60136020526000908152604090208054600182015460029092015490919060ff1683565b34801561091457600080fd5b506104cb61288b565b34801561092957600080fd5b506104cb610938366004613f05565b6128a5565b34801561094957600080fd5b50610429600c5481565b34801561095f57600080fd5b506104cb61096e366004613de5565b6128b9565b34801561097f57600080fd5b50610429600d5481565b6104cb610997366004613f21565b612933565b3480156109a857600080fd5b506104296109b7366004613afb565b60166020526000908152604090205481565b3480156109d557600080fd5b506104cb6109e4366004613fe1565b612a32565b3480156109f557600080fd5b50610473610a04366004613afb565b612ad7565b348015610a1557600080fd5b506104cb610a24366004613ffc565b612b5b565b348015610a3557600080fd5b50600b546104299081565b348015610a4c57600080fd5b506104cb610a5b366004613de5565b612cda565b348015610a6c57600080fd5b50610aa0610a7b366004613afb565b60196020526000908152604090205460ff81169061010090046001600160a01b031682565b6040805192151583526001600160a01b039091166020830152016103e9565b348015610acb57600080fd5b506104cb610ada366004614028565b612d9c565b348015610aeb57600080fd5b506103dd610afa36600461409a565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610b3457600080fd5b506103dd610b43366004613ee8565b612db0565b348015610b5457600080fd5b506104cb610b63366004613cd7565b612dd3565b348015610b7457600080fd5b506104cb610b83366004613de5565b612e49565b348015610b9457600080fd5b506104cb610ba3366004613afb565b612e8f565b348015610bb457600080fd5b506104cb610bc3366004613de5565b612f96565b348015610bd457600080fd5b506103dd610be3366004613cd7565b60146020526000908152604090205460ff1681565b60006301ffc9a760e01b6001600160e01b031983161480610c2957506380ac58cd60e01b6001600160e01b03198316145b80610c445750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000610c5582612fc7565b610c9d5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064015b60405180910390fd5b6096821115610cbd5760008281526017602052604090205460ff16610c44565b600192915050565b606060028054610cd4906140c4565b80601f0160208091040260200160405190810160405280929190818152602001828054610d00906140c4565b8015610d4d5780601f10610d2257610100808354040283529160200191610d4d565b820191906000526020600020905b815481529060010190602001808311610d3057829003601f168201915b5050505050905090565b6000610d6282612fc7565b610d7f576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b81610da581612ffc565b610daf83836130b5565b505050565b610dbc613155565b8060186000846001811115610dd357610dd3613b14565b6001811115610de457610de4613b14565b81526020019081526020016000206001015403610e435760405162461bcd60e51b815260206004820152601760248201527f5069636b206120646966666572656e7420537570706c790000000000000000006044820152606401610c94565b8060186000846001811115610e5a57610e5a613b14565b6001811115610e6b57610e6b613b14565b81526020810191909152604001600020600101555050565b323314610ed25760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610c94565b600260095403610f245760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c94565b6002600955828282600060125460ff166004811115610f4557610f45613b14565b03610f625760405162461bcd60e51b8152600401610c94906140fe565b600360125460ff166004811115610f7b57610f7b613b14565b0361110757600080805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd7543414610fca5760405162461bcd60e51b8152600401610c949061413f565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd95460ff16156110415760405162461bcd60e51b8152602060048201526019602482015278135bdb9d1a1b1e48135a5b9d1a5b99c81a5cc814185d5cd959603a1b6044820152606401610c94565b3360009081526015602052604090205460ff16156110715760405162461bcd60e51b8152600401610c9490614176565b61107f600b80546001019055565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd854600b5411156110fb5760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c7920737570706c7920686173206265656e206d696e74656400006044820152606401610c94565b61110560006131af565b505b600183600481111561111b5761111b613b14565b0361135d5760003360405160200161113391906141ad565b60405160208183030381529060405280519060200120905061118c83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506131bd565b6111d15760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420506172746e65722070726f6f662160501b6044820152606401610c94565b600080805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd754341461121b5760405162461bcd60e51b8152600401610c949061413f565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd95460ff16156112925760405162461bcd60e51b8152602060048201526019602482015278135bdb9d1a1b1e48135a5b9d1a5b99c81a5cc814185d5cd959603a1b6044820152606401610c94565b3360009081526015602052604090205460ff16156112c25760405162461bcd60e51b8152600401610c9490614176565b6112d0600b80546001019055565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd854600b54111561134c5760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c7920737570706c7920686173206265656e206d696e74656400006044820152606401610c94565b61135660006131af565b505061152b565b600283600481111561137157611371613b14565b036114295760003360405160200161138991906141ad565b6040516020818303038152906040528051906020012090506113e283838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490506131bd565b6111d15760405162461bcd60e51b8152602060048201526018602482015277496e76616c69642057686974656c6973742070726f6f662160401b6044820152606401610c94565b600483600481111561143d5761143d613b14565b036114f45760003360405160200161145591906141ad565b6040516020818303038152906040528051906020012090506114ae83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491508490506131bd565b6111d15760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420576169746c6973742070726f6f662160481b6044820152606401610c94565b60405162461bcd60e51b815260206004820152600c60248201526b4e6f7420456c696769626c6560a01b6044820152606401610c94565b5050600160095550505050565b6000611542613155565b6001600160a01b0382166115985760405162461bcd60e51b815260206004820152601760248201527f41646472657373206d757374206e6f206265207a65726f0000000000000000006044820152606401610c94565b50601080546001600160a01b0319166001600160a01b038316179055805b919050565b60006115c5613155565b60006115cf6131d3565b600081815260136020908152604091829020865181559086015160018201559401516002909401805460ff1916941515949094179093555090919050565b826001600160a01b03811633146116275761162733612ffc565b6000828152601960205260409020548290849060ff168015611664575060008281526019602052604090205461010090046001600160a01b031615155b156116a7576000828152601960205260409020546001600160a01b0382811661010090920416146116a75760405162461bcd60e51b8152600401610c94906141ca565b60125462010000900460ff16156116f75760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610c94565b611702868686613228565b505050505050565b611712613155565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a5461174c90609661423d565b111561178f5760405162461bcd60e51b815260206004820152601260248201527157696c6c2065786365656420737570706c7960701b6044820152606401610c94565b6117ab6117a46008546001600160a01b031690565b60966133bd565b6096600a60000160008282546117c1919061423d565b9091555050565b60006117d2613155565b81601154036118235760405162461bcd60e51b815260206004820152601c60248201527f5069636b206120646966666572656e742072656e6577205072696365000000006044820152606401610c94565b50601181905590565b611834613155565b60005b81811015610daf5760006014600085858581811061185757611857614255565b905060200201602081019061186c9190613cd7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061189e8161426b565b915050611837565b826001600160a01b03811633146118c0576118c033612ffc565b6000828152601960205260409020548290849060ff1680156118fd575060008281526019602052604090205461010090046001600160a01b031615155b15611940576000828152601960205260409020546001600160a01b0382811661010090920416146119405760405162461bcd60e51b8152600401610c94906141ca565b60125462010000900460ff16156119905760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610c94565b6117028686866133d7565b60006119a5613155565b506010546001600160a01b031690565b6119bd613155565b80601860008460018111156119d4576119d4613b14565b60018111156119e5576119e5613b14565b81526020810191909152604001600020555050565b611a02613155565b816004811115611a1457611a14613b14565b600103611a2157600c8190555b816004811115611a3357611a33613b14565b600203611a4057600d8190555b816004811115611a5257611a52613b14565b600403611a5f57600e8190555b5050565b611a6b613155565b60405133904780156108fc02916000818181858888f19350505050158015611a97573d6000803e3d6000fd5b50565b611aa2613155565b611ab0600a80546001019055565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a541115611b2d5760405162461bcd60e51b815260206004820152601f60248201527f4c69666574696d6520737570706c7920686173206265656e206d696e746564006044820152606401610c94565b611a978160016133f2565b6000610c4482613400565b6010546001600160a01b0316611b82576008546001600160a01b03163314611b7d5760405162461bcd60e51b8152600401610c9490614284565b611bca565b6008546001600160a01b0316331480611bae57506010546001600160a01b0316336001600160a01b0316145b611bca5760405162461bcd60e51b8152600401610c94906142af565b60408051808201825260008082526020808301828152858352601982528483209351845491516001600160a81b0319909216901515610100600160a81b031916176101006001600160a01b0390921691909102179092558251848152918201527f9ecfd70e9ff36df72989324a49559383d39f9290d700b10cf5ac10dcb68d2643910160405180910390a150565b611c60613155565b8060186000846001811115611c7757611c77613b14565b6001811115611c8857611c88613b14565b81526020810191909152604001600020600201805460ff19169115159190911790555050565b60006001600160a01b038216611cd7576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b031660009081526005602052604090205467ffffffffffffffff1690565b611d05613155565b611d0f600061346f565b565b611d19613155565b611d27600b80546001019055565b6000805260186020527f999d26de3473317ead3eeaf34ca78057f1439db67b6953469c3c96ce9caf6bd854600b541115611da35760405162461bcd60e51b815260206004820152601e60248201527f4d6f6e74686c7920737570706c7920686173206265656e206d696e74656400006044820152606401610c94565b611a978160006133f2565b323314611dfd5760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610c94565b6012548490610100900460ff1615611e575760405162461bcd60e51b815260206004820152601760248201527f5468652072656e6577616c7320617265207061757365640000000000000000006044820152606401610c94565b611e6081612fc7565b611ea85760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81d1bdad95b88191bd95cc81b9bdd08195e1a5cdd603a1b6044820152606401610c94565b611eb181610c4a565b15611ece5760405162461bcd60e51b8152600401610c94906142e6565b83838382611f35576011543414611f275760405162461bcd60e51b815260206004820152601b60248201527f4d7573742073656e6420657175616c2072656e657720707269636500000000006044820152606401610c94565b611f30886134c1565b6120d6565b6000838152601360205260409020600281015460ff16611f975760405162461bcd60e51b815260206004820152601b60248201527f446973636f756e74206973206e6f206c6f6e6765722076616c696400000000006044820152606401610c94565b600033604051602001611faa91906141ad565b60405160208183030381529060405280519060200120905061200284848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050855491508490506131bd565b61205d5760405162461bcd60e51b815260206004820152602660248201527f596f7520646f6e277420686176652061636365737320746f20746869732064696044820152651cd8dbdd5b9d60d21b6064820152608401610c94565b6127108260010154601154612072919061432b565b61207c919061434a565b34146120ca5760405162461bcd60e51b815260206004820152601b60248201527f4d7573742073656e6420657175616c2072656e657720707269636500000000006044820152606401610c94565b6120d38a6134c1565b50505b5050505050505050565b6120e8613155565b6000908152601360205260409020600201805460ff19169055565b3233146121525760405162461bcd60e51b815260206004820152601e60248201527f5468652063616c6c657220697320616e6f7468657220636f6e747261637400006044820152606401610c94565b6002600954036121a45760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610c94565b6002600955828282600060125460ff1660048111156121c5576121c5613b14565b036121e25760405162461bcd60e51b8152600401610c94906140fe565b600360125460ff1660048111156121fb576121fb613b14565b036123be576001600081905260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4d54341461224c5760405162461bcd60e51b8152600401610c949061413f565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4f5460ff16156122c85760405162461bcd60e51b815260206004820152601a60248201527f4c69666574696d65204d696e74696e67206973205061757365640000000000006044820152606401610c94565b3360009081526015602052604090205460ff16156122f85760405162461bcd60e51b8152600401610c9490614176565b3360009081526014602052604090205460ff166123275760405162461bcd60e51b8152600401610c949061436c565b612335600a80546001019055565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a5411156123b25760405162461bcd60e51b815260206004820152601f60248201527f4c69666574696d6520737570706c7920686173206265656e206d696e746564006044820152606401610c94565b6123bc60016131af565b505b60018360048111156123d2576123d2613b14565b03612644576000336040516020016123ea91906141ad565b60405160208183030381529060405280519060200120905061244383838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600c5491508490506131bd565b6124885760405162461bcd60e51b8152602060048201526016602482015275496e76616c696420506172746e65722070726f6f662160501b6044820152606401610c94565b6001600081905260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4d5434146124d45760405162461bcd60e51b8152600401610c949061413f565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4f5460ff16156125505760405162461bcd60e51b815260206004820152601a60248201527f4c69666574696d65204d696e74696e67206973205061757365640000000000006044820152606401610c94565b3360009081526015602052604090205460ff16156125805760405162461bcd60e51b8152600401610c9490614176565b3360009081526014602052604090205460ff166125af5760405162461bcd60e51b8152600401610c949061436c565b6125bd600a80546001019055565b600160005260186020527ff3794665d3af9b6fb6f858b70185898134f96768ef31c325d52e04f0ac195a4e54600a54111561263a5760405162461bcd60e51b815260206004820152601f60248201527f4c69666574696d6520737570706c7920686173206265656e206d696e746564006044820152606401610c94565b61135660016131af565b600283600481111561265857612658613b14565b036127105760003360405160200161267091906141ad565b6040516020818303038152906040528051906020012090506126c983838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600d5491508490506131bd565b6124885760405162461bcd60e51b8152602060048201526018602482015277496e76616c69642057686974656c6973742070726f6f662160401b6044820152606401610c94565b600483600481111561272457612724613b14565b036114f45760003360405160200161273c91906141ad565b60405160208183030381529060405280519060200120905061279583838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e5491508490506131bd565b6124885760405162461bcd60e51b8152602060048201526017602482015276496e76616c696420576169746c6973742070726f6f662160481b6044820152606401610c94565b6010546000906001600160a01b031661281d576008546001600160a01b031633146128185760405162461bcd60e51b8152600401610c9490614284565b612865565b6008546001600160a01b031633148061284957506010546001600160a01b0316336001600160a01b0316145b6128655760405162461bcd60e51b8152600401610c94906142af565b506012805461ff0019166101008315150217905590565b606060038054610cd4906140c4565b612893613155565b601080546001600160a01b0319169055565b816128af81612ffc565b610daf8383613564565b6128c1613155565b60005b81811015610daf576001601460008585858181106128e4576128e4614255565b90506020020160208101906128f99190613cd7565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061292b8161426b565b9150506128c4565b836001600160a01b038116331461294d5761294d33612ffc565b6000838152601960205260409020548390859060ff16801561298a575060008281526019602052604090205461010090046001600160a01b031615155b156129cd576000828152601960205260409020546001600160a01b0382811661010090920416146129cd5760405162461bcd60e51b8152600401610c94906141ca565b60125462010000900460ff1615612a1d5760405162461bcd60e51b8152602060048201526014602482015273151c985b9cd9995c9cc8185c99481c185d5cd95960621b6044820152606401610c94565b612a29878787876135d0565b50505050505050565b612a3a613155565b60125460ff166004811115612a5157612a51613b14565b816004811115612a6357612a63613b14565b03612ab05760405162461bcd60e51b815260206004820152601860248201527f43686f6f7365206120646966666572656e7420706861736500000000000000006044820152606401610c94565b6012805482919060ff19166001836004811115612acf57612acf613b14565b021790555050565b6060612ae282612fc7565b612aff57604051630a14c4b560e41b815260040160405180910390fd5b6000612b09613614565b90508051600003612b295760405180602001604052806000815250612b54565b80612b3384613623565b604051602001612b449291906143b1565b6040516020818303038152906040525b9392505050565b6010546001600160a01b0316612b9a576008546001600160a01b03163314612b955760405162461bcd60e51b8152600401610c9490614284565b612be2565b6008546001600160a01b0316331480612bc657506010546001600160a01b0316336001600160a01b0316145b612be25760405162461bcd60e51b8152600401610c94906142af565b6001600160a01b038116612c425760405162461bcd60e51b815260206004820152602160248201527f5265636569766572206d757374206e6f74206265207a65726f206164647265736044820152607360f81b6064820152608401610c94565b604080518082018252600181526001600160a01b0383811660208084018281526000888152601983528690209451855491516001600160a81b0319909216901515610100600160a81b031916176101009190941602929092179092558251858152908101919091527f9ecfd70e9ff36df72989324a49559383d39f9290d700b10cf5ac10dcb68d264391015b60405180910390a15050565b6010546001600160a01b0316612d19576008546001600160a01b03163314612d145760405162461bcd60e51b8152600401610c9490614284565b612d61565b6008546001600160a01b0316331480612d4557506010546001600160a01b0316336001600160a01b0316145b612d615760405162461bcd60e51b8152600401610c94906142af565b8060005b81811015612d9657612d8e848483818110612d8257612d82614255565b90506020020135612e8f565b600101612d65565b50505050565b612da4613155565b610daf600f8383613a2f565b6000612dba613155565b506012805462ff00001916620100008315150217905590565b612ddb613155565b6001600160a01b038116612e405760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610c94565b611a978161346f565b612e51613155565b8060005b81811015612d9657612e87848483818110612e7257612e72614255565b90506020020160208101906108159190613cd7565b600101612e55565b6010546001600160a01b0316612ece576008546001600160a01b03163314612ec95760405162461bcd60e51b8152600401610c9490614284565b612f16565b6008546001600160a01b0316331480612efa57506010546001600160a01b0316336001600160a01b0316145b612f165760405162461bcd60e51b8152600401610c94906142af565b612f1f81612fc7565b612f675760405162461bcd60e51b8152602060048201526019602482015278151a1a5cc81d1bdad95b88191bd95cc81b9bdd08195e1a5cdd603a1b6044820152606401610c94565b612f7081610c4a565b15612f8d5760405162461bcd60e51b8152600401610c94906142e6565b611a97816134c1565b612f9e613155565b8060005b81811015612d9657612fbf848483818110612e7257612e72614255565b600101612fa2565b600081600111158015612fdb575060005482105b8015610c44575050600090815260046020526040902054600160e01b161590565b6daaeb6d7670e522a718067333cd4e3b15611a9757604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015613069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061308d91906143e0565b611a9757604051633b79c77360e21b81526001600160a01b0382166004820152602401610c94565b60006130c082611b38565b9050336001600160a01b038216146130f9576130dc8133610afa565b6130f9576040516367d9dca160e11b815260040160405180910390fd5b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6008546001600160a01b03163314611d0f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c94565b600054611a5f823383613667565b6000826131ca8584613760565b14949350505050565b6000326131e16001436143fd565b60405160609290921b6bffffffffffffffffffffffff1916602083015240603482015242605482015260740160405160208183030381529060405280519060200120905090565b600061323382613400565b9050836001600160a01b0316816001600160a01b0316146132665760405162a1148160e81b815260040160405180910390fd5b60008281526006602052604090208054338082146001600160a01b038816909114176132b3576132968633610afa565b6132b357604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b0385166132da57604051633a954ecd60e21b815260040160405180910390fd5b80156132e557600082555b6001600160a01b038681166000908152600560205260408082208054600019019055918716808252919020805460010190554260a01b17600160e11b17600085815260046020526040812091909155600160e11b84169003613377576001840160008181526004602052604081205490036133755760005481146133755760008181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611702565b611a5f8282604051806020016040528060008152506137ad565b610daf83838360405180602001604052806000815250612933565b600054610daf828483613667565b60008180600111613456576000548110156134565760008181526004602052604081205490600160e01b82169003613454575b80600003612b54575060001901600081815260046020526040902054613433565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600081815260166020526040902054421180156134f9576134e54262278d0061423d565b600083815260166020526040902055613520565b6000828152601660205260408120805462278d00929061351a90849061423d565b90915550505b600082815260166020908152604091829020548251858152918201527f5a337ee8148efcbebf88dd5350f776d12817849fa06eef6cfd9913cb19a5a08e9101612cce565b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6135db84848461160d565b6001600160a01b0383163b15612d96576135f78484848461381a565b612d96576040516368d2bf6b60e11b815260040160405180910390fd5b6060600f8054610cd4906140c4565b606060a06040510180604052602081039150506000815280825b600183039250600a81066030018353600a90048061363d5750819003601f19909101908152919050565b6136728260016133bd565b6001600160a01b0382166000908152601560205260409020805460ff1916600190811790915583908111156136a9576136a9613b14565b6001036137085760008181526017602052604090819020805460ff19166001179055517f1a00c29abfc99b376952b253cb19bc011019c9a885f05f7244f27ee829dc629c906136fb9083815260200190565b60405180910390a1505050565b6137154262278d0061423d565b60008281526016602052604090819020829055517f7705e197a138c9fde27b19dc60358ba5ccef4009d3522c5aad04f707493d7021916136fb91849190918252602082015260400190565b600081815b84518110156137a5576137918286838151811061378457613784614255565b6020026020010151613905565b91508061379d8161426b565b915050613765565b509392505050565b6137b78383613931565b6001600160a01b0383163b15610daf576000548281035b6137e1600086838060010194508661381a565b6137fe576040516368d2bf6b60e11b815260040160405180910390fd5b8181106137ce57816000541461381357600080fd5b5050505050565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a029061384f903390899088908890600401614414565b6020604051808303816000875af192505050801561388a575060408051601f3d908101601f1916820190925261388791810190614450565b60015b6138e8573d8080156138b8576040519150601f19603f3d011682016040523d82523d6000602084013e6138bd565b606091505b5080516000036138e0576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050949350505050565b6000818310613921576000828152602084905260409020612b54565b5060009182526020526040902090565b60008054908290036139565760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b03831660008181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114613a0557808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001016139cd565b5081600003613a2657604051622e076360e81b815260040160405180910390fd5b60005550505050565b828054613a3b906140c4565b90600052602060002090601f016020900481019282613a5d5760008555613aa3565b82601f10613a765782800160ff19823516178555613aa3565b82800160010185558215613aa3579182015b82811115613aa3578235825591602001919060010190613a88565b50613aaf929150613ab3565b5090565b5b80821115613aaf5760008155600101613ab4565b6001600160e01b031981168114611a9757600080fd5b600060208284031215613af057600080fd5b8135612b5481613ac8565b600060208284031215613b0d57600080fd5b5035919050565b634e487b7160e01b600052602160045260246000fd5b6020810160058310613b4c57634e487b7160e01b600052602160045260246000fd5b91905290565b60005b83811015613b6d578181015183820152602001613b55565b83811115612d965750506000910152565b60008151808452613b96816020860160208601613b52565b601f01601f19169290920160200192915050565b602081526000612b546020830184613b7e565b80356001600160a01b03811681146115b657600080fd5b60008060408385031215613be757600080fd5b613bf083613bbd565b946020939093013593505050565b8035600281106115b657600080fd5b60008060408385031215613c2057600080fd5b613bf083613bfe565b8035600581106115b657600080fd5b60008083601f840112613c4a57600080fd5b50813567ffffffffffffffff811115613c6257600080fd5b6020830191508360208260051b8501011115613c7d57600080fd5b9250929050565b600080600060408486031215613c9957600080fd5b613ca284613c29565b9250602084013567ffffffffffffffff811115613cbe57600080fd5b613cca86828701613c38565b9497909650939450505050565b600060208284031215613ce957600080fd5b612b5482613bbd565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613d3157613d31613cf2565b604052919050565b8015158114611a9757600080fd5b600060608284031215613d5957600080fd5b6040516060810181811067ffffffffffffffff82111715613d7c57613d7c613cf2565b806040525082358152602083013560208201526040830135613d9d81613d39565b60408201529392505050565b600080600060608486031215613dbe57600080fd5b613dc784613bbd565b9250613dd560208501613bbd565b9150604084013590509250925092565b60008060208385031215613df857600080fd5b823567ffffffffffffffff811115613e0f57600080fd5b613e1b85828601613c38565b90969095509350505050565b60008060408385031215613e3a57600080fd5b613bf083613c29565b60008060408385031215613e5657600080fd5b613e5f83613bfe565b91506020830135613e6f81613d39565b809150509250929050565b600060208284031215613e8c57600080fd5b612b5482613bfe565b60008060008060608587031215613eab57600080fd5b8435935060208501359250604085013567ffffffffffffffff811115613ed057600080fd5b613edc87828801613c38565b95989497509550505050565b600060208284031215613efa57600080fd5b8135612b5481613d39565b60008060408385031215613f1857600080fd5b613e5f83613bbd565b60008060008060808587031215613f3757600080fd5b613f4085613bbd565b93506020613f4f818701613bbd565b935060408601359250606086013567ffffffffffffffff80821115613f7357600080fd5b818801915088601f830112613f8757600080fd5b813581811115613f9957613f99613cf2565b613fab601f8201601f19168501613d08565b91508082528984828501011115613fc157600080fd5b808484018584013760008482840101525080935050505092959194509250565b600060208284031215613ff357600080fd5b612b5482613c29565b6000806040838503121561400f57600080fd5b8235915061401f60208401613bbd565b90509250929050565b6000806020838503121561403b57600080fd5b823567ffffffffffffffff8082111561405357600080fd5b818501915085601f83011261406757600080fd5b81358181111561407657600080fd5b86602082850101111561408857600080fd5b60209290920196919550909350505050565b600080604083850312156140ad57600080fd5b6140b683613bbd565b915061401f60208401613bbd565b600181811c908216806140d857607f821691505b6020821081036140f857634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526021908201527f596f752063616e6e6f74206d696e7420647572696e67207468697320706861736040820152606560f81b606082015260800190565b60208082526017908201527f4d7573742073656e6420636f7272656374207072696365000000000000000000604082015260600190565b6020808252601e908201527f546869732077616c6c65742068617320616c7265616479206d696e7465640000604082015260600190565b60609190911b6bffffffffffffffffffffffff1916815260140190565b6020808252603b908201527f546f6b656e206973206c6f636b65642e20436f6e74616374206f776e6572206960408201527f6e2068747470733a2f2f646973636f72642e67672f74696d6974680000000000606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561425057614250614227565b500190565b634e487b7160e01b600052603260045260246000fd5b60006001820161427d5761427d614227565b5060010190565b60208082526011908201527026bab9ba103132903a34329037bbb732b960791b604082015260600190565b6020808252601c908201527f4d75737420626520746865206f776e6572206f72207468652064657600000000604082015260600190565b60208082526025908201527f5468697320746f6b656e2069732061206c69666574696d652073756273637269604082015264383a34b7b760d91b606082015260800190565b600081600019048311821515161561434557614345614227565b500290565b60008261436757634e487b7160e01b600052601260045260246000fd5b500490565b60208082526025908201527f596f7520617265206e6f7420656c696761626c6520746f206d696e74206c69666040820152646574696d6560d81b606082015260800190565b600083516143c3818460208801613b52565b8351908301906143d7818360208801613b52565b01949350505050565b6000602082840312156143f257600080fd5b8151612b5481613d39565b60008282101561440f5761440f614227565b500390565b60006001600160a01b038087168352808616602084015250836040830152608060608301526144466080830184613b7e565b9695505050505050565b60006020828403121561446257600080fd5b8151612b5481613ac856fea264697066735822122038b4382e51670fddf0697b4c5f26ba47d22ef11eb1ce4eb0c9c23df8704c89dc64736f6c634300080d0033

Deployed Bytecode Sourcemap

1515:13573:6:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9155:630:7;;;;;;;;;;-1:-1:-1;9155:630:7;;;;;:::i;:::-;;:::i;:::-;;;565:14:12;;558:22;540:41;;528:2;513:18;9155:630:7;;;;;;;;11720:189:6;;;;;;;;;;-1:-1:-1;11720:189:6;;;;;:::i;:::-;;:::i;1868:38::-;;;;;;;;;;-1:-1:-1;1868:38:6;;;;;;;;;923:25:12;;;911:2;896:18;1868:38:6;777:177:12;2537:40:6;;;;;;;;;;-1:-1:-1;2537:40:6;;;;;;;;;;;;;;;:::i;10039:98:7:-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;16360:214::-;;;;;;;;;;-1:-1:-1;16360:214:7;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2350:55:12;;;2332:74;;2320:2;2305:18;16360:214:7;2186:226:12;14133:157:6;;;;;;:::i;:::-;;:::i;:::-;;8989:201;;;;;;;;;;-1:-1:-1;8989:201:6;;;;;:::i;:::-;;:::i;5894:317:7:-;;;;;;;;;;-1:-1:-1;13901:1:6;6164:12:7;5955:7;6148:13;:28;-1:-1:-1;;6148:46:7;5894:317;;12614:253:6;;;;;;:::i;:::-;;:::i;8578:193::-;;;;;;;;;;-1:-1:-1;8578:193:6;;;;;:::i;:::-;;:::i;6971:191::-;;;;;;;;;;-1:-1:-1;6971:191:6;;;;;:::i;:::-;;:::i;14294:241::-;;;;;;:::i;:::-;;:::i;7269:217::-;;;;;;;;;;;;;:::i;8775:210::-;;;;;;;;;;-1:-1:-1;8775:210:6;;;;;:::i;:::-;;:::i;2776:41::-;;;;;;;;;;-1:-1:-1;2776:41:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;8023:199;;;;;;;;;;-1:-1:-1;8023:199:6;;;;;:::i;:::-;;:::i;737:142:11:-;;;;;;;;;;;;836:42;737:142;;14539:249:6;;;;;;:::i;:::-;;:::i;8377:85::-;;;;;;;;;;;;;:::i;2620:35::-;;;;;;;;;;-1:-1:-1;2620:35:6;;;;;;;;;;;2582:34;;;;;;;;;;-1:-1:-1;2582:34:6;;;;;;;;;;;9323:119;;;;;;;;;;-1:-1:-1;9323:119:6;;;;;:::i;:::-;;:::i;7490:330::-;;;;;;;;;;-1:-1:-1;7490:330:6;;;;;:::i;:::-;;:::i;2495:37::-;;;;;;;;;;;;;;;;8466:108;;;;;;;;;;;;;:::i;9545:133::-;;;;;;;;;;-1:-1:-1;9545:133:6;;;;;:::i;:::-;;:::i;11391:150:7:-;;;;;;;;;;-1:-1:-1;11391:150:7;;;;;:::i;:::-;;:::i;11548:168:6:-;;;;;;;;;;-1:-1:-1;11548:168:6;;;;;:::i;:::-;;:::i;9194:125::-;;;;;;;;;;-1:-1:-1;9194:125:6;;;;;:::i;:::-;;:::i;7045:230:7:-;;;;;;;;;;-1:-1:-1;7045:230:7;;;;;:::i;:::-;;:::i;1831:101:0:-;;;;;;;;;;;;;:::i;2918:49:6:-;;;;;;;;;;-1:-1:-1;2918:49:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7983:25:12;;;8039:2;8024:18;;8017:34;;;;8094:14;8087:22;8067:18;;;8060:50;7971:2;7956:18;2918:49:6;7787:329:12;9682:130:6;;;;;;;;;;-1:-1:-1;9682:130:6;;;;;:::i;:::-;;:::i;13487:217::-;;;;;;:::i;:::-;;:::i;7166:99::-;;;;;;;;;;-1:-1:-1;7166:99:6;;;;;:::i;:::-;;:::i;12871:258::-;;;;;;:::i;:::-;;:::i;10951:131::-;;;;;;;;;;-1:-1:-1;10951:131:6;;;;;:::i;:::-;;:::i;1201:85:0:-;;;;;;;;;;-1:-1:-1;1273:6:0;;-1:-1:-1;;;;;1273:6:0;1201:85;;10208:102:7;;;;;;;;;;;;;:::i;2392:33:6:-;;;;;;;;;;;;;;;;2660:58;;;;;;;;;;-1:-1:-1;2660:58:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11218:65;;;;;;;;;;;;;:::i;13961:168::-;;;;;;;;;;-1:-1:-1;13961:168:6;;;;;:::i;:::-;;:::i;2318:32::-;;;;;;;;;;;;;;;;7824:195;;;;;;;;;;-1:-1:-1;7824:195:6;;;;;:::i;:::-;;:::i;2354:34::-;;;;;;;;;;;;;;;;14792:294;;;;;;:::i;:::-;;:::i;2821:45::-;;;;;;;;;;-1:-1:-1;2821:45:6;;;;;:::i;:::-;;;;;;;;;;;;;;8226:147;;;;;;;;;;-1:-1:-1;8226:147:6;;;;;:::i;:::-;;:::i;10411:313:7:-;;;;;;;;;;-1:-1:-1;10411:313:7;;;;;:::i;:::-;;:::i;11287:257:6:-;;;;;;;;;;-1:-1:-1;11287:257:6;;;;;:::i;:::-;;:::i;1910:37::-;;;;;;;;;;-1:-1:-1;1910:37:6;;;;;;10582:259;;;;;;;;;;-1:-1:-1;10582:259:6;;;;;:::i;:::-;;:::i;2971:48::-;;;;;;;;;;-1:-1:-1;2971:48:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2971:48:6;;;;;;;11869:14:12;;11862:22;11844:41;;-1:-1:-1;;;;;11921:55:12;;;11916:2;11901:18;;11894:83;11817:18;2971:48:6;11676:307:12;9446:95:6;;;;;;;;;;-1:-1:-1;9446:95:6;;;;;:::i;:::-;;:::i;17282:162:7:-;;;;;;;;;;-1:-1:-1;17282:162:7;;;;;:::i;:::-;-1:-1:-1;;;;;17402:25:7;;;17379:4;17402:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;17282:162;11086:128:6;;;;;;;;;;-1:-1:-1;11086:128:6;;;;;:::i;:::-;;:::i;2081:198:0:-;;;;;;;;;;-1:-1:-1;2081:198:0;;;;;:::i;:::-;;:::i;10076:257:6:-;;;;;;;;;;-1:-1:-1;10076:257:6;;;;;:::i;:::-;;:::i;10337:241::-;;;;;;;;;;-1:-1:-1;10337:241:6;;;;;:::i;:::-;;:::i;9816:256::-;;;;;;;;;;-1:-1:-1;9816:256:6;;;;;:::i;:::-;;:::i;2723:48::-;;;;;;;;;;-1:-1:-1;2723:48:6;;;;;:::i;:::-;;;;;;;;;;;;;;;;9155:630:7;9240:4;-1:-1:-1;;;;;;;;;9558:25:7;;;;:101;;-1:-1:-1;;;;;;;;;;9634:25:7;;;9558:101;:177;;;-1:-1:-1;;;;;;;;;;9710:25:7;;;9558:177;9539:196;9155:630;-1:-1:-1;;9155:630:7:o;11720:189:6:-;11784:4;11804:17;11812:8;11804:7;:17::i;:::-;11796:50;;;;-1:-1:-1;;;11796:50:6;;13052:2:12;11796:50:6;;;13034:21:12;13091:2;13071:18;;;13064:30;-1:-1:-1;;;13110:18:12;;;13103:50;13170:18;;11796:50:6;;;;;;;;;11871:3;11859:8;:15;;:45;;11884:20;;;;:10;:20;;;;;;;;11859:45;;;11877:4;11852:52;11720:189;-1:-1:-1;;11720:189:6:o;10039:98:7:-;10093:13;10125:5;10118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10039:98;:::o;16360:214::-;16436:7;16460:16;16468:7;16460;:16::i;:::-;16455:64;;16485:34;;-1:-1:-1;;;16485:34:7;;;;;;;;;;;16455:64;-1:-1:-1;16537:24:7;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;16537:30:7;;16360:214::o;14133:157:6:-;14237:8;2227:30:11;2248:8;2227:20;:30::i;:::-;14253:32:6::1;14267:8;14277:7;14253:13;:32::i;:::-;14133:157:::0;;;:::o;8989:201::-;1094:13:0;:11;:13::i;:::-;9109:7:6::1;9080:11;:18;9092:5;9080:18;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;;;;;:25;;;:36:::0;9072:72:::1;;;::::0;-1:-1:-1;;;9072:72:6;;13786:2:12;9072:72:6::1;::::0;::::1;13768:21:12::0;13825:2;13805:18;;;13798:30;13864:25;13844:18;;;13837:53;13907:18;;9072:72:6::1;13584:347:12::0;9072:72:6::1;9178:7;9150:11;:18;9162:5;9150:18;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;9150:18:6;:25:::1;;:35:::0;-1:-1:-1;;8989:201:6:o;12614:253::-;3592:9;719:10:2;3592:25:6;3584:68;;;;-1:-1:-1;;;3584:68:6;;14138:2:12;3584:68:6;;;14120:21:12;14177:2;14157:18;;;14150:30;14216:32;14196:18;;;14189:60;14266:18;;3584:68:6;13936:354:12;3584:68:6;1744:1:1::1;2325:7;;:19:::0;2317:63:::1;;;::::0;-1:-1:-1;;;2317:63:1;;14497:2:12;2317:63:1::1;::::0;::::1;14479:21:12::0;14536:2;14516:18;;;14509:30;14575:33;14555:18;;;14548:61;14626:18;;2317:63:1::1;14295:355:12::0;2317:63:1::1;1744:1;2455:7;:18:::0;12745:6:6;12753:5;;4921:11:::2;4905:12;::::0;::::2;;:27;::::0;::::2;;;;;;:::i;:::-;::::0;4901:76:::2;;4934:43;;-1:-1:-1::0;;;4934:43:6::2;;;;;;;:::i;4901:76::-;5004:13;4988:12;::::0;::::2;;:29;::::0;::::2;;;;;;:::i;:::-;::::0;4984:51:::2;;12775:17:::3;5816:23:::0;;;:11:::3;:23;::::0;;:29;5803:9:::3;:42;5795:78;;;;-1:-1:-1::0;;;5795:78:6::3;;;;;;;:::i;:::-;6226:30:::4;::::0;;:11:::4;:30;::::0;:37;;::::4;;6225:38;6217:76;;;::::0;-1:-1:-1;;;6217:76:6;;15611:2:12;6217:76:6::4;::::0;::::4;15593:21:12::0;15650:2;15630:18;;;15623:30;-1:-1:-1;;;15669:18:12;;;15662:55;15734:18;;6217:76:6::4;15409:349:12::0;6217:76:6::4;719:10:2::0;6308:23:6::4;::::0;;;:9:::4;:23;::::0;;;;;::::4;;6307:24;6299:67;;;;-1:-1:-1::0;;;6299:67:6::4;;;;;;;:::i;:::-;6613:25:::5;:13;1032:19:3::0;;1050:1;1032:19;;;945:123;6613:25:6::5;6679:30;::::0;;:11:::5;:30;::::0;:37;;6652:13:::5;918:14:3::0;6652:64:6::5;;6644:107;;;::::0;-1:-1:-1;;;6644:107:6;;16324:2:12;6644:107:6::5;::::0;::::5;16306:21:12::0;16363:2;16343:18;;;16336:30;16402:32;16382:18;;;16375:60;16452:18;;6644:107:6::5;16122:354:12::0;6644:107:6::5;12839:23:::6;12844:17;12839:4;:23::i;:::-;5027:1:::3;4984:51:::2;5055:14;5045:6;:24;;;;;;;;:::i;:::-;::::0;5041:694:::2;;5079:12;719:10:2::0;5104:30:6::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;5094:41;;;;;;5079:56;;5151:57;5170:12;;5151:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5184:17:6::2;::::0;;-1:-1:-1;5203:4:6;;-1:-1:-1;5151:18:6::2;:57::i;:::-;5143:92;;;::::0;-1:-1:-1;;;5143:92:6;;16917:2:12;5143:92:6::2;::::0;::::2;16899:21:12::0;16956:2;16936:18;;;16929:30;-1:-1:-1;;;16975:18:12;;;16968:52;17037:18;;5143:92:6::2;16715:346:12::0;5143:92:6::2;12775:17:::3;5816:23:::0;;;:11:::3;:23;::::0;;:29;5803:9:::3;:42;5795:78;;;;-1:-1:-1::0;;;5795:78:6::3;;;;;;;:::i;:::-;6226:30:::4;::::0;;:11:::4;:30;::::0;:37;;::::4;;6225:38;6217:76;;;::::0;-1:-1:-1;;;6217:76:6;;15611:2:12;6217:76:6::4;::::0;::::4;15593:21:12::0;15650:2;15630:18;;;15623:30;-1:-1:-1;;;15669:18:12;;;15662:55;15734:18;;6217:76:6::4;15409:349:12::0;6217:76:6::4;719:10:2::0;6308:23:6::4;::::0;;;:9:::4;:23;::::0;;;;;::::4;;6307:24;6299:67;;;;-1:-1:-1::0;;;6299:67:6::4;;;;;;;:::i;:::-;6613:25:::5;:13;1032:19:3::0;;1050:1;1032:19;;;945:123;6613:25:6::5;6679:30;::::0;;:11:::5;:30;::::0;:37;;6652:13:::5;918:14:3::0;6652:64:6::5;;6644:107;;;::::0;-1:-1:-1;;;6644:107:6;;16324:2:12;6644:107:6::5;::::0;::::5;16306:21:12::0;16363:2;16343:18;;;16336:30;16402:32;16382:18;;;16375:60;16452:18;;6644:107:6::5;16122:354:12::0;6644:107:6::5;12839:23:::6;12844:17;12839:4;:23::i;:::-;5243:1:::3;5071:180:::2;5041:694;;;5271:16;5261:6;:26;;;;;;;;:::i;:::-;::::0;5257:478:::2;;5297:12;719:10:2::0;5322:30:6::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;5312:41;;;;;;5297:56;;5369:59;5388:12;;5369:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5402:19:6::2;::::0;;-1:-1:-1;5423:4:6;;-1:-1:-1;5369:18:6::2;:59::i;:::-;5361:96;;;::::0;-1:-1:-1;;;5361:96:6;;17268:2:12;5361:96:6::2;::::0;::::2;17250:21:12::0;17307:2;17287:18;;;17280:30;-1:-1:-1;;;17326:18:12;;;17319:54;17390:18;;5361:96:6::2;17066:348:12::0;5257:478:6::2;5493:15;5483:6;:25;;;;;;;;:::i;:::-;::::0;5479:256:::2;;5518:12;719:10:2::0;5543:30:6::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;5533:41;;;;;;5518:56;;5590:58;5609:12;;5590:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5623:18:6::2;::::0;;-1:-1:-1;5643:4:6;;-1:-1:-1;5590:18:6::2;:58::i;:::-;5582:94;;;::::0;-1:-1:-1;;;5582:94:6;;17621:2:12;5582:94:6::2;::::0;::::2;17603:21:12::0;17660:2;17640:18;;;17633:30;-1:-1:-1;;;17679:18:12;;;17672:53;17742:18;;5582:94:6::2;17419:347:12::0;5479:256:6::2;5706:22;::::0;-1:-1:-1;;;5706:22:6;;17973:2:12;5706:22:6::2;::::0;::::2;17955:21:12::0;18012:2;17992:18;;;17985:30;-1:-1:-1;;;18031:18:12;;;18024:42;18083:18;;5706:22:6::2;17771:336:12::0;5479:256:6::2;-1:-1:-1::0;;1701:1:1::1;2628:7;:22:::0;-1:-1:-1;;;;12614:253:6:o;8578:193::-;8646:7;1094:13:0;:11;:13::i;:::-;-1:-1:-1;;;;;8669:24:6;::::1;8661:60;;;::::0;-1:-1:-1;;;8661:60:6;;18314:2:12;8661:60:6::1;::::0;::::1;18296:21:12::0;18353:2;18333:18;;;18326:30;18392:25;18372:18;;;18365:53;18435:18;;8661:60:6::1;18112:347:12::0;8661:60:6::1;-1:-1:-1::0;8727:3:6::1;:16:::0;;-1:-1:-1;;;;;;8727:16:6::1;-1:-1:-1::0;;;;;8727:16:6;::::1;;::::0;;;1117:1:0::1;8578:193:6::0;;;:::o;6971:191::-;7054:7;1094:13:0;:11;:13::i;:::-;7069:15:6::1;7087:8;:6;:8::i;:::-;7102:24;::::0;;;:15:::1;:24;::::0;;;;;;;;:35;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;7102:35:6::1;::::0;::::1;;::::0;;;::::1;::::0;;;-1:-1:-1;7102:24:6;;6971:191;-1:-1:-1;6971:191:6:o;14294:241::-;14403:4;-1:-1:-1;;;;;2054:18:11;;2062:10;2054:18;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;3727:21:6::1;::::0;;;:12:::1;:21;::::0;;;;:28;14419:7;;14428:2;;3727:28:::1;;:76:::0;::::1;;;-1:-1:-1::0;3801:1:6::1;3759:21:::0;;;:12:::1;:21;::::0;;;;:30;::::1;::::0;::::1;-1:-1:-1::0;;;;;3759:30:6::1;:44:::0;::::1;3727:76;3723:206;;;3821:21;::::0;;;:12:::1;:21;::::0;;;;:30;-1:-1:-1;;;;;3821:37:6;;::::1;:30;::::0;;::::1;;:37;3813:109;;;;-1:-1:-1::0;;;3813:109:6::1;;;;;;;:::i;:::-;14447:15:::2;::::0;;;::::2;;;14446:16;14438:49;;;::::0;-1:-1:-1;;;14438:49:6;;19094:2:12;14438:49:6::2;::::0;::::2;19076:21:12::0;19133:2;19113:18;;;19106:30;-1:-1:-1;;;19152:18:12;;;19145:50;19212:18;;14438:49:6::2;18892:344:12::0;14438:49:6::2;14493:37;14512:4;14518:2;14522:7;14493:18;:37::i;:::-;2140:1:11::1;;14294:241:6::0;;;;:::o;7269:217::-;1094:13:0;:11;:13::i;:::-;7369:18:6::1;7357:31;::::0;:11:::1;:31;::::0;:38;;7322:14:::1;918::3::0;7322:30:6::1;::::0;7349:3:::1;7322:30;:::i;:::-;7321:74;;7313:105;;;::::0;-1:-1:-1;;;7313:105:6;;19708:2:12;7313:105:6::1;::::0;::::1;19690:21:12::0;19747:2;19727:18;;;19720:30;-1:-1:-1;;;19766:18:12;;;19759:48;19824:18;;7313:105:6::1;19506:342:12::0;7313:105:6::1;7424:23;7434:7;1273:6:0::0;;-1:-1:-1;;;;;1273:6:0;;1201:85;7434:7:6::1;7443:3;7424:9;:23::i;:::-;7478:3;7453:14;:21;;;:28;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;7269:217:6:o;8775:210::-;8845:7;1094:13:0;:11;:13::i;:::-;8882:11:6::1;8868:10;;:25:::0;8860:66:::1;;;::::0;-1:-1:-1;;;8860:66:6;;20055:2:12;8860:66:6::1;::::0;::::1;20037:21:12::0;20094:2;20074:18;;;20067:30;20133;20113:18;;;20106:58;20181:18;;8860:66:6::1;19853:352:12::0;8860:66:6::1;-1:-1:-1::0;8932:10:6::1;:24:::0;;;;8775:210::o;8023:199::-;1094:13:0;:11;:13::i;:::-;8121:9:6::1;8116:102;8136:21:::0;;::::1;8116:102;;;8206:5;8172:16;:31;8189:10;;8200:1;8189:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;8172:31:6::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;8172:31:6;:39;;-1:-1:-1;;8172:39:6::1;::::0;::::1;;::::0;;;::::1;::::0;;8159:3;::::1;::::0;::::1;:::i;:::-;;;;8116:102;;14539:249:::0;14652:4;-1:-1:-1;;;;;2054:18:11;;2062:10;2054:18;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;3727:21:6::1;::::0;;;:12:::1;:21;::::0;;;;:28;14668:7;;14677:2;;3727:28:::1;;:76:::0;::::1;;;-1:-1:-1::0;3801:1:6::1;3759:21:::0;;;:12:::1;:21;::::0;;;;:30;::::1;::::0;::::1;-1:-1:-1::0;;;;;3759:30:6::1;:44:::0;::::1;3727:76;3723:206;;;3821:21;::::0;;;:12:::1;:21;::::0;;;;:30;-1:-1:-1;;;;;3821:37:6;;::::1;:30;::::0;;::::1;;:37;3813:109;;;;-1:-1:-1::0;;;3813:109:6::1;;;;;;;:::i;:::-;14696:15:::2;::::0;;;::::2;;;14695:16;14687:49;;;::::0;-1:-1:-1;;;14687:49:6;;19094:2:12;14687:49:6::2;::::0;::::2;19076:21:12::0;19133:2;19113:18;;;19106:30;-1:-1:-1;;;19152:18:12;;;19145:50;19212:18;;14687:49:6::2;18892:344:12::0;14687:49:6::2;14742:41;14765:4;14771:2;14775:7;14742:22;:41::i;8377:85::-:0;8432:7;1094:13:0;:11;:13::i;:::-;-1:-1:-1;8454:3:6::1;::::0;-1:-1:-1;;;;;8454:3:6::1;8377:85:::0;:::o;9323:119::-;1094:13:0;:11;:13::i;:::-;9431:6:6::1;9404:11;:18;9416:5;9404:18;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;9404:18:6;:33;-1:-1:-1;;9323:119:6:o;7490:330::-;1094:13:0;:11;:13::i;:::-;7594:6:6::1;7576:24;;;;;;;;:::i;:::-;:14;:24:::0;7572:76:::1;;7610:17;:31:::0;;;7572:76:::1;7677:6;7657:26;;;;;;;;:::i;:::-;:16;:26:::0;7653:80:::1;;7693:19;:33:::0;;;7653:80:::1;7761:6;7742:25;;;;;;;;:::i;:::-;:15;:25:::0;7738:78:::1;;7777:18;:32:::0;;;7738:78:::1;7490:330:::0;;:::o;8466:108::-;1094:13:0;:11;:13::i;:::-;8516:53:6::1;::::0;719:10:2;;8547:21:6::1;8516:53:::0;::::1;;;::::0;::::1;::::0;;;8547:21;719:10:2;8516:53:6;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8466:108::o:0;9545:133::-;1094:13:0;:11;:13::i;:::-;6419:26:6::1;:14;1032:19:3::0;;1050:1;1032:19;;;945:123;6419:26:6::1;6499:18;6487:31;::::0;:11:::1;:31;::::0;:38;;6459:14:::1;918::3::0;6459:66:6::1;;6451:110;;;::::0;-1:-1:-1;;;6451:110:6;;20684:2:12;6451:110:6::1;::::0;::::1;20666:21:12::0;20723:2;20703:18;;;20696:30;20762:33;20742:18;;;20735:61;20813:18;;6451:110:6::1;20482:355:12::0;6451:110:6::1;9638:35:::2;9643:9;9654:18;9638:4;:35::i;11391:150:7:-:0;11463:7;11505:27;11524:7;11505:18;:27::i;11548:168:6:-;3344:3;;-1:-1:-1;;;;;3344:3:6;3340:199;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3379:23:6;3371:53;;;;-1:-1:-1;;;3371:53:6;;;;;;;:::i;:::-;3340:199;;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3453:23:6;;:46;;-1:-1:-1;3496:3:6;;-1:-1:-1;;;;;3496:3:6;719:10:2;-1:-1:-1;;;;;3480:19:6;;3453:46;3445:87;;;;-1:-1:-1;;;3445:87:6;;;;;;;:::i;:::-;11640:27:::1;::::0;;;;::::1;::::0;;-1:-1:-1;11640:27:6;;;::::1;::::0;;::::1;::::0;;;11615:22;;;:12:::1;:22:::0;;;;;:52;;;;;;-1:-1:-1;;;;;;11615:52:6;;;;::::1;;-1:-1:-1::0;;;;;;11615:52:6;;::::1;-1:-1:-1::0;;;;;11615:52:6;;::::1;::::0;;;::::1;;::::0;;;11678:33;;21719:25:12;;;21760:18;;;21753:83;11678:33:6::1;::::0;21692:18:12;11678:33:6::1;;;;;;;11548:168:::0;:::o;9194:125::-;1094:13:0;:11;:13::i;:::-;9307:7:6::1;9279:11;:18;9291:5;9279:18;;;;;;;;:::i;:::-;;;;;;;;;:::i;:::-;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;9279:18:6;:25:::1;;:35:::0;;-1:-1:-1;;9279:35:6::1;::::0;::::1;;::::0;;;::::1;::::0;;-1:-1:-1;;9194:125:6:o;7045:230:7:-;7117:7;-1:-1:-1;;;;;7140:19:7;;7136:60;;7168:28;;-1:-1:-1;;;7168:28:7;;;;;;;;;;;7136:60;-1:-1:-1;;;;;;7213:25:7;;;;;:18;:25;;;;;;1360:13;7213:55;;7045:230::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;9682:130:6:-;1094:13:0;:11;:13::i;:::-;6613:25:6::1;:13;1032:19:3::0;;1050:1;1032:19;;;945:123;6613:25:6::1;6679:30;::::0;;:11:::1;:30;::::0;:37;;6652:13:::1;918:14:3::0;6652:64:6::1;;6644:107;;;::::0;-1:-1:-1;;;6644:107:6;;16324:2:12;6644:107:6::1;::::0;::::1;16306:21:12::0;16363:2;16343:18;;;16336:30;16402:32;16382:18;;;16375:60;16452:18;;6644:107:6::1;16122:354:12::0;6644:107:6::1;9773:34:::2;9778:9;9789:17;9773:4;:34::i;13487:217::-:0;3592:9;719:10:2;3592:25:6;3584:68;;;;-1:-1:-1;;;3584:68:6;;14138:2:12;3584:68:6;;;14120:21:12;14177:2;14157:18;;;14150:30;14216:32;14196:18;;;14189:60;14266:18;;3584:68:6;13936:354:12;3584:68:6;4621:14:::1;::::0;13629:8;;4621:14:::1;::::0;::::1;;;4620:15;4612:51;;;::::0;-1:-1:-1;;;4612:51:6;;22049:2:12;4612:51:6::1;::::0;::::1;22031:21:12::0;22088:2;22068:18;;;22061:30;22127:25;22107:18;;;22100:53;22170:18;;4612:51:6::1;21847:347:12::0;4612:51:6::1;4677:17;4685:8;4677:7;:17::i;:::-;4669:55;;;::::0;-1:-1:-1;;;4669:55:6;;22401:2:12;4669:55:6::1;::::0;::::1;22383:21:12::0;22440:2;22420:18;;;22413:30;-1:-1:-1;;;22459:18:12;;;22452:55;22524:18;;4669:55:6::1;22199:349:12::0;4669:55:6::1;4739:25;4755:8;4739:15;:25::i;:::-;4738:26;4730:76;;;;-1:-1:-1::0;;;4730:76:6::1;;;;;;;:::i;:::-;13658:4:::0;13664:6;;13658:4;4019:533:::2;;4072:10;;4059:9;:23;4051:63;;;::::0;-1:-1:-1;;;4051:63:6;;23161:2:12;4051:63:6::2;::::0;::::2;23143:21:12::0;23200:2;23180:18;;;23173:30;23239:29;23219:18;;;23212:57;23286:18;;4051:63:6::2;22959:351:12::0;4051:63:6::2;13678:21:::3;13690:8;13678:11;:21::i;:::-;4019:533:::2;;;4144:32;4179:21:::0;;;:15:::2;:21;::::0;;;;4216:14:::2;::::0;::::2;::::0;::::2;;4208:54;;;::::0;-1:-1:-1;;;4208:54:6;;23517:2:12;4208:54:6::2;::::0;::::2;23499:21:12::0;23556:2;23536:18;;;23529:30;23595:29;23575:18;;;23568:57;23642:18;;4208:54:6::2;23315:351:12::0;4208:54:6::2;4271:12;719:10:2::0;4296:30:6::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;4286:41;;;;;;4271:56;;4343:47;4362:6;;4343:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;4370:13:6;;;-1:-1:-1;4385:4:6;;-1:-1:-1;4343:18:6::2;:47::i;:::-;4335:98;;;::::0;-1:-1:-1;;;4335:98:6;;23873:2:12;4335:98:6::2;::::0;::::2;23855:21:12::0;23912:2;23892:18;;;23885:30;23951:34;23931:18;;;23924:62;-1:-1:-1;;;24002:18:12;;;23995:36;24048:19;;4335:98:6::2;23671:402:12::0;4335:98:6::2;4498:5;4477:8;:17;;;4464:10;;:30;;;;:::i;:::-;4463:40;;;;:::i;:::-;4449:9;:55;4441:95;;;::::0;-1:-1:-1;;;4441:95:6;;23161:2:12;4441:95:6::2;::::0;::::2;23143:21:12::0;23200:2;23180:18;;;23173:30;23239:29;23219:18;;;23212:57;23286:18;;4441:95:6::2;22959:351:12::0;4441:95:6::2;13678:21:::3;13690:8;13678:11;:21::i;:::-;4136:416:::2;;4019:533;4812:1;;;3658::::1;13487:217:::0;;;;:::o;7166:99::-;1094:13:0;:11;:13::i;:::-;7255:5:6::1;7226:20:::0;;;:15:::1;:20;::::0;;;;:26:::1;;:34:::0;;-1:-1:-1;;7226:34:6::1;::::0;;7166:99::o;12871:258::-;3592:9;719:10:2;3592:25:6;3584:68;;;;-1:-1:-1;;;3584:68:6;;14138:2:12;3584:68:6;;;14120:21:12;14177:2;14157:18;;;14150:30;14216:32;14196:18;;;14189:60;14266:18;;3584:68:6;13936:354:12;3584:68:6;1744:1:1::1;2325:7;;:19:::0;2317:63:::1;;;::::0;-1:-1:-1;;;2317:63:1;;14497:2:12;2317:63:1::1;::::0;::::1;14479:21:12::0;14536:2;14516:18;;;14509:30;14575:33;14555:18;;;14548:61;14626:18;;2317:63:1::1;14295:355:12::0;2317:63:1::1;1744:1;2455:7;:18:::0;13003:6:6;13011:5;;4921:11:::2;4905:12;::::0;::::2;;:27;::::0;::::2;;;;;;:::i;:::-;::::0;4901:76:::2;;4934:43;;-1:-1:-1::0;;;4934:43:6::2;;;;;;;:::i;4901:76::-;5004:13;4988:12;::::0;::::2;;:29;::::0;::::2;;;;;;:::i;:::-;::::0;4984:51:::2;;13033:18:::3;5816:23;::::0;;;:11:::3;:23;::::0;;:29;5803:9:::3;:42;5795:78;;;;-1:-1:-1::0;;;5795:78:6::3;;;;;;;:::i;:::-;5948:18:::4;5936:31;::::0;:11:::4;:31;::::0;:38;;::::4;;5935:39;5927:78;;;::::0;-1:-1:-1;;;5927:78:6;;24675:2:12;5927:78:6::4;::::0;::::4;24657:21:12::0;24714:2;24694:18;;;24687:30;24753:28;24733:18;;;24726:56;24799:18;;5927:78:6::4;24473:350:12::0;5927:78:6::4;719:10:2::0;6020:23:6::4;::::0;;;:9:::4;:23;::::0;;;;;::::4;;6019:24;6011:67;;;;-1:-1:-1::0;;;6011:67:6::4;;;;;;;:::i;:::-;719:10:2::0;6092:30:6::4;::::0;;;:16:::4;:30;::::0;;;;;::::4;;6084:80;;;;-1:-1:-1::0;;;6084:80:6::4;;;;;;;:::i;:::-;6419:26:::5;:14;1032:19:3::0;;1050:1;1032:19;;;945:123;6419:26:6::5;6499:18;6487:31;::::0;:11:::5;:31;::::0;:38;;6459:14:::5;918::3::0;6459:66:6::5;;6451:110;;;::::0;-1:-1:-1;;;6451:110:6;;20684:2:12;6451:110:6::5;::::0;::::5;20666:21:12::0;20723:2;20703:18;;;20696:30;20762:33;20742:18;;;20735:61;20813:18;;6451:110:6::5;20482:355:12::0;6451:110:6::5;13100:24:::6;13105:18;13100:4;:24::i;:::-;5027:1:::3;4984:51:::2;5055:14;5045:6;:24;;;;;;;;:::i;:::-;::::0;5041:694:::2;;5079:12;719:10:2::0;5104:30:6::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;5094:41;;;;;;5079:56;;5151:57;5170:12;;5151:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5184:17:6::2;::::0;;-1:-1:-1;5203:4:6;;-1:-1:-1;5151:18:6::2;:57::i;:::-;5143:92;;;::::0;-1:-1:-1;;;5143:92:6;;16917:2:12;5143:92:6::2;::::0;::::2;16899:21:12::0;16956:2;16936:18;;;16929:30;-1:-1:-1;;;16975:18:12;;;16968:52;17037:18;;5143:92:6::2;16715:346:12::0;5143:92:6::2;13033:18:::3;5816:23;::::0;;;:11:::3;:23;::::0;;:29;5803:9:::3;:42;5795:78;;;;-1:-1:-1::0;;;5795:78:6::3;;;;;;;:::i;:::-;5948:18:::4;5936:31;::::0;:11:::4;:31;::::0;:38;;::::4;;5935:39;5927:78;;;::::0;-1:-1:-1;;;5927:78:6;;24675:2:12;5927:78:6::4;::::0;::::4;24657:21:12::0;24714:2;24694:18;;;24687:30;24753:28;24733:18;;;24726:56;24799:18;;5927:78:6::4;24473:350:12::0;5927:78:6::4;719:10:2::0;6020:23:6::4;::::0;;;:9:::4;:23;::::0;;;;;::::4;;6019:24;6011:67;;;;-1:-1:-1::0;;;6011:67:6::4;;;;;;;:::i;:::-;719:10:2::0;6092:30:6::4;::::0;;;:16:::4;:30;::::0;;;;;::::4;;6084:80;;;;-1:-1:-1::0;;;6084:80:6::4;;;;;;;:::i;:::-;6419:26:::5;:14;1032:19:3::0;;1050:1;1032:19;;;945:123;6419:26:6::5;6499:18;6487:31;::::0;:11:::5;:31;::::0;:38;;6459:14:::5;918::3::0;6459:66:6::5;;6451:110;;;::::0;-1:-1:-1;;;6451:110:6;;20684:2:12;6451:110:6::5;::::0;::::5;20666:21:12::0;20723:2;20703:18;;;20696:30;20762:33;20742:18;;;20735:61;20813:18;;6451:110:6::5;20482:355:12::0;6451:110:6::5;13100:24:::6;13105:18;13100:4;:24::i;5041:694::-:2;5271:16;5261:6;:26;;;;;;;;:::i;:::-;::::0;5257:478:::2;;5297:12;719:10:2::0;5322:30:6::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;5312:41;;;;;;5297:56;;5369:59;5388:12;;5369:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5402:19:6::2;::::0;;-1:-1:-1;5423:4:6;;-1:-1:-1;5369:18:6::2;:59::i;:::-;5361:96;;;::::0;-1:-1:-1;;;5361:96:6;;17268:2:12;5361:96:6::2;::::0;::::2;17250:21:12::0;17307:2;17287:18;;;17280:30;-1:-1:-1;;;17326:18:12;;;17319:54;17390:18;;5361:96:6::2;17066:348:12::0;5257:478:6::2;5493:15;5483:6;:25;;;;;;;;:::i;:::-;::::0;5479:256:::2;;5518:12;719:10:2::0;5543:30:6::2;;;;;;;;:::i;:::-;;;;;;;;;;;;;5533:41;;;;;;5518:56;;5590:58;5609:12;;5590:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;::::0;;;;-1:-1:-1;;5623:18:6::2;::::0;;-1:-1:-1;5643:4:6;;-1:-1:-1;5590:18:6::2;:58::i;:::-;5582:94;;;::::0;-1:-1:-1;;;5582:94:6;;17621:2:12;5582:94:6::2;::::0;::::2;17603:21:12::0;17660:2;17640:18;;;17633:30;-1:-1:-1;;;17679:18:12;;;17672:53;17742:18;;5582:94:6::2;17419:347:12::0;10951:131:6;3344:3;;11021:4;;-1:-1:-1;;;;;3344:3:6;3340:199;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3379:23:6;3371:53;;;;-1:-1:-1;;;3371:53:6;;;;;;;:::i;:::-;3340:199;;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3453:23:6;;:46;;-1:-1:-1;3496:3:6;;-1:-1:-1;;;;;3496:3:6;719:10:2;-1:-1:-1;;;;;3480:19:6;;3453:46;3445:87;;;;-1:-1:-1;;;3445:87:6;;;;;;;:::i;:::-;-1:-1:-1;11033:14:6::1;:24:::0;;-1:-1:-1;;11033:24:6::1;;::::0;::::1;;;;::::0;;;10951:131::o;10208:102:7:-;10264:13;10296:7;10289:14;;;;;:::i;11218:65:6:-;1094:13:0;:11;:13::i;:::-;11262:3:6::1;:16:::0;;-1:-1:-1;;;;;;11262:16:6::1;::::0;;11218:65::o;13961:168::-;14065:8;2227:30:11;2248:8;2227:20;:30::i;:::-;14081:43:6::1;14105:8;14115;14081:23;:43::i;7824:195::-:0;1094:13:0;:11;:13::i;:::-;7919:9:6::1;7914:101;7934:21:::0;;::::1;7914:101;;;8004:4;7970:16;:31;7987:10;;7998:1;7987:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;7970:31:6::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;7970:31:6;:38;;-1:-1:-1;;7970:38:6::1;::::0;::::1;;::::0;;;::::1;::::0;;7957:3;::::1;::::0;::::1;:::i;:::-;;;;7914:101;;14792:294:::0;14944:4;-1:-1:-1;;;;;2054:18:11;;2062:10;2054:18;2050:81;;2088:32;2109:10;2088:20;:32::i;:::-;3727:21:6::1;::::0;;;:12:::1;:21;::::0;;;;:28;14960:7;;14969:2;;3727:28:::1;;:76:::0;::::1;;;-1:-1:-1::0;3801:1:6::1;3759:21:::0;;;:12:::1;:21;::::0;;;;:30;::::1;::::0;::::1;-1:-1:-1::0;;;;;3759:30:6::1;:44:::0;::::1;3727:76;3723:206;;;3821:21;::::0;;;:12:::1;:21;::::0;;;;:30;-1:-1:-1;;;;;3821:37:6;;::::1;:30;::::0;;::::1;;:37;3813:109;;;;-1:-1:-1::0;;;3813:109:6::1;;;;;;;:::i;:::-;14988:15:::2;::::0;;;::::2;;;14987:16;14979:49;;;::::0;-1:-1:-1;;;14979:49:6;;19094:2:12;14979:49:6::2;::::0;::::2;19076:21:12::0;19133:2;19113:18;;;19106:30;-1:-1:-1;;;19152:18:12;;;19145:50;19212:18;;14979:49:6::2;18892:344:12::0;14979:49:6::2;15034:47;15057:4;15063:2;15067:7;15076:4;15034:22;:47::i;:::-;2140:1:11::1;;14792:294:6::0;;;;;:::o;8226:147::-;1094:13:0;:11;:13::i;:::-;8300:12:6::1;::::0;::::1;;8290:22;::::0;::::1;;;;;;:::i;:::-;:6;:22;;;;;;;;:::i;:::-;::::0;8282:59:::1;;;::::0;-1:-1:-1;;;8282:59:6;;25436:2:12;8282:59:6::1;::::0;::::1;25418:21:12::0;25475:2;25455:18;;;25448:30;25514:26;25494:18;;;25487:54;25558:18;;8282:59:6::1;25234:348:12::0;8282:59:6::1;8347:12;:21:::0;;8362:6;;8347:12;-1:-1:-1;;8347:21:6::1;::::0;8362:6;8347:21:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;8226:147:::0;:::o;10411:313:7:-;10484:13;10514:16;10522:7;10514;:16::i;:::-;10509:59;;10539:29;;-1:-1:-1;;;10539:29:7;;;;;;;;;;;10509:59;10579:21;10603:10;:8;:10::i;:::-;10579:34;;10636:7;10630:21;10655:1;10630:26;:87;;;;;;;;;;;;;;;;;10683:7;10692:18;10702:7;10692:9;:18::i;:::-;10666:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;10630:87;10623:94;10411:313;-1:-1:-1;;;10411:313:7:o;11287:257:6:-;3344:3;;-1:-1:-1;;;;;3344:3:6;3340:199;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3379:23:6;3371:53;;;;-1:-1:-1;;;3371:53:6;;;;;;;:::i;:::-;3340:199;;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3453:23:6;;:46;;-1:-1:-1;3496:3:6;;-1:-1:-1;;;;;3496:3:6;719:10:2;-1:-1:-1;;;;;3480:19:6;;3453:46;3445:87;;;;-1:-1:-1;;;3445:87:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;11379:23:6;::::1;11371:69;;;::::0;-1:-1:-1;;;11371:69:6;;26264:2:12;11371:69:6::1;::::0;::::1;26246:21:12::0;26303:2;26283:18;;;26276:30;26342:34;26322:18;;;26315:62;-1:-1:-1;;;26393:18:12;;;26386:31;26434:19;;11371:69:6::1;26062:397:12::0;11371:69:6::1;11471:25;::::0;;;;::::1;::::0;;11480:4:::1;11471:25:::0;;-1:-1:-1;;;;;11471:25:6;;::::1;;::::0;;::::1;::::0;;;-1:-1:-1;11446:22:6;;;:12:::1;:22:::0;;;;;:50;;;;;;-1:-1:-1;;;;;;11446:50:6;;;;::::1;;-1:-1:-1::0;;;;;;11446:50:6;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;11507:32;;21719:25:12;;;21760:18;;;21753:83;;;;11507:32:6::1;::::0;21692:18:12;11507:32:6::1;;;;;;;;11287:257:::0;;:::o;10582:259::-;3344:3;;-1:-1:-1;;;;;3344:3:6;3340:199;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3379:23:6;3371:53;;;;-1:-1:-1;;;3371:53:6;;;;;;;:::i;:::-;3340:199;;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3453:23:6;;:46;;-1:-1:-1;3496:3:6;;-1:-1:-1;;;;;3496:3:6;719:10:2;-1:-1:-1;;;;;3480:19:6;;3453:46;3445:87;;;;-1:-1:-1;;;3445:87:6;;;;;;;:::i;:::-;10689:9;10670:16:::1;10730:107;10742:8;10738:1;:12;10730:107;;;10762:29;10778:9;;10788:1;10778:12;;;;;;;:::i;:::-;;;;;;;10762:15;:29::i;:::-;10819:3;;10730:107;;;10664:177;;10582:259:::0;;:::o;9446:95::-;1094:13:0;:11;:13::i;:::-;9517:19:6::1;:9;9529:7:::0;;9517:19:::1;:::i;11086:128::-:0;11152:4;1094:13:0;:11;:13::i;:::-;-1:-1:-1;11164:15:6::1;:25:::0;;-1:-1:-1;;11164:25:6::1;::::0;;::::1;;;;::::0;;;11086:128::o;2081:198:0:-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:0;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:0;;26666:2:12;2161:73:0::1;::::0;::::1;26648:21:12::0;26705:2;26685:18;;;26678:30;26744:34;26724:18;;;26717:62;-1:-1:-1;;;26795:18:12;;;26788:36;26841:19;;2161:73:0::1;26464:402:12::0;2161:73:0::1;2244:28;2263:8;2244:18;:28::i;10076:257:6:-:0;1094:13:0;:11;:13::i;:::-;10181:10:6;10162:16:::1;10204:125;10228:8;10224:1;:12;10204:125;;;10248:35;10269:10;;10280:1;10269:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;10248:35::-;10311:3;;10204:125;;10337:241:::0;3344:3;;-1:-1:-1;;;;;3344:3:6;3340:199;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3379:23:6;3371:53;;;;-1:-1:-1;;;3371:53:6;;;;;;;:::i;:::-;3340:199;;;1273:6:0;;-1:-1:-1;;;;;1273:6:0;719:10:2;3453:23:6;;:46;;-1:-1:-1;3496:3:6;;-1:-1:-1;;;;;3496:3:6;719:10:2;-1:-1:-1;;;;;3480:19:6;;3453:46;3445:87;;;;-1:-1:-1;;;3445:87:6;;;;;;;:::i;:::-;10416:17:::1;10424:8;10416:7;:17::i;:::-;10408:55;;;::::0;-1:-1:-1;;;10408:55:6;;22401:2:12;10408:55:6::1;::::0;::::1;22383:21:12::0;22440:2;22420:18;;;22413:30;-1:-1:-1;;;22459:18:12;;;22452:55;22524:18;;10408:55:6::1;22199:349:12::0;10408:55:6::1;10478:25;10494:8;10478:15;:25::i;:::-;10477:26;10469:76;;;;-1:-1:-1::0;;;10469:76:6::1;;;;;;;:::i;:::-;10552:21;10564:8;10552:11;:21::i;9816:256::-:0;1094:13:0;:11;:13::i;:::-;9920:10:6;9901:16:::1;9943:125;9967:8;9963:1;:12;9943:125;;;9987:35;10008:10;;10019:1;10008:13;;;;;;;:::i;9987:35::-;10050:3;;9943:125;;17693:277:7::0;17758:4;17812:7;13901:1:6;17793:26:7;;:65;;;;;17845:13;;17835:7;:23;17793:65;:151;;;;-1:-1:-1;;17895:26:7;;;;:17;:26;;;;;;-1:-1:-1;;;17895:44:7;:49;;17693:277::o;2281:412:11:-;836:42;2470:45;:49;2466:221;;2540:67;;-1:-1:-1;;;2540:67:11;;2591:4;2540:67;;;27106:34:12;-1:-1:-1;;;;;27176:15:12;;27156:18;;;27149:43;836:42:11;;2540;;27018:18:12;;2540:67:11;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2535:142;;2634:28;;-1:-1:-1;;;2634:28:11;;-1:-1:-1;;;;;2350:55:12;;2634:28:11;;;2332:74:12;2305:18;;2634:28:11;2186:226:12;15812:398:7;15900:13;15916:16;15924:7;15916;:16::i;:::-;15900:32;-1:-1:-1;719:10:2;-1:-1:-1;;;;;15947:28:7;;;15943:172;;15994:44;16011:5;719:10:2;17282:162:7;:::i;15994:44::-;15989:126;;16065:35;;-1:-1:-1;;;16065:35:7;;;;;;;;;;;15989:126;16125:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;16125:35:7;-1:-1:-1;;;;;16125:35:7;;;;;;;;;16175:28;;16125:24;;16175:28;;;;;;;15890:320;15812:398;;:::o;1359:130:0:-;1273:6;;-1:-1:-1;;;;;1273:6:0;719:10:2;1422:23:0;1414:68;;;;-1:-1:-1;;;1414:68:0;;27655:2:12;1414:68:0;;;27637:21:12;;;27674:18;;;27667:30;27733:34;27713:18;;;27706:62;27785:18;;1414:68:0;27453:356:12;12109:129:6;12159:10;5671:13:7;12193:40:6;12204:10;719::2;5671:13:7;12193:10:6;:40::i;1153:184:5:-;1274:4;1326;1297:25;1310:5;1317:4;1297:12;:25::i;:::-;:33;;1153:184;-1:-1:-1;;;;1153:184:5:o;6815:152:6:-;6856:7;6905:9;6926:16;6941:1;6926:12;:16;:::i;:::-;6888:73;;28149:2:12;28145:15;;;;-1:-1:-1;;28141:53:12;6888:73:6;;;28129:66:12;6916:27:6;28211:12:12;;;28204:28;6945:15:6;28248:12:12;;;28241:28;28285:12;;6888:73:6;;;;;;;;;;;;6878:84;;;;;;6871:91;;6815:152;:::o;19903:2764:7:-;20040:27;20070;20089:7;20070:18;:27::i;:::-;20040:57;;20153:4;-1:-1:-1;;;;;20112:45:7;20128:19;-1:-1:-1;;;;;20112:45:7;;20108:86;;20166:28;;-1:-1:-1;;;20166:28:7;;;;;;;;;;;20108:86;20206:27;19036:24;;;:15;:24;;;;;19260:26;;719:10:2;18673:30:7;;;-1:-1:-1;;;;;18370:28:7;;18651:20;;;18648:56;20389:179;;20481:43;20498:4;719:10:2;17282:162:7;:::i;20481:43::-;20476:92;;20533:35;;-1:-1:-1;;;20533:35:7;;;;;;;;;;;20476:92;-1:-1:-1;;;;;20583:16:7;;20579:52;;20608:23;;-1:-1:-1;;;20608:23:7;;;;;;;;;;;20579:52;20774:15;20771:157;;;20912:1;20891:19;20884:30;20771:157;-1:-1:-1;;;;;21300:24:7;;;;;;;:18;:24;;;;;;21298:26;;-1:-1:-1;;21298:26:7;;;21368:22;;;;;;;;;21366:24;;-1:-1:-1;21366:24:7;;;14703:11;14678:23;14674:41;14661:63;-1:-1:-1;;;14661:63:7;21654:26;;;;:17;:26;;;;;:172;;;;-1:-1:-1;;;21943:47:7;;:52;;21939:617;;22047:1;22037:11;;22015:19;22168:30;;;:17;:30;;;;;;:35;;22164:378;;22304:13;;22289:11;:28;22285:239;;22449:30;;;;:17;:30;;;;;:52;;;22285:239;21997:559;21939:617;22600:7;22596:2;-1:-1:-1;;;;;22581:27:7;22590:4;-1:-1:-1;;;;;22581:27:7;;;;;;;;;;;22618:42;10582:259:6;33423:110:7;33499:27;33509:2;33513:8;33499:27;;;;;;;;;;;;:9;:27::i;22758:187::-;22899:39;22916:4;22922:2;22926:7;22899:39;;;;;;;;;;;;:16;:39::i;11960:145:6:-;12029:10;5671:13:7;12063:37:6;12074:10;12086:9;5671:13:7;12063:10:6;:37::i;12515:1249:7:-;12582:7;12616;;13901:1:6;12662:23:7;12658:1042;;12714:13;;12707:4;:20;12703:997;;;12751:14;12768:23;;;:17;:23;;;;;;;-1:-1:-1;;;12855:24:7;;:29;;12851:831;;13510:111;13517:6;13527:1;13517:11;13510:111;;-1:-1:-1;;;13587:6:7;13569:25;;;;:17;:25;;;;;;13510:111;;12851:831;12729:971;12703:997;13726:31;;-1:-1:-1;;;13726:31:7;;;;;;;;;;;2433:187:0;2525:6;;;-1:-1:-1;;;;;2541:17:0;;;-1:-1:-1;;;;;;2541:17:0;;;;;;;2573:40;;2525:6;;;2541:17;2525:6;;2573:40;;2506:16;;2573:40;2496:124;2433:187;:::o;13173:310:6:-;13226:17;13264:20;;;:10;:20;;;;;;13246:15;:38;13291:133;;;;13340:25;:15;13358:7;13340:25;:::i;:::-;13317:20;;;;:10;:20;;;;;:48;13291:133;;;13386:20;;;;:10;:20;;;;;:31;;13410:7;;13386:20;:31;;13410:7;;13386:31;:::i;:::-;;;;-1:-1:-1;;13291:133:6;13457:20;;;;:10;:20;;;;;;;;;;13434:44;;28482:25:12;;;28523:18;;;28516:34;13434:44:6;;28455:18:12;13434:44:6;28308:248:12;16901:231:7;719:10:2;16995:39:7;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;16995:49:7;;;;;;;;;;;;:60;;-1:-1:-1;;16995:60:7;;;;;;;;;;17070:55;;540:41:12;;;16995:49:7;;719:10:2;17070:55:7;;513:18:12;17070:55:7;;;;;;;16901:231;;:::o;23526:396::-;23695:31;23708:4;23714:2;23718:7;23695:12;:31::i;:::-;-1:-1:-1;;;;;23740:14:7;;;:19;23736:180;;23778:56;23809:4;23815:2;23819:7;23828:5;23778:30;:56::i;:::-;23773:143;;23861:40;;-1:-1:-1;;;23861:40:7;;;;;;;;;;;13708:102:6;13768:13;13796:9;13789:16;;;;;:::i;39637:1708:7:-;39702:17;40130:4;40123;40117:11;40113:22;40220:1;40214:4;40207:15;40293:4;40290:1;40286:12;40279:19;;;40373:1;40368:3;40361:14;40474:3;40708:5;40690:419;40755:1;40750:3;40746:11;40739:18;;40923:2;40917:4;40913:13;40909:2;40905:22;40900:3;40892:36;41015:2;41005:13;;41070:25;40690:419;41070:25;-1:-1:-1;41137:13:7;;;-1:-1:-1;;41250:14:7;;;41310:19;;;41250:14;39637:1708;-1:-1:-1;39637:1708:7:o;12242:368:6:-;12329:23;12339:9;12350:1;12329:9;:23::i;:::-;-1:-1:-1;;;;;12358:20:6;;;;;;:9;:20;;;;;:27;;-1:-1:-1;;12358:27:6;12381:4;12358:27;;;;;;12418:10;;12396:32;;;;;;;:::i;:::-;:18;:32;12392:214;;12438:14;;;;:10;:14;;;;;;;:21;;-1:-1:-1;;12438:21:6;12455:4;12438:21;;;12472:18;;;;;12449:2;923:25:12;;911:2;896:18;;777:177;12472:18:6;;;;;;;;14133:157;;;:::o;12392:214::-;12528:25;:15;12546:7;12528:25;:::i;:::-;12511:14;;;;:10;:14;;;;;;;:42;;;12566:33;;;;;12522:2;;12511:42;28482:25:12;;;28538:2;28523:18;;28516:34;28470:2;28455:18;;28308:248;1991:290:5;2074:7;2116:4;2074:7;2130:116;2154:5;:12;2150:1;:16;2130:116;;;2202:33;2212:12;2226:5;2232:1;2226:8;;;;;;;;:::i;:::-;;;;;;;2202:9;:33::i;:::-;2187:48;-1:-1:-1;2168:3:5;;;;:::i;:::-;;;;2130:116;;;-1:-1:-1;2262:12:5;1991:290;-1:-1:-1;;;1991:290:5:o;32675:669:7:-;32801:19;32807:2;32811:8;32801:5;:19::i;:::-;-1:-1:-1;;;;;32859:14:7;;;:19;32855:473;;32898:11;32912:13;32959:14;;;32991:229;33021:62;33060:1;33064:2;33068:7;;;;;;33077:5;33021:30;:62::i;:::-;33016:165;;33118:40;;-1:-1:-1;;;33118:40:7;;;;;;;;;;;33016:165;33215:3;33207:5;:11;32991:229;;33300:3;33283:13;;:20;33279:34;;33305:8;;;33279:34;32880:448;;32675:669;;;:::o;25948:697::-;26126:88;;-1:-1:-1;;;26126:88:7;;26106:4;;-1:-1:-1;;;;;26126:45:7;;;;;:88;;719:10:2;;26193:4:7;;26199:7;;26208:5;;26126:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26126:88:7;;;;;;;;-1:-1:-1;;26126:88:7;;;;;;;;;;;;:::i;:::-;;;26122:517;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26404:6;:13;26421:1;26404:18;26400:229;;26449:40;;-1:-1:-1;;;26449:40:7;;;;;;;;;;;26400:229;26589:6;26583:13;26574:6;26570:2;26566:15;26559:38;26122:517;-1:-1:-1;;;;;;26282:64:7;-1:-1:-1;;;26282:64:7;;-1:-1:-1;25948:697:7;;;;;;:::o;8054:147:5:-;8117:7;8147:1;8143;:5;:51;;8275:13;8366:15;;;8401:4;8394:15;;;8447:4;8431:21;;8143:51;;;-1:-1:-1;8275:13:5;8366:15;;;8401:4;8394:15;8447:4;8431:21;;;8054:147::o;27091:2902:7:-;27163:20;27186:13;;;27213;;;27209:44;;27235:18;;-1:-1:-1;;;27235:18:7;;;;;;;;;;;27209:44;-1:-1:-1;;;;;27728:22:7;;;;;;:18;:22;;;;1495:2;27728:22;;;:71;;27766:32;27754:45;;27728:71;;;28035:31;;;:17;:31;;;;;-1:-1:-1;15123:15:7;;15097:24;15093:46;14703:11;14678:23;14674:41;14671:52;14661:63;;28035:170;;28264:23;;;;28035:31;;27728:22;;29016:25;27728:22;;28872:328;29520:1;29506:12;29502:20;29461:339;29560:3;29551:7;29548:16;29461:339;;29774:7;29764:8;29761:1;29734:25;29731:1;29728;29723:59;29612:1;29599:15;29461:339;;;29465:75;29831:8;29843:1;29831:13;29827:45;;29853:19;;-1:-1:-1;;;29853:19:7;;;;;;;;;;;29827:45;29887:13;:19;-1:-1:-1;14133:157:6;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:12;-1:-1:-1;;;;;;88:32:12;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:180::-;651:6;704:2;692:9;683:7;679:23;675:32;672:52;;;720:1;717;710:12;672:52;-1:-1:-1;743:23:12;;592:180;-1:-1:-1;592:180:12:o;959:127::-;1020:10;1015:3;1011:20;1008:1;1001:31;1051:4;1048:1;1041:15;1075:4;1072:1;1065:15;1091:339;1234:2;1219:18;;1267:1;1256:13;;1246:144;;1312:10;1307:3;1303:20;1300:1;1293:31;1347:4;1344:1;1337:15;1375:4;1372:1;1365:15;1246:144;1399:25;;;1091:339;:::o;1435:258::-;1507:1;1517:113;1531:6;1528:1;1525:13;1517:113;;;1607:11;;;1601:18;1588:11;;;1581:39;1553:2;1546:10;1517:113;;;1648:6;1645:1;1642:13;1639:48;;;-1:-1:-1;;1683:1:12;1665:16;;1658:27;1435:258::o;1698:::-;1740:3;1778:5;1772:12;1805:6;1800:3;1793:19;1821:63;1877:6;1870:4;1865:3;1861:14;1854:4;1847:5;1843:16;1821:63;:::i;:::-;1938:2;1917:15;-1:-1:-1;;1913:29:12;1904:39;;;;1945:4;1900:50;;1698:258;-1:-1:-1;;1698:258:12:o;1961:220::-;2110:2;2099:9;2092:21;2073:4;2130:45;2171:2;2160:9;2156:18;2148:6;2130:45;:::i;2417:196::-;2485:20;;-1:-1:-1;;;;;2534:54:12;;2524:65;;2514:93;;2603:1;2600;2593:12;2618:254;2686:6;2694;2747:2;2735:9;2726:7;2722:23;2718:32;2715:52;;;2763:1;2760;2753:12;2715:52;2786:29;2805:9;2786:29;:::i;:::-;2776:39;2862:2;2847:18;;;;2834:32;;-1:-1:-1;;;2618:254:12:o;2877:150::-;2952:20;;3001:1;2991:12;;2981:40;;3017:1;3014;3007:12;3032:275;3114:6;3122;3175:2;3163:9;3154:7;3150:23;3146:32;3143:52;;;3191:1;3188;3181:12;3143:52;3214:36;3240:9;3214:36;:::i;3312:147::-;3384:20;;3433:1;3423:12;;3413:40;;3449:1;3446;3439:12;3464:367;3527:8;3537:6;3591:3;3584:4;3576:6;3572:17;3568:27;3558:55;;3609:1;3606;3599:12;3558:55;-1:-1:-1;3632:20:12;;3675:18;3664:30;;3661:50;;;3707:1;3704;3697:12;3661:50;3744:4;3736:6;3732:17;3720:29;;3804:3;3797:4;3787:6;3784:1;3780:14;3772:6;3768:27;3764:38;3761:47;3758:67;;;3821:1;3818;3811:12;3758:67;3464:367;;;;;:::o;3836:526::-;3942:6;3950;3958;4011:2;3999:9;3990:7;3986:23;3982:32;3979:52;;;4027:1;4024;4017:12;3979:52;4050:33;4073:9;4050:33;:::i;:::-;4040:43;;4134:2;4123:9;4119:18;4106:32;4161:18;4153:6;4150:30;4147:50;;;4193:1;4190;4183:12;4147:50;4232:70;4294:7;4285:6;4274:9;4270:22;4232:70;:::i;:::-;3836:526;;4321:8;;-1:-1:-1;4206:96:12;;-1:-1:-1;;;;3836:526:12:o;4367:186::-;4426:6;4479:2;4467:9;4458:7;4454:23;4450:32;4447:52;;;4495:1;4492;4485:12;4447:52;4518:29;4537:9;4518:29;:::i;4558:127::-;4619:10;4614:3;4610:20;4607:1;4600:31;4650:4;4647:1;4640:15;4674:4;4671:1;4664:15;4690:275;4761:2;4755:9;4826:2;4807:13;;-1:-1:-1;;4803:27:12;4791:40;;4861:18;4846:34;;4882:22;;;4843:62;4840:88;;;4908:18;;:::i;:::-;4944:2;4937:22;4690:275;;-1:-1:-1;4690:275:12:o;4970:118::-;5056:5;5049:13;5042:21;5035:5;5032:32;5022:60;;5078:1;5075;5068:12;5093:642;5185:6;5238:2;5226:9;5217:7;5213:23;5209:32;5206:52;;;5254:1;5251;5244:12;5206:52;5287:2;5281:9;5329:2;5321:6;5317:15;5398:6;5386:10;5383:22;5362:18;5350:10;5347:34;5344:62;5341:88;;;5409:18;;:::i;:::-;5449:10;5445:2;5438:22;;5497:9;5484:23;5476:6;5469:39;5569:2;5558:9;5554:18;5541:32;5536:2;5528:6;5524:15;5517:57;5624:2;5613:9;5609:18;5596:32;5637:28;5659:5;5637:28;:::i;:::-;5693:2;5681:15;;5674:30;5685:6;5093:642;-1:-1:-1;;;5093:642:12:o;5922:328::-;5999:6;6007;6015;6068:2;6056:9;6047:7;6043:23;6039:32;6036:52;;;6084:1;6081;6074:12;6036:52;6107:29;6126:9;6107:29;:::i;:::-;6097:39;;6155:38;6189:2;6178:9;6174:18;6155:38;:::i;:::-;6145:48;;6240:2;6229:9;6225:18;6212:32;6202:42;;5922:328;;;;;:::o;6255:437::-;6341:6;6349;6402:2;6390:9;6381:7;6377:23;6373:32;6370:52;;;6418:1;6415;6408:12;6370:52;6458:9;6445:23;6491:18;6483:6;6480:30;6477:50;;;6523:1;6520;6513:12;6477:50;6562:70;6624:7;6615:6;6604:9;6600:22;6562:70;:::i;:::-;6651:8;;6536:96;;-1:-1:-1;6255:437:12;-1:-1:-1;;;;6255:437:12:o;6960:269::-;7039:6;7047;7100:2;7088:9;7079:7;7075:23;7071:32;7068:52;;;7116:1;7113;7106:12;7068:52;7139:33;7162:9;7139:33;:::i;7234:336::-;7313:6;7321;7374:2;7362:9;7353:7;7349:23;7345:32;7342:52;;;7390:1;7387;7380:12;7342:52;7413:36;7439:9;7413:36;:::i;:::-;7403:46;;7499:2;7488:9;7484:18;7471:32;7512:28;7534:5;7512:28;:::i;:::-;7559:5;7549:15;;;7234:336;;;;;:::o;7575:207::-;7648:6;7701:2;7689:9;7680:7;7676:23;7672:32;7669:52;;;7717:1;7714;7707:12;7669:52;7740:36;7766:9;7740:36;:::i;8121:573::-;8225:6;8233;8241;8249;8302:2;8290:9;8281:7;8277:23;8273:32;8270:52;;;8318:1;8315;8308:12;8270:52;8354:9;8341:23;8331:33;;8411:2;8400:9;8396:18;8383:32;8373:42;;8466:2;8455:9;8451:18;8438:32;8493:18;8485:6;8482:30;8479:50;;;8525:1;8522;8515:12;8479:50;8564:70;8626:7;8617:6;8606:9;8602:22;8564:70;:::i;:::-;8121:573;;;;-1:-1:-1;8653:8:12;-1:-1:-1;;;;8121:573:12:o;8884:241::-;8940:6;8993:2;8981:9;8972:7;8968:23;8964:32;8961:52;;;9009:1;9006;8999:12;8961:52;9048:9;9035:23;9067:28;9089:5;9067:28;:::i;9464:315::-;9529:6;9537;9590:2;9578:9;9569:7;9565:23;9561:32;9558:52;;;9606:1;9603;9596:12;9558:52;9629:29;9648:9;9629:29;:::i;9784:980::-;9879:6;9887;9895;9903;9956:3;9944:9;9935:7;9931:23;9927:33;9924:53;;;9973:1;9970;9963:12;9924:53;9996:29;10015:9;9996:29;:::i;:::-;9986:39;;10044:2;10065:38;10099:2;10088:9;10084:18;10065:38;:::i;:::-;10055:48;;10150:2;10139:9;10135:18;10122:32;10112:42;;10205:2;10194:9;10190:18;10177:32;10228:18;10269:2;10261:6;10258:14;10255:34;;;10285:1;10282;10275:12;10255:34;10323:6;10312:9;10308:22;10298:32;;10368:7;10361:4;10357:2;10353:13;10349:27;10339:55;;10390:1;10387;10380:12;10339:55;10426:2;10413:16;10448:2;10444;10441:10;10438:36;;;10454:18;;:::i;:::-;10496:53;10539:2;10520:13;;-1:-1:-1;;10516:27:12;10512:36;;10496:53;:::i;:::-;10483:66;;10572:2;10565:5;10558:17;10612:7;10607:2;10602;10598;10594:11;10590:20;10587:33;10584:53;;;10633:1;10630;10623:12;10584:53;10688:2;10683;10679;10675:11;10670:2;10663:5;10659:14;10646:45;10732:1;10727:2;10722;10715:5;10711:14;10707:23;10700:34;;10753:5;10743:15;;;;;9784:980;;;;;;;:::o;10769:201::-;10839:6;10892:2;10880:9;10871:7;10867:23;10863:32;10860:52;;;10908:1;10905;10898:12;10860:52;10931:33;10954:9;10931:33;:::i;10975:254::-;11043:6;11051;11104:2;11092:9;11083:7;11079:23;11075:32;11072:52;;;11120:1;11117;11110:12;11072:52;11156:9;11143:23;11133:33;;11185:38;11219:2;11208:9;11204:18;11185:38;:::i;:::-;11175:48;;10975:254;;;;;:::o;11988:592::-;12059:6;12067;12120:2;12108:9;12099:7;12095:23;12091:32;12088:52;;;12136:1;12133;12126:12;12088:52;12176:9;12163:23;12205:18;12246:2;12238:6;12235:14;12232:34;;;12262:1;12259;12252:12;12232:34;12300:6;12289:9;12285:22;12275:32;;12345:7;12338:4;12334:2;12330:13;12326:27;12316:55;;12367:1;12364;12357:12;12316:55;12407:2;12394:16;12433:2;12425:6;12422:14;12419:34;;;12449:1;12446;12439:12;12419:34;12494:7;12489:2;12480:6;12476:2;12472:15;12468:24;12465:37;12462:57;;;12515:1;12512;12505:12;12462:57;12546:2;12538:11;;;;;12568:6;;-1:-1:-1;11988:592:12;;-1:-1:-1;;;;11988:592:12:o;12585:260::-;12653:6;12661;12714:2;12702:9;12693:7;12689:23;12685:32;12682:52;;;12730:1;12727;12720:12;12682:52;12753:29;12772:9;12753:29;:::i;:::-;12743:39;;12801:38;12835:2;12824:9;12820:18;12801:38;:::i;13199:380::-;13278:1;13274:12;;;;13321;;;13342:61;;13396:4;13388:6;13384:17;13374:27;;13342:61;13449:2;13441:6;13438:14;13418:18;13415:38;13412:161;;13495:10;13490:3;13486:20;13483:1;13476:31;13530:4;13527:1;13520:15;13558:4;13555:1;13548:15;13412:161;;13199:380;;;:::o;14655:397::-;14857:2;14839:21;;;14896:2;14876:18;;;14869:30;14935:34;14930:2;14915:18;;14908:62;-1:-1:-1;;;15001:2:12;14986:18;;14979:31;15042:3;15027:19;;14655:397::o;15057:347::-;15259:2;15241:21;;;15298:2;15278:18;;;15271:30;15337:25;15332:2;15317:18;;15310:53;15395:2;15380:18;;15057:347::o;15763:354::-;15965:2;15947:21;;;16004:2;15984:18;;;15977:30;16043:32;16038:2;16023:18;;16016:60;16108:2;16093:18;;15763:354::o;16481:229::-;16630:2;16626:15;;;;-1:-1:-1;;16622:53:12;16610:66;;16701:2;16692:12;;16481:229::o;18464:423::-;18666:2;18648:21;;;18705:2;18685:18;;;18678:30;18744:34;18739:2;18724:18;;18717:62;18815:29;18810:2;18795:18;;18788:57;18877:3;18862:19;;18464:423::o;19241:127::-;19302:10;19297:3;19293:20;19290:1;19283:31;19333:4;19330:1;19323:15;19357:4;19354:1;19347:15;19373:128;19413:3;19444:1;19440:6;19437:1;19434:13;19431:39;;;19450:18;;:::i;:::-;-1:-1:-1;19486:9:12;;19373:128::o;20210:127::-;20271:10;20266:3;20262:20;20259:1;20252:31;20302:4;20299:1;20292:15;20326:4;20323:1;20316:15;20342:135;20381:3;20402:17;;;20399:43;;20422:18;;:::i;:::-;-1:-1:-1;20469:1:12;20458:13;;20342:135::o;20842:341::-;21044:2;21026:21;;;21083:2;21063:18;;;21056:30;-1:-1:-1;;;21117:2:12;21102:18;;21095:47;21174:2;21159:18;;20842:341::o;21188:352::-;21390:2;21372:21;;;21429:2;21409:18;;;21402:30;21468;21463:2;21448:18;;21441:58;21531:2;21516:18;;21188:352::o;22553:401::-;22755:2;22737:21;;;22794:2;22774:18;;;22767:30;22833:34;22828:2;22813:18;;22806:62;-1:-1:-1;;;22899:2:12;22884:18;;22877:35;22944:3;22929:19;;22553:401::o;24078:168::-;24118:7;24184:1;24180;24176:6;24172:14;24169:1;24166:21;24161:1;24154:9;24147:17;24143:45;24140:71;;;24191:18;;:::i;:::-;-1:-1:-1;24231:9:12;;24078:168::o;24251:217::-;24291:1;24317;24307:132;;24361:10;24356:3;24352:20;24349:1;24342:31;24396:4;24393:1;24386:15;24424:4;24421:1;24414:15;24307:132;-1:-1:-1;24453:9:12;;24251:217::o;24828:401::-;25030:2;25012:21;;;25069:2;25049:18;;;25042:30;25108:34;25103:2;25088:18;;25081:62;-1:-1:-1;;;25174:2:12;25159:18;;25152:35;25219:3;25204:19;;24828:401::o;25587:470::-;25766:3;25804:6;25798:13;25820:53;25866:6;25861:3;25854:4;25846:6;25842:17;25820:53;:::i;:::-;25936:13;;25895:16;;;;25958:57;25936:13;25895:16;25992:4;25980:17;;25958:57;:::i;:::-;26031:20;;25587:470;-1:-1:-1;;;;25587:470:12:o;27203:245::-;27270:6;27323:2;27311:9;27302:7;27298:23;27294:32;27291:52;;;27339:1;27336;27329:12;27291:52;27371:9;27365:16;27390:28;27412:5;27390:28;:::i;27814:125::-;27854:4;27882:1;27879;27876:8;27873:34;;;27887:18;;:::i;:::-;-1:-1:-1;27924:9:12;;27814:125::o;28561:512::-;28755:4;-1:-1:-1;;;;;28865:2:12;28857:6;28853:15;28842:9;28835:34;28917:2;28909:6;28905:15;28900:2;28889:9;28885:18;28878:43;;28957:6;28952:2;28941:9;28937:18;28930:34;29000:3;28995:2;28984:9;28980:18;28973:31;29021:46;29062:3;29051:9;29047:19;29039:6;29021:46;:::i;:::-;29013:54;28561:512;-1:-1:-1;;;;;;28561:512:12:o;29078:249::-;29147:6;29200:2;29188:9;29179:7;29175:23;29171:32;29168:52;;;29216:1;29213;29206:12;29168:52;29248:9;29242:16;29267:30;29291:5;29267:30;:::i

Swarm Source

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