ETH Price: $2,465.34 (-5.91%)

Token

Pyramids Collective (PC)
 

Overview

Max Total Supply

119 PC

Holders

113

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
allreasons.eth
Balance
1 PC
0x72bE0aeE75AFEb770Ae7565838FDdA70222713A6
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:
PyramidsCollective

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

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

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/access/Ownable.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/security/ReentrancyGuard.sol';
import '@openzeppelin/contracts/utils/cryptography/ECDSA.sol';
import '@openzeppelin/contracts/utils/cryptography/draft-EIP712.sol';
import './ERC721A.sol';

contract PyramidsCollective is Ownable, ERC721A, ReentrancyGuard, EIP712 {

    uint16 public immutable MAX_TEAM_SUPPLY = 150;
    uint16 public teamCounter = 0;

    string private constant SIGNING_DOMAIN = "PYRAMIDSCOLLECTIVE";
    string private constant SIGNATURE_VERSION = "1";

    address private immutable CEO_ADDRESS = 0xc4d13342A2A57AFaA21197C2DceF4e0D2E505329;
    string public baseTokenURI;

    uint8 public saleStage; // 0: PAUSED | 1: PRESALE | 2: PUBLIC SALE | 3: SOLDOUT

    mapping (uint => bool) public whitelistIdUsed;

    constructor() ERC721A('Pyramids Collective', 'PC', 20, 5000) EIP712(SIGNING_DOMAIN, SIGNATURE_VERSION) {
        saleStage = 0;
    }

    // UPDATE SALESTAGE

    function setSaleStage(uint8 _saleStage) external onlyOwner {
        require(saleStage != 3, "Cannot update if already reached soldout stage.");
        saleStage = _saleStage;
    }

    // PRESALE MINT

    function presale(uint _quantity, uint256 _id, bytes memory _signature) external payable nonReentrant {
        require(saleStage == 1, "Presale is not active.");
        require(!whitelistIdUsed[_id], "Whitelist ID has already been used.");
        require(check(_id, _signature) == owner(), "Wallet is not in presale whitelist.");
        require(_quantity <= 2, "Max presale mint at once exceeded.");
        require(balanceOf(msg.sender) + _quantity <= 2, "Would reach max NFT per holder in presale.");
        require(msg.value >= 0.06 ether * _quantity, "Not enough ETH.");
        require(totalSupply() + _quantity + (MAX_TEAM_SUPPLY-teamCounter) <= collectionSize, "Mint would exceed max supply.");

        _safeMint(msg.sender, _quantity);

        if (totalSupply() + (MAX_TEAM_SUPPLY-teamCounter) == collectionSize) {
            saleStage = 3;
        }

        whitelistIdUsed[_id] = true;
    }

    function check(uint256 _id, bytes memory _signature) public view returns (address) {
        return _verify(_id, _signature);
    }

    function _verify(uint256 _id, bytes memory _signature) internal view returns (address) {
        bytes32 digest = _hash(_id);
        return ECDSA.recover(digest, _signature);
    }

    function _hash(uint256 _id) internal view returns (bytes32) {
        return _hashTypedDataV4(keccak256(abi.encode(
            keccak256("Web3Struct(uint256 _id)"),
            _id
        )));
    }

    // PUBLIC MINT 

    function publicMint(uint _quantity) external payable nonReentrant {
        require(saleStage == 2, "Public sale is not active.");
        require(_quantity <= 10, "Max mint at once exceeded.");
        require(balanceOf(msg.sender) + _quantity <= 10, "Would reach max NFT per holder.");
        require(msg.value >= 0.08 ether * _quantity, "Not enough ETH.");
        require(totalSupply() + _quantity + (MAX_TEAM_SUPPLY-teamCounter) <= collectionSize, "Mint would exceed max supply.");

        _safeMint(msg.sender, _quantity);

        if (totalSupply() + (MAX_TEAM_SUPPLY-teamCounter) == collectionSize) {
            saleStage = 3;
        }
    }

    // TEAM MINT

    function teamMint(address _to, uint16 _quantity) external onlyOwner {
        require(teamCounter + _quantity <= MAX_TEAM_SUPPLY, "Would exceed max team supply.");
        _safeMint(_to, _quantity);
        teamCounter += _quantity;
    }
    
    // METADATA URI

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

    function setBaseTokenUri(string calldata _baseTokenURI) external onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function tokenURI(uint256 tokenId) public view override(ERC721A) returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexisting token");
        string memory base = _baseURI();
        return bytes(base).length > 0 ? string(abi.encodePacked(base, Strings.toString(tokenId), ".json")) : "https://gateway.pinata.cloud/ipfs/QmQ5MjPZVmGD31etVG337qDsE4dKUuKmsmxKsw9pt3geFg";
    }

    // WITHDRAW

    function withdraw() external onlyOwner {
        uint256 ethBalance = address(this).balance;
        payable(CEO_ADDRESS).transfer(ethBalance);
    }
}

File 2 of 15 : ERC721A.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol";
import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/utils/Context.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/introspection/ERC165.sol";

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

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    _approve(to, tokenId, owner);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

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

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

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

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

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

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

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

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

    uint256 updatedIndex = startTokenId;

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

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

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

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

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

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

    _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

  uint256 public nextOwnerToExplicitlySet = 0;

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

  /**
   * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
   * The call is not executed if the target address is not a contract.
   *
   * @param from address representing the previous owner of the given token ID
   * @param to target address that will receive the tokens
   * @param tokenId uint256 ID of the token to be transferred
   * @param _data bytes optional data to send along with the call
   * @return bool whether the call correctly returned the expected magic value
   */
  function _checkOnERC721Received(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) private returns (bool) {
    if (to.isContract()) {
      try
        IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data)
      returns (bytes4 retval) {
        return retval == IERC721Receiver(to).onERC721Received.selector;
      } catch (bytes memory reason) {
        if (reason.length == 0) {
          revert("ERC721A: transfer to non ERC721Receiver implementer");
        } else {
          assembly {
            revert(add(32, reason), mload(reason))
          }
        }
      }
    } else {
      return true;
    }
  }

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

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

File 3 of 15 : draft-EIP712.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/draft-EIP712.sol)

pragma solidity ^0.8.0;

import "./ECDSA.sol";

/**
 * @dev https://eips.ethereum.org/EIPS/eip-712[EIP 712] is a standard for hashing and signing of typed structured data.
 *
 * The encoding specified in the EIP is very generic, and such a generic implementation in Solidity is not feasible,
 * thus this contract does not implement the encoding itself. Protocols need to implement the type-specific encoding
 * they need in their contracts using a combination of `abi.encode` and `keccak256`.
 *
 * This contract implements the EIP 712 domain separator ({_domainSeparatorV4}) that is used as part of the encoding
 * scheme, and the final step of the encoding to obtain the message digest that is then signed via ECDSA
 * ({_hashTypedDataV4}).
 *
 * The implementation of the domain separator was designed to be as efficient as possible while still properly updating
 * the chain id to protect against replay attacks on an eventual fork of the chain.
 *
 * NOTE: This contract implements the version of the encoding known as "v4", as implemented by the JSON RPC method
 * https://docs.metamask.io/guide/signing-data.html[`eth_signTypedDataV4` in MetaMask].
 *
 * _Available since v3.4._
 */
abstract contract EIP712 {
    /* solhint-disable var-name-mixedcase */
    // Cache the domain separator as an immutable value, but also store the chain id that it corresponds to, in order to
    // invalidate the cached domain separator if the chain id changes.
    bytes32 private immutable _CACHED_DOMAIN_SEPARATOR;
    uint256 private immutable _CACHED_CHAIN_ID;
    address private immutable _CACHED_THIS;

    bytes32 private immutable _HASHED_NAME;
    bytes32 private immutable _HASHED_VERSION;
    bytes32 private immutable _TYPE_HASH;

    /* solhint-enable var-name-mixedcase */

    /**
     * @dev Initializes the domain separator and parameter caches.
     *
     * The meaning of `name` and `version` is specified in
     * https://eips.ethereum.org/EIPS/eip-712#definition-of-domainseparator[EIP 712]:
     *
     * - `name`: the user readable name of the signing domain, i.e. the name of the DApp or the protocol.
     * - `version`: the current major version of the signing domain.
     *
     * NOTE: These parameters cannot be changed except through a xref:learn::upgrading-smart-contracts.adoc[smart
     * contract upgrade].
     */
    constructor(string memory name, string memory version) {
        bytes32 hashedName = keccak256(bytes(name));
        bytes32 hashedVersion = keccak256(bytes(version));
        bytes32 typeHash = keccak256(
            "EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"
        );
        _HASHED_NAME = hashedName;
        _HASHED_VERSION = hashedVersion;
        _CACHED_CHAIN_ID = block.chainid;
        _CACHED_DOMAIN_SEPARATOR = _buildDomainSeparator(typeHash, hashedName, hashedVersion);
        _CACHED_THIS = address(this);
        _TYPE_HASH = typeHash;
    }

    /**
     * @dev Returns the domain separator for the current chain.
     */
    function _domainSeparatorV4() internal view returns (bytes32) {
        if (address(this) == _CACHED_THIS && block.chainid == _CACHED_CHAIN_ID) {
            return _CACHED_DOMAIN_SEPARATOR;
        } else {
            return _buildDomainSeparator(_TYPE_HASH, _HASHED_NAME, _HASHED_VERSION);
        }
    }

    function _buildDomainSeparator(
        bytes32 typeHash,
        bytes32 nameHash,
        bytes32 versionHash
    ) private view returns (bytes32) {
        return keccak256(abi.encode(typeHash, nameHash, versionHash, block.chainid, address(this)));
    }

    /**
     * @dev Given an already https://eips.ethereum.org/EIPS/eip-712#definition-of-hashstruct[hashed struct], this
     * function returns the hash of the fully encoded EIP712 message for this domain.
     *
     * This hash can be used together with {ECDSA-recover} to obtain the signer of a message. For example:
     *
     * ```solidity
     * bytes32 digest = _hashTypedDataV4(keccak256(abi.encode(
     *     keccak256("Mail(address to,string contents)"),
     *     mailTo,
     *     keccak256(bytes(mailContents))
     * )));
     * address signer = ECDSA.recover(digest, signature);
     * ```
     */
    function _hashTypedDataV4(bytes32 structHash) internal view virtual returns (bytes32) {
        return ECDSA.toTypedDataHash(_domainSeparatorV4(), structHash);
    }
}

File 4 of 15 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 5 of 15 : 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 15 : 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 15 : 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 8 of 15 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

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

pragma solidity ^0.8.0;

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

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

File 10 of 15 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 11 of 15 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 12 of 15 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

File 13 of 15 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 14 of 15 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

File 15 of 15 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_TEAM_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"check","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleStage","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseTokenUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_saleStage","type":"uint8"}],"name":"setSaleStage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamCounter","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint16","name":"_quantity","type":"uint16"}],"name":"teamMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"whitelistIdUsed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101c060405260006001556000600855609661ffff166101809061ffff1660f01b8152506000600a60006101000a81548161ffff021916908361ffff16021790555073c4d13342a2a57afaa21197c2dcef4e0d2e50532973ffffffffffffffffffffffffffffffffffffffff166101a09073ffffffffffffffffffffffffffffffffffffffff1660601b8152503480156200009957600080fd5b506040518060400160405280601281526020017f505952414d494453434f4c4c45435449564500000000000000000000000000008152506040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506040518060400160405280601381526020017f507972616d69647320436f6c6c656374697665000000000000000000000000008152506040518060400160405280600281526020017f50430000000000000000000000000000000000000000000000000000000000008152506014611388620001976200018b6200034a60201b60201c565b6200035260201b60201c565b60008111620001dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d49062000602565b60405180910390fd5b6000821162000223576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200021a90620005e0565b60405180910390fd5b83600290805190602001906200023b92919062000452565b5082600390805190602001906200025492919062000452565b508160a08181525050806080818152505050505050600160098190555060008280519060200120905060008280519060200120905060007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f90508261012081815250508161014081815250504660e08181525050620002db8184846200041660201b60201c565b60c081815250503073ffffffffffffffffffffffffffffffffffffffff166101008173ffffffffffffffffffffffffffffffffffffffff1660601b8152505080610160818152505050505050506000600c60006101000a81548160ff021916908360ff16021790555062000780565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600083838346306040516020016200043395949392919062000583565b6040516020818303038152906040528051906020012090509392505050565b82805462000460906200067d565b90600052602060002090601f016020900481019282620004845760008555620004d0565b82601f106200049f57805160ff1916838001178555620004d0565b82800160010185558215620004d0579182015b82811115620004cf578251825591602001919060010190620004b2565b5b509050620004df9190620004e3565b5090565b5b80821115620004fe576000816000905550600101620004e4565b5090565b6200050d8162000635565b82525050565b6200051e8162000649565b82525050565b60006200053360278362000624565b91506200054082620006e2565b604082019050919050565b60006200055a602e8362000624565b9150620005678262000731565b604082019050919050565b6200057d8162000673565b82525050565b600060a0820190506200059a600083018862000513565b620005a9602083018762000513565b620005b8604083018662000513565b620005c7606083018562000572565b620005d6608083018462000502565b9695505050505050565b60006020820190508181036000830152620005fb8162000524565b9050919050565b600060208201905081810360008301526200061d816200054b565b9050919050565b600082825260208201905092915050565b6000620006428262000653565b9050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060028204905060018216806200069657607f821691505b60208210811415620006ad57620006ac620006b3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a05160c05160e0516101005160601c6101205161014051610160516101805160f01c6101a05160601c6159fd6200084b6000396000611461015260008181610dc401528181610e8d0152818161110a015281816111d301528181611a6e0152611bd3015260006133ca0152600061340c015260006133eb01526000613320015260006133760152600061339f0152600081816124fc015281816125250152612bdc015260008181610d9201528181610e5b015281816110d801526111a101526159fd6000f3fe6080604052600436106101e35760003560e01c806370a0823111610102578063c87b56dd11610095578063def0c27511610064578063def0c275146106d6578063e57deb3914610701578063e985e9c51461073e578063f2fde38b1461077b576101e3565b8063c87b56dd1461061a578063ce65807914610657578063d547cfb714610680578063d7224ba0146106ab576101e3565b806395d89b41116100d157806395d89b4114610574578063a22cb4651461059f578063b44c5767146105c8578063b88d4fde146105f1576101e3565b806370a08231146104cc578063715018a6146105095780638da5cb5b1461052057806395652cfa1461054b576101e3565b80632f745c591161017a5780634aaca86d116101495780634aaca86d146103ea5780634f6ccce7146104155780636352211e14610452578063691c9c011461048f576101e3565b80632f745c591461034257806335eb2be21461037f5780633ccfd60b146103aa57806342842e0e146103c1576101e3565b806317bdb68f116101b657806317bdb68f146102b657806318160ddd146102d257806323b872dd146102fd5780632db1154414610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613a48565b6107a4565b60405161021c919061434a565b60405180910390f35b34801561023157600080fd5b5061023a6108ee565b6040516102479190614426565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613aef565b610980565b60405161028491906142e3565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613a08565b610a05565b005b6102d060048036038101906102cb9190613b78565b610b1e565b005b3480156102de57600080fd5b506102e7610f28565b6040516102f49190614903565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906138b2565b610f32565b005b610340600480360381019061033b9190613aef565b610f42565b005b34801561034e57600080fd5b5061036960048036038101906103649190613a08565b611240565b6040516103769190614903565b60405180910390f35b34801561038b57600080fd5b5061039461143e565b6040516103a191906148e8565b60405180910390f35b3480156103b657600080fd5b506103bf611452565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906138b2565b6114c9565b005b3480156103f657600080fd5b506103ff6114e9565b60405161040c919061491e565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613aef565b6114fc565b6040516104499190614903565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613aef565b61154f565b60405161048691906142e3565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190613aef565b611565565b6040516104c3919061434a565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613845565b611585565b6040516105009190614903565b60405180910390f35b34801561051557600080fd5b5061051e61166e565b005b34801561052c57600080fd5b50610535611682565b60405161054291906142e3565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613aa2565b6116ab565b005b34801561058057600080fd5b506105896116c9565b6040516105969190614426565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613988565b61175b565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613be7565b6118dc565b005b3480156105fd57600080fd5b5061061860048036038101906106139190613905565b611958565b005b34801561062657600080fd5b50610641600480360381019061063c9190613aef565b6119b4565b60405161064e9190614426565b60405180910390f35b34801561066357600080fd5b5061067e600480360381019061067991906139c8565b611a64565b005b34801561068c57600080fd5b50610695611b3d565b6040516106a29190614426565b60405180910390f35b3480156106b757600080fd5b506106c0611bcb565b6040516106cd9190614903565b60405180910390f35b3480156106e257600080fd5b506106eb611bd1565b6040516106f891906148e8565b60405180910390f35b34801561070d57600080fd5b5061072860048036038101906107239190613b1c565b611bf5565b60405161073591906142e3565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613872565b611c09565b604051610772919061434a565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613845565b611c9d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d757507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e757506108e682611d21565b5b9050919050565b6060600280546108fd90614cee565b80601f016020809104026020016040519081016040528092919081815260200182805461092990614cee565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b600061098b82611d8b565b6109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c1906148a8565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a108261154f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7890614768565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa0611d99565b73ffffffffffffffffffffffffffffffffffffffff161480610acf5750610ace81610ac9611d99565b611c09565b5b610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590614648565b60405180910390fd5b610b19838383611da1565b505050565b60026009541415610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90614868565b60405180910390fd5b60026009819055506001600c60009054906101000a900460ff1660ff1614610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614808565b60405180910390fd5b600d600083815260200190815260200160002060009054906101000a900460ff1615610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990614548565b60405180910390fd5b610c2a611682565b73ffffffffffffffffffffffffffffffffffffffff16610c4a8383611bf5565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790614508565b60405180910390fd5b6002831115610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906144a8565b60405180910390fd5b600283610cf033611585565b610cfa9190614a50565b1115610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290614568565b60405180910390fd5b8266d529ae9e860000610d4e9190614ad7565b341015610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614748565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000600a60009054906101000a900461ffff167f0000000000000000000000000000000000000000000000000000000000000000610ded9190614b65565b61ffff1684610dfa610f28565b610e049190614a50565b610e0e9190614a50565b1115610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690614488565b60405180910390fd5b610e593384611e53565b7f0000000000000000000000000000000000000000000000000000000000000000600a60009054906101000a900461ffff167f0000000000000000000000000000000000000000000000000000000000000000610eb69190614b65565b61ffff16610ec2610f28565b610ecc9190614a50565b1415610eef576003600c60006101000a81548160ff021916908360ff1602179055505b6001600d600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600981905550505050565b6000600154905090565b610f3d838383611e71565b505050565b60026009541415610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90614868565b60405180910390fd5b60026009819055506002600c60009054906101000a900460ff1660ff1614610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc90614588565b60405180910390fd5b600a811115611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090614788565b60405180910390fd5b600a8161103533611585565b61103f9190614a50565b1115611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107790614828565b60405180910390fd5b8067011c37937e0800006110949190614ad7565b3410156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614748565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000600a60009054906101000a900461ffff167f00000000000000000000000000000000000000000000000000000000000000006111339190614b65565b61ffff1682611140610f28565b61114a9190614a50565b6111549190614a50565b1115611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118c90614488565b60405180910390fd5b61119f3382611e53565b7f0000000000000000000000000000000000000000000000000000000000000000600a60009054906101000a900461ffff167f00000000000000000000000000000000000000000000000000000000000000006111fc9190614b65565b61ffff16611208610f28565b6112129190614a50565b1415611235576003600c60006101000a81548160ff021916908360ff1602179055505b600160098190555050565b600061124b83611585565b821061128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614468565b60405180910390fd5b6000611296610f28565b905060008060005b838110156113fc576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461139057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113e857868414156113d9578195505050505050611438565b83806113e490614d51565b9450505b5080806113f490614d51565b91505061129e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614848565b60405180910390fd5b92915050565b600a60009054906101000a900461ffff1681565b61145a61242a565b60004790507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114c5573d6000803e3d6000fd5b5050565b6114e483838360405180602001604052806000815250611958565b505050565b600c60009054906101000a900460ff1681565b6000611506610f28565b8210611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e906145a8565b60405180910390fd5b819050919050565b600061155a826124a8565b600001519050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90614668565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61167661242a565b61168060006126ab565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b361242a565b8181600b91906116c492919061360f565b505050565b6060600380546116d890614cee565b80601f016020809104026020016040519081016040528092919081815260200182805461170490614cee565b80156117515780601f1061172657610100808354040283529160200191611751565b820191906000526020600020905b81548152906001019060200180831161173457829003601f168201915b5050505050905090565b611763611d99565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890614708565b60405180910390fd5b80600760006117de611d99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188b611d99565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118d0919061434a565b60405180910390a35050565b6118e461242a565b6003600c60009054906101000a900460ff1660ff16141561193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906146a8565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b611963848484611e71565b61196f8484848461276f565b6119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a5906147a8565b60405180910390fd5b50505050565b60606119bf82611d8b565b6119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590614628565b60405180910390fd5b6000611a08612906565b90506000815111611a315760405180608001604052806050815260200161597860509139611a5c565b80611a3b84612998565b604051602001611a4c92919061427d565b6040516020818303038152906040525b915050919050565b611a6c61242a565b7f000000000000000000000000000000000000000000000000000000000000000061ffff1681600a60009054906101000a900461ffff16611aad9190614a18565b61ffff161115611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae9906145c8565b60405180910390fd5b611b00828261ffff16611e53565b80600a60008282829054906101000a900461ffff16611b1f9190614a18565b92506101000a81548161ffff021916908361ffff1602179055505050565b600b8054611b4a90614cee565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7690614cee565b8015611bc35780601f10611b9857610100808354040283529160200191611bc3565b820191906000526020600020905b815481529060010190602001808311611ba657829003601f168201915b505050505081565b60085481565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000611c018383612af9565b905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ca561242a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906144e8565b60405180910390fd5b611d1e816126ab565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e6d828260405180602001604052806000815250612b1a565b5050565b6000611e7c826124a8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ea3611d99565b73ffffffffffffffffffffffffffffffffffffffff161480611eff5750611ec8611d99565b73ffffffffffffffffffffffffffffffffffffffff16611ee784610980565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f1b5750611f1a8260000151611f15611d99565b611c09565b5b905080611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490614728565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906146c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561203f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612036906145e8565b60405180910390fd5b61204c8585856001612ffa565b61205c6000848460000151611da1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120ca9190614b31565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661216e91906149d2565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846122749190614a50565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123ba576122ea81611d8b565b156123b9576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124228686866001613000565b505050505050565b612432611d99565b73ffffffffffffffffffffffffffffffffffffffff16612450611682565b73ffffffffffffffffffffffffffffffffffffffff16146124a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249d906146e8565b60405180910390fd5b565b6124b0613695565b6124b982611d8b565b6124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614528565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000000831061255c5760017f00000000000000000000000000000000000000000000000000000000000000008461254f9190614b99565b6125599190614a50565b90505b60008390505b81811061266a576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612656578093505050506126a6565b50808061266290614cc4565b915050612562565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614888565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006127908473ffffffffffffffffffffffffffffffffffffffff16613006565b156128f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b9611d99565b8786866040518563ffffffff1660e01b81526004016127db94939291906142fe565b602060405180830381600087803b1580156127f557600080fd5b505af192505050801561282657506040513d601f19601f820116820180604052508101906128239190613a75565b60015b6128a9573d8060008114612856576040519150601f19603f3d011682016040523d82523d6000602084013e61285b565b606091505b506000815114156128a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612898906147a8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128fe565b600190505b949350505050565b6060600b805461291590614cee565b80601f016020809104026020016040519081016040528092919081815260200182805461294190614cee565b801561298e5780601f106129635761010080835404028352916020019161298e565b820191906000526020600020905b81548152906001019060200180831161297157829003601f168201915b5050505050905090565b606060008214156129e0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612af4565b600082905060005b60008214612a125780806129fb90614d51565b915050600a82612a0b9190614aa6565b91506129e8565b60008167ffffffffffffffff811115612a2e57612a2d614ec0565b5b6040519080825280601f01601f191660200182016040528015612a605781602001600182028036833780820191505090505b5090505b60008514612aed57600182612a799190614b99565b9150600a85612a889190614da4565b6030612a949190614a50565b60f81b818381518110612aaa57612aa9614e91565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ae69190614aa6565b9450612a64565b8093505050505b919050565b600080612b0584613029565b9050612b118184613083565b91505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b88906147e8565b60405180910390fd5b612b9a81611d8b565b15612bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd1906147c8565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000000831115612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c34906148c8565b60405180910390fd5b612c4a6000858386612ffa565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612d4791906149d2565b6fffffffffffffffffffffffffffffffff168152602001858360200151612d6e91906149d2565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612fdd57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7d600088848861276f565b612fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb3906147a8565b60405180910390fd5b8180612fc790614d51565b9250508080612fd590614d51565b915050612f0c565b5080600181905550612ff26000878588613000565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061307c7f1595fc2d92812a861b044f881265f9b2b3385b9154801106bd324124636674f3836040516020016130619291906143b8565b604051602081830303815290604052805190602001206130aa565b9050919050565b600080600061309285856130c4565b9150915061309f81613147565b819250505092915050565b60006130bd6130b761331c565b83613436565b9050919050565b6000806041835114156131065760008060006020860151925060408601519150606086015160001a90506130fa87828585613469565b94509450505050613140565b60408351141561313757600080602085015191506040850151905061312c868383613576565b935093505050613140565b60006002915091505b9250929050565b6000600481111561315b5761315a614e33565b5b81600481111561316e5761316d614e33565b5b141561317957613319565b6001600481111561318d5761318c614e33565b5b8160048111156131a05761319f614e33565b5b14156131e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d890614448565b60405180910390fd5b600260048111156131f5576131f4614e33565b5b81600481111561320857613207614e33565b5b1415613249576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613240906144c8565b60405180910390fd5b6003600481111561325d5761325c614e33565b5b8160048111156132705761326f614e33565b5b14156132b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a890614608565b60405180910390fd5b6004808111156132c4576132c3614e33565b5b8160048111156132d7576132d6614e33565b5b1415613318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330f90614688565b60405180910390fd5b5b50565b60007f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561339857507f000000000000000000000000000000000000000000000000000000000000000046145b156133c5577f00000000000000000000000000000000000000000000000000000000000000009050613433565b6134307f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000006135d5565b90505b90565b6000828260405160200161344b9291906142ac565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134a457600060039150915061356d565b601b8560ff16141580156134bc5750601c8560ff1614155b156134ce57600060049150915061356d565b6000600187878787604051600081526020016040526040516134f394939291906143e1565b6020604051602081039080840390855afa158015613515573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135645760006001925092505061356d565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135b99190614a50565b90506135c787828885613469565b935093505050935093915050565b600083838346306040516020016135f0959493929190614365565b6040516020818303038152906040528051906020012090509392505050565b82805461361b90614cee565b90600052602060002090601f01602090048101928261363d5760008555613684565b82601f1061365657803560ff1916838001178555613684565b82800160010185558215613684579182015b82811115613683578235825591602001919060010190613668565b5b50905061369191906136cf565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136e85760008160009055506001016136d0565b5090565b60006136ff6136fa8461495e565b614939565b90508281526020810184848401111561371b5761371a614efe565b5b613726848285614c82565b509392505050565b60008135905061373d816158ed565b92915050565b60008135905061375281615904565b92915050565b6000813590506137678161591b565b92915050565b60008151905061377c8161591b565b92915050565b600082601f83011261379757613796614ef4565b5b81356137a78482602086016136ec565b91505092915050565b60008083601f8401126137c6576137c5614ef4565b5b8235905067ffffffffffffffff8111156137e3576137e2614eef565b5b6020830191508360018202830111156137ff576137fe614ef9565b5b9250929050565b60008135905061381581615932565b92915050565b60008135905061382a81615949565b92915050565b60008135905061383f81615960565b92915050565b60006020828403121561385b5761385a614f08565b5b60006138698482850161372e565b91505092915050565b6000806040838503121561388957613888614f08565b5b60006138978582860161372e565b92505060206138a88582860161372e565b9150509250929050565b6000806000606084860312156138cb576138ca614f08565b5b60006138d98682870161372e565b93505060206138ea8682870161372e565b92505060406138fb8682870161381b565b9150509250925092565b6000806000806080858703121561391f5761391e614f08565b5b600061392d8782880161372e565b945050602061393e8782880161372e565b935050604061394f8782880161381b565b925050606085013567ffffffffffffffff8111156139705761396f614f03565b5b61397c87828801613782565b91505092959194509250565b6000806040838503121561399f5761399e614f08565b5b60006139ad8582860161372e565b92505060206139be85828601613743565b9150509250929050565b600080604083850312156139df576139de614f08565b5b60006139ed8582860161372e565b92505060206139fe85828601613806565b9150509250929050565b60008060408385031215613a1f57613a1e614f08565b5b6000613a2d8582860161372e565b9250506020613a3e8582860161381b565b9150509250929050565b600060208284031215613a5e57613a5d614f08565b5b6000613a6c84828501613758565b91505092915050565b600060208284031215613a8b57613a8a614f08565b5b6000613a998482850161376d565b91505092915050565b60008060208385031215613ab957613ab8614f08565b5b600083013567ffffffffffffffff811115613ad757613ad6614f03565b5b613ae3858286016137b0565b92509250509250929050565b600060208284031215613b0557613b04614f08565b5b6000613b138482850161381b565b91505092915050565b60008060408385031215613b3357613b32614f08565b5b6000613b418582860161381b565b925050602083013567ffffffffffffffff811115613b6257613b61614f03565b5b613b6e85828601613782565b9150509250929050565b600080600060608486031215613b9157613b90614f08565b5b6000613b9f8682870161381b565b9350506020613bb08682870161381b565b925050604084013567ffffffffffffffff811115613bd157613bd0614f03565b5b613bdd86828701613782565b9150509250925092565b600060208284031215613bfd57613bfc614f08565b5b6000613c0b84828501613830565b91505092915050565b613c1d81614bcd565b82525050565b613c2c81614bdf565b82525050565b613c3b81614beb565b82525050565b613c52613c4d82614beb565b614d9a565b82525050565b6000613c638261498f565b613c6d81856149a5565b9350613c7d818560208601614c91565b613c8681614f0d565b840191505092915050565b6000613c9c8261499a565b613ca681856149b6565b9350613cb6818560208601614c91565b613cbf81614f0d565b840191505092915050565b6000613cd58261499a565b613cdf81856149c7565b9350613cef818560208601614c91565b80840191505092915050565b6000613d086018836149b6565b9150613d1382614f1e565b602082019050919050565b6000613d2b6022836149b6565b9150613d3682614f47565b604082019050919050565b6000613d4e601d836149b6565b9150613d5982614f96565b602082019050919050565b6000613d716022836149b6565b9150613d7c82614fbf565b604082019050919050565b6000613d94601f836149b6565b9150613d9f8261500e565b602082019050919050565b6000613db76026836149b6565b9150613dc282615037565b604082019050919050565b6000613dda6023836149b6565b9150613de582615086565b604082019050919050565b6000613dfd602a836149b6565b9150613e08826150d5565b604082019050919050565b6000613e206002836149c7565b9150613e2b82615124565b600282019050919050565b6000613e436023836149b6565b9150613e4e8261514d565b604082019050919050565b6000613e66602a836149b6565b9150613e718261519c565b604082019050919050565b6000613e89601a836149b6565b9150613e94826151eb565b602082019050919050565b6000613eac6023836149b6565b9150613eb782615214565b604082019050919050565b6000613ecf601d836149b6565b9150613eda82615263565b602082019050919050565b6000613ef26025836149b6565b9150613efd8261528c565b604082019050919050565b6000613f156022836149b6565b9150613f20826152db565b604082019050919050565b6000613f38602f836149b6565b9150613f438261532a565b604082019050919050565b6000613f5b6039836149b6565b9150613f6682615379565b604082019050919050565b6000613f7e602b836149b6565b9150613f89826153c8565b604082019050919050565b6000613fa16022836149b6565b9150613fac82615417565b604082019050919050565b6000613fc4602f836149b6565b9150613fcf82615466565b604082019050919050565b6000613fe76026836149b6565b9150613ff2826154b5565b604082019050919050565b600061400a6005836149c7565b915061401582615504565b600582019050919050565b600061402d6020836149b6565b91506140388261552d565b602082019050919050565b6000614050601a836149b6565b915061405b82615556565b602082019050919050565b60006140736032836149b6565b915061407e8261557f565b604082019050919050565b6000614096600f836149b6565b91506140a1826155ce565b602082019050919050565b60006140b96022836149b6565b91506140c4826155f7565b604082019050919050565b60006140dc601a836149b6565b91506140e782615646565b602082019050919050565b60006140ff6033836149b6565b915061410a8261566f565b604082019050919050565b6000614122601d836149b6565b915061412d826156be565b602082019050919050565b60006141456021836149b6565b9150614150826156e7565b604082019050919050565b60006141686016836149b6565b915061417382615736565b602082019050919050565b600061418b601f836149b6565b91506141968261575f565b602082019050919050565b60006141ae602e836149b6565b91506141b982615788565b604082019050919050565b60006141d1601f836149b6565b91506141dc826157d7565b602082019050919050565b60006141f4602f836149b6565b91506141ff82615800565b604082019050919050565b6000614217602d836149b6565b91506142228261584f565b604082019050919050565b600061423a6022836149b6565b91506142458261589e565b604082019050919050565b61425981614c3d565b82525050565b61426881614c6b565b82525050565b61427781614c75565b82525050565b60006142898285613cca565b91506142958284613cca565b91506142a082613ffd565b91508190509392505050565b60006142b782613e13565b91506142c38285613c41565b6020820191506142d38284613c41565b6020820191508190509392505050565b60006020820190506142f86000830184613c14565b92915050565b60006080820190506143136000830187613c14565b6143206020830186613c14565b61432d604083018561425f565b818103606083015261433f8184613c58565b905095945050505050565b600060208201905061435f6000830184613c23565b92915050565b600060a08201905061437a6000830188613c32565b6143876020830187613c32565b6143946040830186613c32565b6143a1606083018561425f565b6143ae6080830184613c14565b9695505050505050565b60006040820190506143cd6000830185613c32565b6143da602083018461425f565b9392505050565b60006080820190506143f66000830187613c32565b614403602083018661426e565b6144106040830185613c32565b61441d6060830184613c32565b95945050505050565b600060208201905081810360008301526144408184613c91565b905092915050565b6000602082019050818103600083015261446181613cfb565b9050919050565b6000602082019050818103600083015261448181613d1e565b9050919050565b600060208201905081810360008301526144a181613d41565b9050919050565b600060208201905081810360008301526144c181613d64565b9050919050565b600060208201905081810360008301526144e181613d87565b9050919050565b6000602082019050818103600083015261450181613daa565b9050919050565b6000602082019050818103600083015261452181613dcd565b9050919050565b6000602082019050818103600083015261454181613df0565b9050919050565b6000602082019050818103600083015261456181613e36565b9050919050565b6000602082019050818103600083015261458181613e59565b9050919050565b600060208201905081810360008301526145a181613e7c565b9050919050565b600060208201905081810360008301526145c181613e9f565b9050919050565b600060208201905081810360008301526145e181613ec2565b9050919050565b6000602082019050818103600083015261460181613ee5565b9050919050565b6000602082019050818103600083015261462181613f08565b9050919050565b6000602082019050818103600083015261464181613f2b565b9050919050565b6000602082019050818103600083015261466181613f4e565b9050919050565b6000602082019050818103600083015261468181613f71565b9050919050565b600060208201905081810360008301526146a181613f94565b9050919050565b600060208201905081810360008301526146c181613fb7565b9050919050565b600060208201905081810360008301526146e181613fda565b9050919050565b6000602082019050818103600083015261470181614020565b9050919050565b6000602082019050818103600083015261472181614043565b9050919050565b6000602082019050818103600083015261474181614066565b9050919050565b6000602082019050818103600083015261476181614089565b9050919050565b60006020820190508181036000830152614781816140ac565b9050919050565b600060208201905081810360008301526147a1816140cf565b9050919050565b600060208201905081810360008301526147c1816140f2565b9050919050565b600060208201905081810360008301526147e181614115565b9050919050565b6000602082019050818103600083015261480181614138565b9050919050565b600060208201905081810360008301526148218161415b565b9050919050565b600060208201905081810360008301526148418161417e565b9050919050565b60006020820190508181036000830152614861816141a1565b9050919050565b60006020820190508181036000830152614881816141c4565b9050919050565b600060208201905081810360008301526148a1816141e7565b9050919050565b600060208201905081810360008301526148c18161420a565b9050919050565b600060208201905081810360008301526148e18161422d565b9050919050565b60006020820190506148fd6000830184614250565b92915050565b6000602082019050614918600083018461425f565b92915050565b6000602082019050614933600083018461426e565b92915050565b6000614943614954565b905061494f8282614d20565b919050565b6000604051905090565b600067ffffffffffffffff82111561497957614978614ec0565b5b61498282614f0d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149dd82614c21565b91506149e883614c21565b9250826fffffffffffffffffffffffffffffffff03821115614a0d57614a0c614dd5565b5b828201905092915050565b6000614a2382614c3d565b9150614a2e83614c3d565b92508261ffff03821115614a4557614a44614dd5565b5b828201905092915050565b6000614a5b82614c6b565b9150614a6683614c6b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a9b57614a9a614dd5565b5b828201905092915050565b6000614ab182614c6b565b9150614abc83614c6b565b925082614acc57614acb614e04565b5b828204905092915050565b6000614ae282614c6b565b9150614aed83614c6b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b2657614b25614dd5565b5b828202905092915050565b6000614b3c82614c21565b9150614b4783614c21565b925082821015614b5a57614b59614dd5565b5b828203905092915050565b6000614b7082614c3d565b9150614b7b83614c3d565b925082821015614b8e57614b8d614dd5565b5b828203905092915050565b6000614ba482614c6b565b9150614baf83614c6b565b925082821015614bc257614bc1614dd5565b5b828203905092915050565b6000614bd882614c4b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614caf578082015181840152602081019050614c94565b83811115614cbe576000848401525b50505050565b6000614ccf82614c6b565b91506000821415614ce357614ce2614dd5565b5b600182039050919050565b60006002820490506001821680614d0657607f821691505b60208210811415614d1a57614d19614e62565b5b50919050565b614d2982614f0d565b810181811067ffffffffffffffff82111715614d4857614d47614ec0565b5b80604052505050565b6000614d5c82614c6b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d8f57614d8e614dd5565b5b600182019050919050565b6000819050919050565b6000614daf82614c6b565b9150614dba83614c6b565b925082614dca57614dc9614e04565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c792e000000600082015250565b7f4d61782070726573616c65206d696e74206174206f6e6365206578636565646560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f7420696e2070726573616c652077686974656c6960008201527f73742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f57686974656c6973742049442068617320616c7265616479206265656e20757360008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f576f756c64207265616368206d6178204e46542070657220686f6c646572206960008201527f6e2070726573616c652e00000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f576f756c6420657863656564206d6178207465616d20737570706c792e000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374696e6720746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742075706461746520696620616c7265616479207265616368656460008201527f20736f6c646f75742073746167652e0000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204554482e0000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e74206174206f6e63652065786365656465642e000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b7f576f756c64207265616368206d6178204e46542070657220686f6c6465722e00600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6158f681614bcd565b811461590157600080fd5b50565b61590d81614bdf565b811461591857600080fd5b50565b61592481614bf5565b811461592f57600080fd5b50565b61593b81614c3d565b811461594657600080fd5b50565b61595281614c6b565b811461595d57600080fd5b50565b61596981614c75565b811461597457600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d51354d6a505a566d47443331657456473333377144734534644b55754b6d736d784b73773970743367654667a26469706673582212206f88b56b92fc4f5ba199724f13a74273e7dd0301ba291381d106459e31bafe9564736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c806370a0823111610102578063c87b56dd11610095578063def0c27511610064578063def0c275146106d6578063e57deb3914610701578063e985e9c51461073e578063f2fde38b1461077b576101e3565b8063c87b56dd1461061a578063ce65807914610657578063d547cfb714610680578063d7224ba0146106ab576101e3565b806395d89b41116100d157806395d89b4114610574578063a22cb4651461059f578063b44c5767146105c8578063b88d4fde146105f1576101e3565b806370a08231146104cc578063715018a6146105095780638da5cb5b1461052057806395652cfa1461054b576101e3565b80632f745c591161017a5780634aaca86d116101495780634aaca86d146103ea5780634f6ccce7146104155780636352211e14610452578063691c9c011461048f576101e3565b80632f745c591461034257806335eb2be21461037f5780633ccfd60b146103aa57806342842e0e146103c1576101e3565b806317bdb68f116101b657806317bdb68f146102b657806318160ddd146102d257806323b872dd146102fd5780632db1154414610326576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613a48565b6107a4565b60405161021c919061434a565b60405180910390f35b34801561023157600080fd5b5061023a6108ee565b6040516102479190614426565b60405180910390f35b34801561025c57600080fd5b5061027760048036038101906102729190613aef565b610980565b60405161028491906142e3565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190613a08565b610a05565b005b6102d060048036038101906102cb9190613b78565b610b1e565b005b3480156102de57600080fd5b506102e7610f28565b6040516102f49190614903565b60405180910390f35b34801561030957600080fd5b50610324600480360381019061031f91906138b2565b610f32565b005b610340600480360381019061033b9190613aef565b610f42565b005b34801561034e57600080fd5b5061036960048036038101906103649190613a08565b611240565b6040516103769190614903565b60405180910390f35b34801561038b57600080fd5b5061039461143e565b6040516103a191906148e8565b60405180910390f35b3480156103b657600080fd5b506103bf611452565b005b3480156103cd57600080fd5b506103e860048036038101906103e391906138b2565b6114c9565b005b3480156103f657600080fd5b506103ff6114e9565b60405161040c919061491e565b60405180910390f35b34801561042157600080fd5b5061043c60048036038101906104379190613aef565b6114fc565b6040516104499190614903565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613aef565b61154f565b60405161048691906142e3565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190613aef565b611565565b6040516104c3919061434a565b60405180910390f35b3480156104d857600080fd5b506104f360048036038101906104ee9190613845565b611585565b6040516105009190614903565b60405180910390f35b34801561051557600080fd5b5061051e61166e565b005b34801561052c57600080fd5b50610535611682565b60405161054291906142e3565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190613aa2565b6116ab565b005b34801561058057600080fd5b506105896116c9565b6040516105969190614426565b60405180910390f35b3480156105ab57600080fd5b506105c660048036038101906105c19190613988565b61175b565b005b3480156105d457600080fd5b506105ef60048036038101906105ea9190613be7565b6118dc565b005b3480156105fd57600080fd5b5061061860048036038101906106139190613905565b611958565b005b34801561062657600080fd5b50610641600480360381019061063c9190613aef565b6119b4565b60405161064e9190614426565b60405180910390f35b34801561066357600080fd5b5061067e600480360381019061067991906139c8565b611a64565b005b34801561068c57600080fd5b50610695611b3d565b6040516106a29190614426565b60405180910390f35b3480156106b757600080fd5b506106c0611bcb565b6040516106cd9190614903565b60405180910390f35b3480156106e257600080fd5b506106eb611bd1565b6040516106f891906148e8565b60405180910390f35b34801561070d57600080fd5b5061072860048036038101906107239190613b1c565b611bf5565b60405161073591906142e3565b60405180910390f35b34801561074a57600080fd5b5061076560048036038101906107609190613872565b611c09565b604051610772919061434a565b60405180910390f35b34801561078757600080fd5b506107a2600480360381019061079d9190613845565b611c9d565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061086f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108d757507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108e757506108e682611d21565b5b9050919050565b6060600280546108fd90614cee565b80601f016020809104026020016040519081016040528092919081815260200182805461092990614cee565b80156109765780601f1061094b57610100808354040283529160200191610976565b820191906000526020600020905b81548152906001019060200180831161095957829003601f168201915b5050505050905090565b600061098b82611d8b565b6109ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c1906148a8565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a108261154f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a7890614768565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610aa0611d99565b73ffffffffffffffffffffffffffffffffffffffff161480610acf5750610ace81610ac9611d99565b611c09565b5b610b0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0590614648565b60405180910390fd5b610b19838383611da1565b505050565b60026009541415610b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5b90614868565b60405180910390fd5b60026009819055506001600c60009054906101000a900460ff1660ff1614610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614808565b60405180910390fd5b600d600083815260200190815260200160002060009054906101000a900460ff1615610c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1990614548565b60405180910390fd5b610c2a611682565b73ffffffffffffffffffffffffffffffffffffffff16610c4a8383611bf5565b73ffffffffffffffffffffffffffffffffffffffff1614610ca0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9790614508565b60405180910390fd5b6002831115610ce4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cdb906144a8565b60405180910390fd5b600283610cf033611585565b610cfa9190614a50565b1115610d3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d3290614568565b60405180910390fd5b8266d529ae9e860000610d4e9190614ad7565b341015610d90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8790614748565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001388600a60009054906101000a900461ffff167f0000000000000000000000000000000000000000000000000000000000000096610ded9190614b65565b61ffff1684610dfa610f28565b610e049190614a50565b610e0e9190614a50565b1115610e4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4690614488565b60405180910390fd5b610e593384611e53565b7f0000000000000000000000000000000000000000000000000000000000001388600a60009054906101000a900461ffff167f0000000000000000000000000000000000000000000000000000000000000096610eb69190614b65565b61ffff16610ec2610f28565b610ecc9190614a50565b1415610eef576003600c60006101000a81548160ff021916908360ff1602179055505b6001600d600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506001600981905550505050565b6000600154905090565b610f3d838383611e71565b505050565b60026009541415610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90614868565b60405180910390fd5b60026009819055506002600c60009054906101000a900460ff1660ff1614610fe5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fdc90614588565b60405180910390fd5b600a811115611029576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102090614788565b60405180910390fd5b600a8161103533611585565b61103f9190614a50565b1115611080576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107790614828565b60405180910390fd5b8067011c37937e0800006110949190614ad7565b3410156110d6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cd90614748565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000001388600a60009054906101000a900461ffff167f00000000000000000000000000000000000000000000000000000000000000966111339190614b65565b61ffff1682611140610f28565b61114a9190614a50565b6111549190614a50565b1115611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118c90614488565b60405180910390fd5b61119f3382611e53565b7f0000000000000000000000000000000000000000000000000000000000001388600a60009054906101000a900461ffff167f00000000000000000000000000000000000000000000000000000000000000966111fc9190614b65565b61ffff16611208610f28565b6112129190614a50565b1415611235576003600c60006101000a81548160ff021916908360ff1602179055505b600160098190555050565b600061124b83611585565b821061128c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128390614468565b60405180910390fd5b6000611296610f28565b905060008060005b838110156113fc576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461139057806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156113e857868414156113d9578195505050505050611438565b83806113e490614d51565b9450505b5080806113f490614d51565b91505061129e565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142f90614848565b60405180910390fd5b92915050565b600a60009054906101000a900461ffff1681565b61145a61242a565b60004790507f000000000000000000000000c4d13342a2a57afaa21197c2dcef4e0d2e50532973ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156114c5573d6000803e3d6000fd5b5050565b6114e483838360405180602001604052806000815250611958565b505050565b600c60009054906101000a900460ff1681565b6000611506610f28565b8210611547576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161153e906145a8565b60405180910390fd5b819050919050565b600061155a826124a8565b600001519050919050565b600d6020528060005260406000206000915054906101000a900460ff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ed90614668565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b61167661242a565b61168060006126ab565b565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b361242a565b8181600b91906116c492919061360f565b505050565b6060600380546116d890614cee565b80601f016020809104026020016040519081016040528092919081815260200182805461170490614cee565b80156117515780601f1061172657610100808354040283529160200191611751565b820191906000526020600020905b81548152906001019060200180831161173457829003601f168201915b5050505050905090565b611763611d99565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c890614708565b60405180910390fd5b80600760006117de611d99565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661188b611d99565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516118d0919061434a565b60405180910390a35050565b6118e461242a565b6003600c60009054906101000a900460ff1660ff16141561193a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611931906146a8565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b611963848484611e71565b61196f8484848461276f565b6119ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a5906147a8565b60405180910390fd5b50505050565b60606119bf82611d8b565b6119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f590614628565b60405180910390fd5b6000611a08612906565b90506000815111611a315760405180608001604052806050815260200161597860509139611a5c565b80611a3b84612998565b604051602001611a4c92919061427d565b6040516020818303038152906040525b915050919050565b611a6c61242a565b7f000000000000000000000000000000000000000000000000000000000000009661ffff1681600a60009054906101000a900461ffff16611aad9190614a18565b61ffff161115611af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae9906145c8565b60405180910390fd5b611b00828261ffff16611e53565b80600a60008282829054906101000a900461ffff16611b1f9190614a18565b92506101000a81548161ffff021916908361ffff1602179055505050565b600b8054611b4a90614cee565b80601f0160208091040260200160405190810160405280929190818152602001828054611b7690614cee565b8015611bc35780601f10611b9857610100808354040283529160200191611bc3565b820191906000526020600020905b815481529060010190602001808311611ba657829003601f168201915b505050505081565b60085481565b7f000000000000000000000000000000000000000000000000000000000000009681565b6000611c018383612af9565b905092915050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ca561242a565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611d15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0c906144e8565b60405180910390fd5b611d1e816126ab565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600060015482109050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b611e6d828260405180602001604052806000815250612b1a565b5050565b6000611e7c826124a8565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611ea3611d99565b73ffffffffffffffffffffffffffffffffffffffff161480611eff5750611ec8611d99565b73ffffffffffffffffffffffffffffffffffffffff16611ee784610980565b73ffffffffffffffffffffffffffffffffffffffff16145b80611f1b5750611f1a8260000151611f15611d99565b611c09565b5b905080611f5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f5490614728565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611fcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc6906146c8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561203f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612036906145e8565b60405180910390fd5b61204c8585856001612ffa565b61205c6000848460000151611da1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff166120ca9190614b31565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff1661216e91906149d2565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846122749190614a50565b9050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156123ba576122ea81611d8b565b156123b9576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506004600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124228686866001613000565b505050505050565b612432611d99565b73ffffffffffffffffffffffffffffffffffffffff16612450611682565b73ffffffffffffffffffffffffffffffffffffffff16146124a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249d906146e8565b60405180910390fd5b565b6124b0613695565b6124b982611d8b565b6124f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ef90614528565b60405180910390fd5b60007f0000000000000000000000000000000000000000000000000000000000000014831061255c5760017f00000000000000000000000000000000000000000000000000000000000000148461254f9190614b99565b6125599190614a50565b90505b60008390505b81811061266a576000600460008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612656578093505050506126a6565b50808061266290614cc4565b915050612562565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269d90614888565b60405180910390fd5b919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006127908473ffffffffffffffffffffffffffffffffffffffff16613006565b156128f9578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127b9611d99565b8786866040518563ffffffff1660e01b81526004016127db94939291906142fe565b602060405180830381600087803b1580156127f557600080fd5b505af192505050801561282657506040513d601f19601f820116820180604052508101906128239190613a75565b60015b6128a9573d8060008114612856576040519150601f19603f3d011682016040523d82523d6000602084013e61285b565b606091505b506000815114156128a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612898906147a8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506128fe565b600190505b949350505050565b6060600b805461291590614cee565b80601f016020809104026020016040519081016040528092919081815260200182805461294190614cee565b801561298e5780601f106129635761010080835404028352916020019161298e565b820191906000526020600020905b81548152906001019060200180831161297157829003601f168201915b5050505050905090565b606060008214156129e0576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612af4565b600082905060005b60008214612a125780806129fb90614d51565b915050600a82612a0b9190614aa6565b91506129e8565b60008167ffffffffffffffff811115612a2e57612a2d614ec0565b5b6040519080825280601f01601f191660200182016040528015612a605781602001600182028036833780820191505090505b5090505b60008514612aed57600182612a799190614b99565b9150600a85612a889190614da4565b6030612a949190614a50565b60f81b818381518110612aaa57612aa9614e91565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612ae69190614aa6565b9450612a64565b8093505050505b919050565b600080612b0584613029565b9050612b118184613083565b91505092915050565b60006001549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b88906147e8565b60405180910390fd5b612b9a81611d8b565b15612bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bd1906147c8565b60405180910390fd5b7f0000000000000000000000000000000000000000000000000000000000000014831115612c3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c34906148c8565b60405180910390fd5b612c4a6000858386612ffa565b6000600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612d4791906149d2565b6fffffffffffffffffffffffffffffffff168152602001858360200151612d6e91906149d2565b6fffffffffffffffffffffffffffffffff16815250600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506004600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612fdd57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612f7d600088848861276f565b612fbc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fb3906147a8565b60405180910390fd5b8180612fc790614d51565b9250508080612fd590614d51565b915050612f0c565b5080600181905550612ff26000878588613000565b505050505050565b50505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b600061307c7f1595fc2d92812a861b044f881265f9b2b3385b9154801106bd324124636674f3836040516020016130619291906143b8565b604051602081830303815290604052805190602001206130aa565b9050919050565b600080600061309285856130c4565b9150915061309f81613147565b819250505092915050565b60006130bd6130b761331c565b83613436565b9050919050565b6000806041835114156131065760008060006020860151925060408601519150606086015160001a90506130fa87828585613469565b94509450505050613140565b60408351141561313757600080602085015191506040850151905061312c868383613576565b935093505050613140565b60006002915091505b9250929050565b6000600481111561315b5761315a614e33565b5b81600481111561316e5761316d614e33565b5b141561317957613319565b6001600481111561318d5761318c614e33565b5b8160048111156131a05761319f614e33565b5b14156131e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131d890614448565b60405180910390fd5b600260048111156131f5576131f4614e33565b5b81600481111561320857613207614e33565b5b1415613249576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613240906144c8565b60405180910390fd5b6003600481111561325d5761325c614e33565b5b8160048111156132705761326f614e33565b5b14156132b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132a890614608565b60405180910390fd5b6004808111156132c4576132c3614e33565b5b8160048111156132d7576132d6614e33565b5b1415613318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330f90614688565b60405180910390fd5b5b50565b60007f0000000000000000000000007274ce3ef4f471123ef27654521dda6410a3030573ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614801561339857507f000000000000000000000000000000000000000000000000000000000000000146145b156133c5577f8b58d083f7fabe9fdb5140a96c8d96fd8bc787166449470ae85a65de371c1b349050613433565b6134307f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f7f0d4a101103c0dd21f5713ace2aae3086b23d96c4586c33c7b57433b9add1fbd17fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc66135d5565b90505b90565b6000828260405160200161344b9291906142ac565b60405160208183030381529060405280519060200120905092915050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08360001c11156134a457600060039150915061356d565b601b8560ff16141580156134bc5750601c8560ff1614155b156134ce57600060049150915061356d565b6000600187878787604051600081526020016040526040516134f394939291906143e1565b6020604051602081039080840390855afa158015613515573d6000803e3d6000fd5b505050602060405103519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156135645760006001925092505061356d565b80600092509250505b94509492505050565b60008060007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60001b841690506000601b60ff8660001c901c6135b99190614a50565b90506135c787828885613469565b935093505050935093915050565b600083838346306040516020016135f0959493929190614365565b6040516020818303038152906040528051906020012090509392505050565b82805461361b90614cee565b90600052602060002090601f01602090048101928261363d5760008555613684565b82601f1061365657803560ff1916838001178555613684565b82800160010185558215613684579182015b82811115613683578235825591602001919060010190613668565b5b50905061369191906136cf565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156136e85760008160009055506001016136d0565b5090565b60006136ff6136fa8461495e565b614939565b90508281526020810184848401111561371b5761371a614efe565b5b613726848285614c82565b509392505050565b60008135905061373d816158ed565b92915050565b60008135905061375281615904565b92915050565b6000813590506137678161591b565b92915050565b60008151905061377c8161591b565b92915050565b600082601f83011261379757613796614ef4565b5b81356137a78482602086016136ec565b91505092915050565b60008083601f8401126137c6576137c5614ef4565b5b8235905067ffffffffffffffff8111156137e3576137e2614eef565b5b6020830191508360018202830111156137ff576137fe614ef9565b5b9250929050565b60008135905061381581615932565b92915050565b60008135905061382a81615949565b92915050565b60008135905061383f81615960565b92915050565b60006020828403121561385b5761385a614f08565b5b60006138698482850161372e565b91505092915050565b6000806040838503121561388957613888614f08565b5b60006138978582860161372e565b92505060206138a88582860161372e565b9150509250929050565b6000806000606084860312156138cb576138ca614f08565b5b60006138d98682870161372e565b93505060206138ea8682870161372e565b92505060406138fb8682870161381b565b9150509250925092565b6000806000806080858703121561391f5761391e614f08565b5b600061392d8782880161372e565b945050602061393e8782880161372e565b935050604061394f8782880161381b565b925050606085013567ffffffffffffffff8111156139705761396f614f03565b5b61397c87828801613782565b91505092959194509250565b6000806040838503121561399f5761399e614f08565b5b60006139ad8582860161372e565b92505060206139be85828601613743565b9150509250929050565b600080604083850312156139df576139de614f08565b5b60006139ed8582860161372e565b92505060206139fe85828601613806565b9150509250929050565b60008060408385031215613a1f57613a1e614f08565b5b6000613a2d8582860161372e565b9250506020613a3e8582860161381b565b9150509250929050565b600060208284031215613a5e57613a5d614f08565b5b6000613a6c84828501613758565b91505092915050565b600060208284031215613a8b57613a8a614f08565b5b6000613a998482850161376d565b91505092915050565b60008060208385031215613ab957613ab8614f08565b5b600083013567ffffffffffffffff811115613ad757613ad6614f03565b5b613ae3858286016137b0565b92509250509250929050565b600060208284031215613b0557613b04614f08565b5b6000613b138482850161381b565b91505092915050565b60008060408385031215613b3357613b32614f08565b5b6000613b418582860161381b565b925050602083013567ffffffffffffffff811115613b6257613b61614f03565b5b613b6e85828601613782565b9150509250929050565b600080600060608486031215613b9157613b90614f08565b5b6000613b9f8682870161381b565b9350506020613bb08682870161381b565b925050604084013567ffffffffffffffff811115613bd157613bd0614f03565b5b613bdd86828701613782565b9150509250925092565b600060208284031215613bfd57613bfc614f08565b5b6000613c0b84828501613830565b91505092915050565b613c1d81614bcd565b82525050565b613c2c81614bdf565b82525050565b613c3b81614beb565b82525050565b613c52613c4d82614beb565b614d9a565b82525050565b6000613c638261498f565b613c6d81856149a5565b9350613c7d818560208601614c91565b613c8681614f0d565b840191505092915050565b6000613c9c8261499a565b613ca681856149b6565b9350613cb6818560208601614c91565b613cbf81614f0d565b840191505092915050565b6000613cd58261499a565b613cdf81856149c7565b9350613cef818560208601614c91565b80840191505092915050565b6000613d086018836149b6565b9150613d1382614f1e565b602082019050919050565b6000613d2b6022836149b6565b9150613d3682614f47565b604082019050919050565b6000613d4e601d836149b6565b9150613d5982614f96565b602082019050919050565b6000613d716022836149b6565b9150613d7c82614fbf565b604082019050919050565b6000613d94601f836149b6565b9150613d9f8261500e565b602082019050919050565b6000613db76026836149b6565b9150613dc282615037565b604082019050919050565b6000613dda6023836149b6565b9150613de582615086565b604082019050919050565b6000613dfd602a836149b6565b9150613e08826150d5565b604082019050919050565b6000613e206002836149c7565b9150613e2b82615124565b600282019050919050565b6000613e436023836149b6565b9150613e4e8261514d565b604082019050919050565b6000613e66602a836149b6565b9150613e718261519c565b604082019050919050565b6000613e89601a836149b6565b9150613e94826151eb565b602082019050919050565b6000613eac6023836149b6565b9150613eb782615214565b604082019050919050565b6000613ecf601d836149b6565b9150613eda82615263565b602082019050919050565b6000613ef26025836149b6565b9150613efd8261528c565b604082019050919050565b6000613f156022836149b6565b9150613f20826152db565b604082019050919050565b6000613f38602f836149b6565b9150613f438261532a565b604082019050919050565b6000613f5b6039836149b6565b9150613f6682615379565b604082019050919050565b6000613f7e602b836149b6565b9150613f89826153c8565b604082019050919050565b6000613fa16022836149b6565b9150613fac82615417565b604082019050919050565b6000613fc4602f836149b6565b9150613fcf82615466565b604082019050919050565b6000613fe76026836149b6565b9150613ff2826154b5565b604082019050919050565b600061400a6005836149c7565b915061401582615504565b600582019050919050565b600061402d6020836149b6565b91506140388261552d565b602082019050919050565b6000614050601a836149b6565b915061405b82615556565b602082019050919050565b60006140736032836149b6565b915061407e8261557f565b604082019050919050565b6000614096600f836149b6565b91506140a1826155ce565b602082019050919050565b60006140b96022836149b6565b91506140c4826155f7565b604082019050919050565b60006140dc601a836149b6565b91506140e782615646565b602082019050919050565b60006140ff6033836149b6565b915061410a8261566f565b604082019050919050565b6000614122601d836149b6565b915061412d826156be565b602082019050919050565b60006141456021836149b6565b9150614150826156e7565b604082019050919050565b60006141686016836149b6565b915061417382615736565b602082019050919050565b600061418b601f836149b6565b91506141968261575f565b602082019050919050565b60006141ae602e836149b6565b91506141b982615788565b604082019050919050565b60006141d1601f836149b6565b91506141dc826157d7565b602082019050919050565b60006141f4602f836149b6565b91506141ff82615800565b604082019050919050565b6000614217602d836149b6565b91506142228261584f565b604082019050919050565b600061423a6022836149b6565b91506142458261589e565b604082019050919050565b61425981614c3d565b82525050565b61426881614c6b565b82525050565b61427781614c75565b82525050565b60006142898285613cca565b91506142958284613cca565b91506142a082613ffd565b91508190509392505050565b60006142b782613e13565b91506142c38285613c41565b6020820191506142d38284613c41565b6020820191508190509392505050565b60006020820190506142f86000830184613c14565b92915050565b60006080820190506143136000830187613c14565b6143206020830186613c14565b61432d604083018561425f565b818103606083015261433f8184613c58565b905095945050505050565b600060208201905061435f6000830184613c23565b92915050565b600060a08201905061437a6000830188613c32565b6143876020830187613c32565b6143946040830186613c32565b6143a1606083018561425f565b6143ae6080830184613c14565b9695505050505050565b60006040820190506143cd6000830185613c32565b6143da602083018461425f565b9392505050565b60006080820190506143f66000830187613c32565b614403602083018661426e565b6144106040830185613c32565b61441d6060830184613c32565b95945050505050565b600060208201905081810360008301526144408184613c91565b905092915050565b6000602082019050818103600083015261446181613cfb565b9050919050565b6000602082019050818103600083015261448181613d1e565b9050919050565b600060208201905081810360008301526144a181613d41565b9050919050565b600060208201905081810360008301526144c181613d64565b9050919050565b600060208201905081810360008301526144e181613d87565b9050919050565b6000602082019050818103600083015261450181613daa565b9050919050565b6000602082019050818103600083015261452181613dcd565b9050919050565b6000602082019050818103600083015261454181613df0565b9050919050565b6000602082019050818103600083015261456181613e36565b9050919050565b6000602082019050818103600083015261458181613e59565b9050919050565b600060208201905081810360008301526145a181613e7c565b9050919050565b600060208201905081810360008301526145c181613e9f565b9050919050565b600060208201905081810360008301526145e181613ec2565b9050919050565b6000602082019050818103600083015261460181613ee5565b9050919050565b6000602082019050818103600083015261462181613f08565b9050919050565b6000602082019050818103600083015261464181613f2b565b9050919050565b6000602082019050818103600083015261466181613f4e565b9050919050565b6000602082019050818103600083015261468181613f71565b9050919050565b600060208201905081810360008301526146a181613f94565b9050919050565b600060208201905081810360008301526146c181613fb7565b9050919050565b600060208201905081810360008301526146e181613fda565b9050919050565b6000602082019050818103600083015261470181614020565b9050919050565b6000602082019050818103600083015261472181614043565b9050919050565b6000602082019050818103600083015261474181614066565b9050919050565b6000602082019050818103600083015261476181614089565b9050919050565b60006020820190508181036000830152614781816140ac565b9050919050565b600060208201905081810360008301526147a1816140cf565b9050919050565b600060208201905081810360008301526147c1816140f2565b9050919050565b600060208201905081810360008301526147e181614115565b9050919050565b6000602082019050818103600083015261480181614138565b9050919050565b600060208201905081810360008301526148218161415b565b9050919050565b600060208201905081810360008301526148418161417e565b9050919050565b60006020820190508181036000830152614861816141a1565b9050919050565b60006020820190508181036000830152614881816141c4565b9050919050565b600060208201905081810360008301526148a1816141e7565b9050919050565b600060208201905081810360008301526148c18161420a565b9050919050565b600060208201905081810360008301526148e18161422d565b9050919050565b60006020820190506148fd6000830184614250565b92915050565b6000602082019050614918600083018461425f565b92915050565b6000602082019050614933600083018461426e565b92915050565b6000614943614954565b905061494f8282614d20565b919050565b6000604051905090565b600067ffffffffffffffff82111561497957614978614ec0565b5b61498282614f0d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006149dd82614c21565b91506149e883614c21565b9250826fffffffffffffffffffffffffffffffff03821115614a0d57614a0c614dd5565b5b828201905092915050565b6000614a2382614c3d565b9150614a2e83614c3d565b92508261ffff03821115614a4557614a44614dd5565b5b828201905092915050565b6000614a5b82614c6b565b9150614a6683614c6b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614a9b57614a9a614dd5565b5b828201905092915050565b6000614ab182614c6b565b9150614abc83614c6b565b925082614acc57614acb614e04565b5b828204905092915050565b6000614ae282614c6b565b9150614aed83614c6b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614b2657614b25614dd5565b5b828202905092915050565b6000614b3c82614c21565b9150614b4783614c21565b925082821015614b5a57614b59614dd5565b5b828203905092915050565b6000614b7082614c3d565b9150614b7b83614c3d565b925082821015614b8e57614b8d614dd5565b5b828203905092915050565b6000614ba482614c6b565b9150614baf83614c6b565b925082821015614bc257614bc1614dd5565b5b828203905092915050565b6000614bd882614c4b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015614caf578082015181840152602081019050614c94565b83811115614cbe576000848401525b50505050565b6000614ccf82614c6b565b91506000821415614ce357614ce2614dd5565b5b600182039050919050565b60006002820490506001821680614d0657607f821691505b60208210811415614d1a57614d19614e62565b5b50919050565b614d2982614f0d565b810181811067ffffffffffffffff82111715614d4857614d47614ec0565b5b80604052505050565b6000614d5c82614c6b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614d8f57614d8e614dd5565b5b600182019050919050565b6000819050919050565b6000614daf82614c6b565b9150614dba83614c6b565b925082614dca57614dc9614e04565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45434453413a20696e76616c6964207369676e61747572650000000000000000600082015250565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d696e7420776f756c6420657863656564206d617820737570706c792e000000600082015250565b7f4d61782070726573616c65206d696e74206174206f6e6365206578636565646560008201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f57616c6c6574206973206e6f7420696e2070726573616c652077686974656c6960008201527f73742e0000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f1901000000000000000000000000000000000000000000000000000000000000600082015250565b7f57686974656c6973742049442068617320616c7265616479206265656e20757360008201527f65642e0000000000000000000000000000000000000000000000000000000000602082015250565b7f576f756c64207265616368206d6178204e46542070657220686f6c646572206960008201527f6e2070726573616c652e00000000000000000000000000000000000000000000602082015250565b7f5075626c69632073616c65206973206e6f74206163746976652e000000000000600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f576f756c6420657863656564206d6178207465616d20737570706c792e000000600082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202773272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374696e6720746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f45434453413a20696e76616c6964207369676e6174757265202776272076616c60008201527f7565000000000000000000000000000000000000000000000000000000000000602082015250565b7f43616e6e6f742075706461746520696620616c7265616479207265616368656460008201527f20736f6c646f75742073746167652e0000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4e6f7420656e6f756768204554482e0000000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f4d6178206d696e74206174206f6e63652065786365656465642e000000000000600082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f50726573616c65206973206e6f74206163746976652e00000000000000000000600082015250565b7f576f756c64207265616368206d6178204e46542070657220686f6c6465722e00600082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b6158f681614bcd565b811461590157600080fd5b50565b61590d81614bdf565b811461591857600080fd5b50565b61592481614bf5565b811461592f57600080fd5b50565b61593b81614c3d565b811461594657600080fd5b50565b61595281614c6b565b811461595d57600080fd5b50565b61596981614c75565b811461597457600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d51354d6a505a566d47443331657456473333377144734534644b55754b6d736d784b73773970743367654667a26469706673582212206f88b56b92fc4f5ba199724f13a74273e7dd0301ba291381d106459e31bafe9564736f6c63430008070033

Deployed Bytecode Sourcemap

395:4272:14:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4251:370:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5977:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7502:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7065:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1342:925:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2812:94:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8352:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2844:665:14;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3443:744:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;529:29:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4512:152;;;;;;;;;;;;;:::i;:::-;;8557:157:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;815:22:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2975:177:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5800:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;902:45:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4677:211:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1831:101:0;;;;;;;;;;;;;:::i;:::-;;1201:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3935:122:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6132:98:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7770:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1126:185:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8777:311:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4065:420:14;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3537:242;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;780:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13192:43:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;477:45:14;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2275:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8107:186:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2081:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4251:370:13;4378:4;4423:25;4408:40;;;:11;:40;;;;:99;;;;4474:33;4459:48;;;:11;:48;;;;4408:99;:160;;;;4533:35;4518:50;;;:11;:50;;;;4408:160;:207;;;;4579:36;4603:11;4579:23;:36::i;:::-;4408:207;4394:221;;4251:370;;;:::o;5977:94::-;6031:13;6060:5;6053:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5977:94;:::o;7502:204::-;7570:7;7594:16;7602:7;7594;:16::i;:::-;7586:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7676:15;:24;7692:7;7676:24;;;;;;;;;;;;;;;;;;;;;7669:31;;7502:204;;;:::o;7065:379::-;7134:13;7150:24;7166:7;7150:15;:24::i;:::-;7134:40;;7195:5;7189:11;;:2;:11;;;;7181:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;7280:5;7264:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;7289:37;7306:5;7313:12;:10;:12::i;:::-;7289:16;:37::i;:::-;7264:62;7248:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;7410:28;7419:2;7423:7;7432:5;7410:8;:28::i;:::-;7127:317;7065:379;;:::o;1342:925:14:-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1475:1:14::1;1462:9;;;;;;;;;;;:14;;;1454:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;1523:15;:20;1539:3;1523:20;;;;;;;;;;;;;;;;;;;;;1522:21;1514:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;1628:7;:5;:7::i;:::-;1602:33;;:22;1608:3;1613:10;1602:5;:22::i;:::-;:33;;;1594:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;1707:1;1694:9;:14;;1686:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;1803:1;1790:9;1766:21;1776:10;1766:9;:21::i;:::-;:33;;;;:::i;:::-;:38;;1758:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;1896:9;1883:10;:22;;;;:::i;:::-;1870:9;:35;;1862:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2005:14;1989:11;;;;;;;;;;;1973:15;:27;;;;:::i;:::-;1944:57;;1960:9;1944:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:57;;;;:::i;:::-;:75;;1936:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;2066:32;2076:10;2088:9;2066;:32::i;:::-;2164:14;2148:11;;;;;;;;;;;2132:15;:27;;;;:::i;:::-;2115:45;;:13;:11;:13::i;:::-;:45;;;;:::i;:::-;:63;2111:109;;;2207:1;2195:9;;:13;;;;;;;;;;;;;;;;;;2111:109;2255:4;2232:15;:20;2248:3;2232:20;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;1701:1:1::0;2628:7;:22;;;;1342:925:14;;;:::o;2812:94:13:-;2865:7;2888:12;;2881:19;;2812:94;:::o;8352:142::-;8460:28;8470:4;8476:2;8480:7;8460:9;:28::i;:::-;8352:142;;;:::o;2844:665:14:-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2942:1:14::1;2929:9;;;;;;;;;;;:14;;;2921:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;3006:2;2993:9;:15;;2985:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;3095:2;3082:9;3058:21;3068:10;3058:9;:21::i;:::-;:33;;;;:::i;:::-;:39;;3050:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;3178:9;3165:10;:22;;;;:::i;:::-;3152:9;:35;;3144:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;3287:14;3271:11;;;;;;;;;;;3255:15;:27;;;;:::i;:::-;3226:57;;3242:9;3226:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:57;;;;:::i;:::-;:75;;3218:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;3348:32;3358:10;3370:9;3348;:32::i;:::-;3446:14;3430:11;;;;;;;;;;;3414:15;:27;;;;:::i;:::-;3397:45;;:13;:11;:13::i;:::-;:45;;;;:::i;:::-;:63;3393:109;;;3489:1;3477:9;;:13;;;;;;;;;;;;;;;;;;3393:109;1701:1:1::0;2628:7;:22;;;;2844:665:14;:::o;3443:744:13:-;3552:7;3587:16;3597:5;3587:9;:16::i;:::-;3579:5;:24;3571:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;3649:22;3674:13;:11;:13::i;:::-;3649:38;;3694:19;3724:25;3774:9;3769:350;3793:14;3789:1;:18;3769:350;;;3823:31;3857:11;:14;3869:1;3857:14;;;;;;;;;;;3823:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3910:1;3884:28;;:9;:14;;;:28;;;3880:89;;3945:9;:14;;;3925:34;;3880:89;4002:5;3981:26;;:17;:26;;;3977:135;;;4039:5;4024:11;:20;4020:59;;;4066:1;4059:8;;;;;;;;;4020:59;4089:13;;;;;:::i;:::-;;;;3977:135;3814:305;3809:3;;;;;:::i;:::-;;;;3769:350;;;;4125:56;;;;;;;;;;:::i;:::-;;;;;;;;3443:744;;;;;:::o;529:29:14:-;;;;;;;;;;;;;:::o;4512:152::-;1094:13:0;:11;:13::i;:::-;4562:18:14::1;4583:21;4562:42;;4623:11;4615:29;;:41;4645:10;4615:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;4551:113;4512:152::o:0;8557:157:13:-;8669:39;8686:4;8692:2;8696:7;8669:39;;;;;;;;;;;;:16;:39::i;:::-;8557:157;;;:::o;815:22:14:-;;;;;;;;;;;;;:::o;2975:177:13:-;3042:7;3074:13;:11;:13::i;:::-;3066:5;:21;3058:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;3141:5;3134:12;;2975:177;;;:::o;5800:118::-;5864:7;5887:20;5899:7;5887:11;:20::i;:::-;:25;;;5880:32;;5800:118;;;:::o;902:45:14:-;;;;;;;;;;;;;;;;;;;;;;:::o;4677:211:13:-;4741:7;4782:1;4765:19;;:5;:19;;;;4757:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;4854:12;:19;4867:5;4854:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;4846:36;;4839:43;;4677:211;;;:::o;1831:101:0:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1201:85::-;1247:7;1273:6;;;;;;;;;;;1266:13;;1201:85;:::o;3935:122:14:-;1094:13:0;:11;:13::i;:::-;4036::14::1;;4021:12;:28;;;;;;;:::i;:::-;;3935:122:::0;;:::o;6132:98:13:-;6188:13;6217:7;6210:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6132:98;:::o;7770:274::-;7873:12;:10;:12::i;:::-;7861:24;;:8;:24;;;;7853:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7970:8;7925:18;:32;7944:12;:10;:12::i;:::-;7925:32;;;;;;;;;;;;;;;:42;7958:8;7925:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;8019:8;7990:48;;8005:12;:10;:12::i;:::-;7990:48;;;8029:8;7990:48;;;;;;:::i;:::-;;;;;;;;7770:274;;:::o;1126:185:14:-;1094:13:0;:11;:13::i;:::-;1217:1:14::1;1204:9;;;;;;;;;;;:14;;;;1196:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;1293:10;1281:9;;:22;;;;;;;;;;;;;;;;;;1126:185:::0;:::o;8777:311:13:-;8914:28;8924:4;8930:2;8934:7;8914:9;:28::i;:::-;8965:48;8988:4;8994:2;8998:7;9007:5;8965:22;:48::i;:::-;8949:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;8777:311;;;;:::o;4065:420:14:-;4139:13;4173:16;4181:7;4173;:16::i;:::-;4165:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;4252:18;4273:10;:8;:10::i;:::-;4252:31;;4322:1;4307:4;4301:18;:22;:176;;;;;;;;;;;;;;;;;;;;;;4350:4;4356:25;4373:7;4356:16;:25::i;:::-;4333:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;4301:176;4294:183;;;4065:420;;;:::o;3537:242::-;1094:13:0;:11;:13::i;:::-;3651:15:14::1;3624:42;;3638:9;3624:11;;;;;;;;;;;:23;;;;:::i;:::-;:42;;;;3616:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;3711:25;3721:3;3726:9;3711:25;;:9;:25::i;:::-;3762:9;3747:11;;:24;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3537:242:::0;;:::o;780:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13192:43:13:-;;;;:::o;477:45:14:-;;;:::o;2275:133::-;2349:7;2376:24;2384:3;2389:10;2376:7;:24::i;:::-;2369:31;;2275:133;;;;:::o;8107:186:13:-;8229:4;8252:18;:25;8271:5;8252:25;;;;;;;;;;;;;;;:35;8278:8;8252:35;;;;;;;;;;;;;;;;;;;;;;;;;8245:42;;8107:186;;;;:::o;2081:198:0:-;1094:13;:11;:13::i;:::-;2189:1:::1;2169:22;;:8;:22;;;;2161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;829:155:11:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;9327:105:13:-;9384:4;9414:12;;9404:7;:22;9397:29;;9327:105;;;:::o;640:96:7:-;693:7;719:10;712:17;;640:96;:::o;13014:172:13:-;13138:2;13111:15;:24;13127:7;13111:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;13172:7;13168:2;13152:28;;13161:5;13152:28;;;;;;;;;;;;13014:172;;;:::o;9438:98::-;9503:27;9513:2;9517:8;9503:27;;;;;;;;;;;;:9;:27::i;:::-;9438:98;;:::o;11379:1529::-;11476:35;11514:20;11526:7;11514:11;:20::i;:::-;11476:58;;11543:22;11585:13;:18;;;11569:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;11638:12;:10;:12::i;:::-;11614:36;;:20;11626:7;11614:11;:20::i;:::-;:36;;;11569:81;:142;;;;11661:50;11678:13;:18;;;11698:12;:10;:12::i;:::-;11661:16;:50::i;:::-;11569:142;11543:169;;11737:17;11721:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;11869:4;11847:26;;:13;:18;;;:26;;;11831:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;11958:1;11944:16;;:2;:16;;;;11936:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;12011:43;12033:4;12039:2;12043:7;12052:1;12011:21;:43::i;:::-;12111:49;12128:1;12132:7;12141:13;:18;;;12111:8;:49::i;:::-;12199:1;12169:12;:18;12182:4;12169:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12235:1;12207:12;:16;12220:2;12207:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;12266:43;;;;;;;;12281:2;12266:43;;;;;;12292:15;12266:43;;;;;12243:11;:20;12255:7;12243:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12537:19;12569:1;12559:7;:11;;;;:::i;:::-;12537:33;;12622:1;12581:43;;:11;:24;12593:11;12581:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;12577:236;;;12639:20;12647:11;12639:7;:20::i;:::-;12635:171;;;12699:97;;;;;;;;12726:13;:18;;;12699:97;;;;;;12757:13;:28;;;12699:97;;;;;12672:11;:24;12684:11;12672:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12635:171;12577:236;12845:7;12841:2;12826:27;;12835:4;12826:27;;;;;;;;;;;;12860:42;12881:4;12887:2;12891:7;12900:1;12860:20;:42::i;:::-;11469:1439;;;11379:1529;;;:::o;1359:130:0:-;1433:12;:10;:12::i;:::-;1422:23;;:7;:5;:7::i;:::-;:23;;;1414:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1359:130::o;5140:606:13:-;5216:21;;:::i;:::-;5257:16;5265:7;5257;:16::i;:::-;5249:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;5329:26;5377:12;5366:7;:23;5362:93;;5446:1;5431:12;5421:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;5400:47;;5362:93;5468:12;5483:7;5468:22;;5463:212;5500:18;5492:4;:26;5463:212;;5537:31;5571:11;:17;5583:4;5571:17;;;;;;;;;;;5537:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5627:1;5601:28;;:9;:14;;;:28;;;5597:71;;5649:9;5642:16;;;;;;;5597:71;5528:147;5520:6;;;;;:::i;:::-;;;;5463:212;;;;5683:57;;;;;;;;;;:::i;:::-;;;;;;;;5140:606;;;;:::o;2433:187:0:-;2506:16;2525:6;;;;;;;;;;;2506:25;;2550:8;2541:6;;:17;;;;;;;;;;;;;;;;;;2604:8;2573:40;;2594:8;2573:40;;;;;;;;;;;;2496:124;2433:187;:::o;14729:690:13:-;14866:4;14883:15;:2;:13;;;:15::i;:::-;14879:535;;;14938:2;14922:36;;;14959:12;:10;:12::i;:::-;14973:4;14979:7;14988:5;14922:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;14909:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15170:1;15153:6;:13;:18;15149:215;;;15186:61;;;;;;;;;;:::i;:::-;;;;;;;;15149:215;15332:6;15326:13;15317:6;15313:2;15309:15;15302:38;14909:464;15054:45;;;15044:55;;;:6;:55;;;;15037:62;;;;;14879:535;15402:4;15395:11;;14729:690;;;;;;;:::o;3814:113:14:-;3874:13;3907:12;3900:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3814:113;:::o;392:703:8:-;448:13;674:1;665:5;:10;661:51;;;691:10;;;;;;;;;;;;;;;;;;;;;661:51;721:12;736:5;721:20;;751:14;775:75;790:1;782:4;:9;775:75;;807:8;;;;;:::i;:::-;;;;837:2;829:10;;;;;:::i;:::-;;;775:75;;;859:19;891:6;881:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;859:39;;908:150;924:1;915:5;:10;908:150;;951:1;941:11;;;;;:::i;:::-;;;1017:2;1009:5;:10;;;;:::i;:::-;996:2;:24;;;;:::i;:::-;983:39;;966:6;973;966:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1045:2;1036:11;;;;;:::i;:::-;;;908:150;;;1081:6;1067:21;;;;;392:703;;;;:::o;2416:184:14:-;2494:7;2514:14;2531:10;2537:3;2531:5;:10::i;:::-;2514:27;;2559:33;2573:6;2581:10;2559:13;:33::i;:::-;2552:40;;;2416:184;;;;:::o;9875:1272:13:-;9980:20;10003:12;;9980:35;;10044:1;10030:16;;:2;:16;;;;10022:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;10221:21;10229:12;10221:7;:21::i;:::-;10220:22;10212:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;10303:12;10291:8;:24;;10283:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;10363:61;10393:1;10397:2;10401:12;10415:8;10363:21;:61::i;:::-;10433:30;10466:12;:16;10479:2;10466:16;;;;;;;;;;;;;;;10433:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10508:119;;;;;;;;10558:8;10528:11;:19;;;:39;;;;:::i;:::-;10508:119;;;;;;10611:8;10576:11;:24;;;:44;;;;:::i;:::-;10508:119;;;;;10489:12;:16;10502:2;10489:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10662:43;;;;;;;;10677:2;10662:43;;;;;;10688:15;10662:43;;;;;10634:11;:25;10646:12;10634:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10714:20;10737:12;10714:35;;10763:9;10758:281;10782:8;10778:1;:12;10758:281;;;10836:12;10832:2;10811:38;;10828:1;10811:38;;;;;;;;;;;;10876:59;10907:1;10911:2;10915:12;10929:5;10876:22;:59::i;:::-;10858:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;11017:14;;;;;:::i;:::-;;;;10792:3;;;;;:::i;:::-;;;;10758:281;;;;11062:12;11047;:27;;;;11081:60;11110:1;11114:2;11118:12;11132:8;11081:20;:60::i;:::-;9973:1174;;;9875:1272;;;:::o;15881:141::-;;;;;:::o;16408:140::-;;;;;:::o;1175:320:6:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;2608:205:14:-;2659:7;2686:119;2738:36;2789:3;2713:90;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2703:101;;;;;;2686:16;:119::i;:::-;2679:126;;2608:205;;;:::o;4402:227:9:-;4480:7;4500:17;4519:18;4541:27;4552:4;4558:9;4541:10;:27::i;:::-;4499:69;;;;4578:18;4590:5;4578:11;:18::i;:::-;4613:9;4606:16;;;;4402:227;;;;:::o;4339:165:10:-;4416:7;4442:55;4464:20;:18;:20::i;:::-;4486:10;4442:21;:55::i;:::-;4435:62;;4339:165;;;:::o;2243:1373:9:-;2324:7;2333:12;2574:2;2554:9;:16;:22;2550:1060;;;2592:9;2615;2638:7;2890:4;2879:9;2875:20;2869:27;2864:32;;2939:4;2928:9;2924:20;2918:27;2913:32;;2996:4;2985:9;2981:20;2975:27;2972:1;2967:36;2962:41;;3037:25;3048:4;3054:1;3057;3060;3037:10;:25::i;:::-;3030:32;;;;;;;;;2550:1060;3103:2;3083:9;:16;:22;3079:531;;;3121:9;3144:10;3399:4;3388:9;3384:20;3378:27;3373:32;;3449:4;3438:9;3434:20;3428:27;3422:33;;3489:23;3500:4;3506:1;3509:2;3489:10;:23::i;:::-;3482:30;;;;;;;;3079:531;3559:1;3563:35;3543:56;;;;2243:1373;;;;;;:::o;548:631::-;625:20;616:29;;;;;;;;:::i;:::-;;:5;:29;;;;;;;;:::i;:::-;;;612:561;;;661:7;;612:561;721:29;712:38;;;;;;;;:::i;:::-;;:5;:38;;;;;;;;:::i;:::-;;;708:465;;;766:34;;;;;;;;;;:::i;:::-;;;;;;;;708:465;830:35;821:44;;;;;;;;:::i;:::-;;:5;:44;;;;;;;;:::i;:::-;;;817:356;;;881:41;;;;;;;;;;:::i;:::-;;;;;;;;817:356;952:30;943:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;939:234;;;998:44;;;;;;;;;;:::i;:::-;;;;;;;;939:234;1072:30;1063:39;;;;;;;;:::i;:::-;;:5;:39;;;;;;;;:::i;:::-;;;1059:114;;;1118:44;;;;;;;;;;:::i;:::-;;;;;;;;1059:114;548:631;;:::o;3143:308:10:-;3196:7;3236:12;3219:29;;3227:4;3219:29;;;:66;;;;;3269:16;3252:13;:33;3219:66;3215:230;;;3308:24;3301:31;;;;3215:230;3370:64;3392:10;3404:12;3418:15;3370:21;:64::i;:::-;3363:71;;3143:308;;:::o;9191:194:9:-;9284:7;9349:15;9366:10;9320:57;;;;;;;;;:::i;:::-;;;;;;;;;;;;;9310:68;;;;;;9303:75;;9191:194;;;;:::o;5810:1603::-;5936:7;5945:12;6860:66;6855:1;6847:10;;:79;6843:161;;;6958:1;6962:30;6942:51;;;;;;6843:161;7022:2;7017:1;:7;;;;:18;;;;;7033:2;7028:1;:7;;;;7017:18;7013:100;;;7067:1;7071:30;7051:51;;;;;;7013:100;7207:14;7224:24;7234:4;7240:1;7243;7246;7224:24;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7207:41;;7280:1;7262:20;;:6;:20;;;7258:101;;;7314:1;7318:29;7298:50;;;;;;;7258:101;7377:6;7385:20;7369:37;;;;;5810:1603;;;;;;;;:::o;4883:336::-;4993:7;5002:12;5026:9;5051:66;5043:75;;5038:2;:80;5026:92;;5128:7;5167:2;5160:3;5153:2;5145:11;;:18;;5144:25;;;;:::i;:::-;5128:42;;5187:25;5198:4;5204:1;5207;5210;5187:10;:25::i;:::-;5180:32;;;;;;4883:336;;;;;;:::o;3457:257:10:-;3597:7;3644:8;3654;3664:11;3677:13;3700:4;3633:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3623:84;;;;;;3616:91;;3457:257;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:15:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:137::-;1972:5;2010:6;1997:20;1988:29;;2026:32;2052:5;2026:32;:::i;:::-;1927:137;;;;:::o;2070:139::-;2116:5;2154:6;2141:20;2132:29;;2170:33;2197:5;2170:33;:::i;:::-;2070:139;;;;:::o;2215:135::-;2259:5;2297:6;2284:20;2275:29;;2313:31;2338:5;2313:31;:::i;:::-;2215:135;;;;:::o;2356:329::-;2415:6;2464:2;2452:9;2443:7;2439:23;2435:32;2432:119;;;2470:79;;:::i;:::-;2432:119;2590:1;2615:53;2660:7;2651:6;2640:9;2636:22;2615:53;:::i;:::-;2605:63;;2561:117;2356:329;;;;:::o;2691:474::-;2759:6;2767;2816:2;2804:9;2795:7;2791:23;2787:32;2784:119;;;2822:79;;:::i;:::-;2784:119;2942:1;2967:53;3012:7;3003:6;2992:9;2988:22;2967:53;:::i;:::-;2957:63;;2913:117;3069:2;3095:53;3140:7;3131:6;3120:9;3116:22;3095:53;:::i;:::-;3085:63;;3040:118;2691:474;;;;;:::o;3171:619::-;3248:6;3256;3264;3313:2;3301:9;3292:7;3288:23;3284:32;3281:119;;;3319:79;;:::i;:::-;3281:119;3439:1;3464:53;3509:7;3500:6;3489:9;3485:22;3464:53;:::i;:::-;3454:63;;3410:117;3566:2;3592:53;3637:7;3628:6;3617:9;3613:22;3592:53;:::i;:::-;3582:63;;3537:118;3694:2;3720:53;3765:7;3756:6;3745:9;3741:22;3720:53;:::i;:::-;3710:63;;3665:118;3171:619;;;;;:::o;3796:943::-;3891:6;3899;3907;3915;3964:3;3952:9;3943:7;3939:23;3935:33;3932:120;;;3971:79;;:::i;:::-;3932:120;4091:1;4116:53;4161:7;4152:6;4141:9;4137:22;4116:53;:::i;:::-;4106:63;;4062:117;4218:2;4244:53;4289:7;4280:6;4269:9;4265:22;4244:53;:::i;:::-;4234:63;;4189:118;4346:2;4372:53;4417:7;4408:6;4397:9;4393:22;4372:53;:::i;:::-;4362:63;;4317:118;4502:2;4491:9;4487:18;4474:32;4533:18;4525:6;4522:30;4519:117;;;4555:79;;:::i;:::-;4519:117;4660:62;4714:7;4705:6;4694:9;4690:22;4660:62;:::i;:::-;4650:72;;4445:287;3796:943;;;;;;;:::o;4745:468::-;4810:6;4818;4867:2;4855:9;4846:7;4842:23;4838:32;4835:119;;;4873:79;;:::i;:::-;4835:119;4993:1;5018:53;5063:7;5054:6;5043:9;5039:22;5018:53;:::i;:::-;5008:63;;4964:117;5120:2;5146:50;5188:7;5179:6;5168:9;5164:22;5146:50;:::i;:::-;5136:60;;5091:115;4745:468;;;;;:::o;5219:472::-;5286:6;5294;5343:2;5331:9;5322:7;5318:23;5314:32;5311:119;;;5349:79;;:::i;:::-;5311:119;5469:1;5494:53;5539:7;5530:6;5519:9;5515:22;5494:53;:::i;:::-;5484:63;;5440:117;5596:2;5622:52;5666:7;5657:6;5646:9;5642:22;5622:52;:::i;:::-;5612:62;;5567:117;5219:472;;;;;:::o;5697:474::-;5765:6;5773;5822:2;5810:9;5801:7;5797:23;5793:32;5790:119;;;5828:79;;:::i;:::-;5790:119;5948:1;5973:53;6018:7;6009:6;5998:9;5994:22;5973:53;:::i;:::-;5963:63;;5919:117;6075:2;6101:53;6146:7;6137:6;6126:9;6122:22;6101:53;:::i;:::-;6091:63;;6046:118;5697:474;;;;;:::o;6177:327::-;6235:6;6284:2;6272:9;6263:7;6259:23;6255:32;6252:119;;;6290:79;;:::i;:::-;6252:119;6410:1;6435:52;6479:7;6470:6;6459:9;6455:22;6435:52;:::i;:::-;6425:62;;6381:116;6177:327;;;;:::o;6510:349::-;6579:6;6628:2;6616:9;6607:7;6603:23;6599:32;6596:119;;;6634:79;;:::i;:::-;6596:119;6754:1;6779:63;6834:7;6825:6;6814:9;6810:22;6779:63;:::i;:::-;6769:73;;6725:127;6510:349;;;;:::o;6865:529::-;6936:6;6944;6993:2;6981:9;6972:7;6968:23;6964:32;6961:119;;;6999:79;;:::i;:::-;6961:119;7147:1;7136:9;7132:17;7119:31;7177:18;7169:6;7166:30;7163:117;;;7199:79;;:::i;:::-;7163:117;7312:65;7369:7;7360:6;7349:9;7345:22;7312:65;:::i;:::-;7294:83;;;;7090:297;6865:529;;;;;:::o;7400:329::-;7459:6;7508:2;7496:9;7487:7;7483:23;7479:32;7476:119;;;7514:79;;:::i;:::-;7476:119;7634:1;7659:53;7704:7;7695:6;7684:9;7680:22;7659:53;:::i;:::-;7649:63;;7605:117;7400:329;;;;:::o;7735:652::-;7812:6;7820;7869:2;7857:9;7848:7;7844:23;7840:32;7837:119;;;7875:79;;:::i;:::-;7837:119;7995:1;8020:53;8065:7;8056:6;8045:9;8041:22;8020:53;:::i;:::-;8010:63;;7966:117;8150:2;8139:9;8135:18;8122:32;8181:18;8173:6;8170:30;8167:117;;;8203:79;;:::i;:::-;8167:117;8308:62;8362:7;8353:6;8342:9;8338:22;8308:62;:::i;:::-;8298:72;;8093:287;7735:652;;;;;:::o;8393:797::-;8479:6;8487;8495;8544:2;8532:9;8523:7;8519:23;8515:32;8512:119;;;8550:79;;:::i;:::-;8512:119;8670:1;8695:53;8740:7;8731:6;8720:9;8716:22;8695:53;:::i;:::-;8685:63;;8641:117;8797:2;8823:53;8868:7;8859:6;8848:9;8844:22;8823:53;:::i;:::-;8813:63;;8768:118;8953:2;8942:9;8938:18;8925:32;8984:18;8976:6;8973:30;8970:117;;;9006:79;;:::i;:::-;8970:117;9111:62;9165:7;9156:6;9145:9;9141:22;9111:62;:::i;:::-;9101:72;;8896:287;8393:797;;;;;:::o;9196:325::-;9253:6;9302:2;9290:9;9281:7;9277:23;9273:32;9270:119;;;9308:79;;:::i;:::-;9270:119;9428:1;9453:51;9496:7;9487:6;9476:9;9472:22;9453:51;:::i;:::-;9443:61;;9399:115;9196:325;;;;:::o;9527:118::-;9614:24;9632:5;9614:24;:::i;:::-;9609:3;9602:37;9527:118;;:::o;9651:109::-;9732:21;9747:5;9732:21;:::i;:::-;9727:3;9720:34;9651:109;;:::o;9766:118::-;9853:24;9871:5;9853:24;:::i;:::-;9848:3;9841:37;9766:118;;:::o;9890:157::-;9995:45;10015:24;10033:5;10015:24;:::i;:::-;9995:45;:::i;:::-;9990:3;9983:58;9890:157;;:::o;10053:360::-;10139:3;10167:38;10199:5;10167:38;:::i;:::-;10221:70;10284:6;10279:3;10221:70;:::i;:::-;10214:77;;10300:52;10345:6;10340:3;10333:4;10326:5;10322:16;10300:52;:::i;:::-;10377:29;10399:6;10377:29;:::i;:::-;10372:3;10368:39;10361:46;;10143:270;10053:360;;;;:::o;10419:364::-;10507:3;10535:39;10568:5;10535:39;:::i;:::-;10590:71;10654:6;10649:3;10590:71;:::i;:::-;10583:78;;10670:52;10715:6;10710:3;10703:4;10696:5;10692:16;10670:52;:::i;:::-;10747:29;10769:6;10747:29;:::i;:::-;10742:3;10738:39;10731:46;;10511:272;10419:364;;;;:::o;10789:377::-;10895:3;10923:39;10956:5;10923:39;:::i;:::-;10978:89;11060:6;11055:3;10978:89;:::i;:::-;10971:96;;11076:52;11121:6;11116:3;11109:4;11102:5;11098:16;11076:52;:::i;:::-;11153:6;11148:3;11144:16;11137:23;;10899:267;10789:377;;;;:::o;11172:366::-;11314:3;11335:67;11399:2;11394:3;11335:67;:::i;:::-;11328:74;;11411:93;11500:3;11411:93;:::i;:::-;11529:2;11524:3;11520:12;11513:19;;11172:366;;;:::o;11544:::-;11686:3;11707:67;11771:2;11766:3;11707:67;:::i;:::-;11700:74;;11783:93;11872:3;11783:93;:::i;:::-;11901:2;11896:3;11892:12;11885:19;;11544:366;;;:::o;11916:::-;12058:3;12079:67;12143:2;12138:3;12079:67;:::i;:::-;12072:74;;12155:93;12244:3;12155:93;:::i;:::-;12273:2;12268:3;12264:12;12257:19;;11916:366;;;:::o;12288:::-;12430:3;12451:67;12515:2;12510:3;12451:67;:::i;:::-;12444:74;;12527:93;12616:3;12527:93;:::i;:::-;12645:2;12640:3;12636:12;12629:19;;12288:366;;;:::o;12660:::-;12802:3;12823:67;12887:2;12882:3;12823:67;:::i;:::-;12816:74;;12899:93;12988:3;12899:93;:::i;:::-;13017:2;13012:3;13008:12;13001:19;;12660:366;;;:::o;13032:::-;13174:3;13195:67;13259:2;13254:3;13195:67;:::i;:::-;13188:74;;13271:93;13360:3;13271:93;:::i;:::-;13389:2;13384:3;13380:12;13373:19;;13032:366;;;:::o;13404:::-;13546:3;13567:67;13631:2;13626:3;13567:67;:::i;:::-;13560:74;;13643:93;13732:3;13643:93;:::i;:::-;13761:2;13756:3;13752:12;13745:19;;13404:366;;;:::o;13776:::-;13918:3;13939:67;14003:2;13998:3;13939:67;:::i;:::-;13932:74;;14015:93;14104:3;14015:93;:::i;:::-;14133:2;14128:3;14124:12;14117:19;;13776:366;;;:::o;14148:400::-;14308:3;14329:84;14411:1;14406:3;14329:84;:::i;:::-;14322:91;;14422:93;14511:3;14422:93;:::i;:::-;14540:1;14535:3;14531:11;14524:18;;14148:400;;;:::o;14554:366::-;14696:3;14717:67;14781:2;14776:3;14717:67;:::i;:::-;14710:74;;14793:93;14882:3;14793:93;:::i;:::-;14911:2;14906:3;14902:12;14895:19;;14554:366;;;:::o;14926:::-;15068:3;15089:67;15153:2;15148:3;15089:67;:::i;:::-;15082:74;;15165:93;15254:3;15165:93;:::i;:::-;15283:2;15278:3;15274:12;15267:19;;14926:366;;;:::o;15298:::-;15440:3;15461:67;15525:2;15520:3;15461:67;:::i;:::-;15454:74;;15537:93;15626:3;15537:93;:::i;:::-;15655:2;15650:3;15646:12;15639:19;;15298:366;;;:::o;15670:::-;15812:3;15833:67;15897:2;15892:3;15833:67;:::i;:::-;15826:74;;15909:93;15998:3;15909:93;:::i;:::-;16027:2;16022:3;16018:12;16011:19;;15670:366;;;:::o;16042:::-;16184:3;16205:67;16269:2;16264:3;16205:67;:::i;:::-;16198:74;;16281:93;16370:3;16281:93;:::i;:::-;16399:2;16394:3;16390:12;16383:19;;16042:366;;;:::o;16414:::-;16556:3;16577:67;16641:2;16636:3;16577:67;:::i;:::-;16570:74;;16653:93;16742:3;16653:93;:::i;:::-;16771:2;16766:3;16762:12;16755:19;;16414:366;;;:::o;16786:::-;16928:3;16949:67;17013:2;17008:3;16949:67;:::i;:::-;16942:74;;17025:93;17114:3;17025:93;:::i;:::-;17143:2;17138:3;17134:12;17127:19;;16786:366;;;:::o;17158:::-;17300:3;17321:67;17385:2;17380:3;17321:67;:::i;:::-;17314:74;;17397:93;17486:3;17397:93;:::i;:::-;17515:2;17510:3;17506:12;17499:19;;17158:366;;;:::o;17530:::-;17672:3;17693:67;17757:2;17752:3;17693:67;:::i;:::-;17686:74;;17769:93;17858:3;17769:93;:::i;:::-;17887:2;17882:3;17878:12;17871:19;;17530:366;;;:::o;17902:::-;18044:3;18065:67;18129:2;18124:3;18065:67;:::i;:::-;18058:74;;18141:93;18230:3;18141:93;:::i;:::-;18259:2;18254:3;18250:12;18243:19;;17902:366;;;:::o;18274:::-;18416:3;18437:67;18501:2;18496:3;18437:67;:::i;:::-;18430:74;;18513:93;18602:3;18513:93;:::i;:::-;18631:2;18626:3;18622:12;18615:19;;18274:366;;;:::o;18646:::-;18788:3;18809:67;18873:2;18868:3;18809:67;:::i;:::-;18802:74;;18885:93;18974:3;18885:93;:::i;:::-;19003:2;18998:3;18994:12;18987:19;;18646:366;;;:::o;19018:::-;19160:3;19181:67;19245:2;19240:3;19181:67;:::i;:::-;19174:74;;19257:93;19346:3;19257:93;:::i;:::-;19375:2;19370:3;19366:12;19359:19;;19018:366;;;:::o;19390:400::-;19550:3;19571:84;19653:1;19648:3;19571:84;:::i;:::-;19564:91;;19664:93;19753:3;19664:93;:::i;:::-;19782:1;19777:3;19773:11;19766:18;;19390:400;;;:::o;19796:366::-;19938:3;19959:67;20023:2;20018:3;19959:67;:::i;:::-;19952:74;;20035:93;20124:3;20035:93;:::i;:::-;20153:2;20148:3;20144:12;20137:19;;19796:366;;;:::o;20168:::-;20310:3;20331:67;20395:2;20390:3;20331:67;:::i;:::-;20324:74;;20407:93;20496:3;20407:93;:::i;:::-;20525:2;20520:3;20516:12;20509:19;;20168:366;;;:::o;20540:::-;20682:3;20703:67;20767:2;20762:3;20703:67;:::i;:::-;20696:74;;20779:93;20868:3;20779:93;:::i;:::-;20897:2;20892:3;20888:12;20881:19;;20540:366;;;:::o;20912:::-;21054:3;21075:67;21139:2;21134:3;21075:67;:::i;:::-;21068:74;;21151:93;21240:3;21151:93;:::i;:::-;21269:2;21264:3;21260:12;21253:19;;20912:366;;;:::o;21284:::-;21426:3;21447:67;21511:2;21506:3;21447:67;:::i;:::-;21440:74;;21523:93;21612:3;21523:93;:::i;:::-;21641:2;21636:3;21632:12;21625:19;;21284:366;;;:::o;21656:::-;21798:3;21819:67;21883:2;21878:3;21819:67;:::i;:::-;21812:74;;21895:93;21984:3;21895:93;:::i;:::-;22013:2;22008:3;22004:12;21997:19;;21656:366;;;:::o;22028:::-;22170:3;22191:67;22255:2;22250:3;22191:67;:::i;:::-;22184:74;;22267:93;22356:3;22267:93;:::i;:::-;22385:2;22380:3;22376:12;22369:19;;22028:366;;;:::o;22400:::-;22542:3;22563:67;22627:2;22622:3;22563:67;:::i;:::-;22556:74;;22639:93;22728:3;22639:93;:::i;:::-;22757:2;22752:3;22748:12;22741:19;;22400:366;;;:::o;22772:::-;22914:3;22935:67;22999:2;22994:3;22935:67;:::i;:::-;22928:74;;23011:93;23100:3;23011:93;:::i;:::-;23129:2;23124:3;23120:12;23113:19;;22772:366;;;:::o;23144:::-;23286:3;23307:67;23371:2;23366:3;23307:67;:::i;:::-;23300:74;;23383:93;23472:3;23383:93;:::i;:::-;23501:2;23496:3;23492:12;23485:19;;23144:366;;;:::o;23516:::-;23658:3;23679:67;23743:2;23738:3;23679:67;:::i;:::-;23672:74;;23755:93;23844:3;23755:93;:::i;:::-;23873:2;23868:3;23864:12;23857:19;;23516:366;;;:::o;23888:::-;24030:3;24051:67;24115:2;24110:3;24051:67;:::i;:::-;24044:74;;24127:93;24216:3;24127:93;:::i;:::-;24245:2;24240:3;24236:12;24229:19;;23888:366;;;:::o;24260:::-;24402:3;24423:67;24487:2;24482:3;24423:67;:::i;:::-;24416:74;;24499:93;24588:3;24499:93;:::i;:::-;24617:2;24612:3;24608:12;24601:19;;24260:366;;;:::o;24632:::-;24774:3;24795:67;24859:2;24854:3;24795:67;:::i;:::-;24788:74;;24871:93;24960:3;24871:93;:::i;:::-;24989:2;24984:3;24980:12;24973:19;;24632:366;;;:::o;25004:::-;25146:3;25167:67;25231:2;25226:3;25167:67;:::i;:::-;25160:74;;25243:93;25332:3;25243:93;:::i;:::-;25361:2;25356:3;25352:12;25345:19;;25004:366;;;:::o;25376:::-;25518:3;25539:67;25603:2;25598:3;25539:67;:::i;:::-;25532:74;;25615:93;25704:3;25615:93;:::i;:::-;25733:2;25728:3;25724:12;25717:19;;25376:366;;;:::o;25748:115::-;25833:23;25850:5;25833:23;:::i;:::-;25828:3;25821:36;25748:115;;:::o;25869:118::-;25956:24;25974:5;25956:24;:::i;:::-;25951:3;25944:37;25869:118;;:::o;25993:112::-;26076:22;26092:5;26076:22;:::i;:::-;26071:3;26064:35;25993:112;;:::o;26111:701::-;26392:3;26414:95;26505:3;26496:6;26414:95;:::i;:::-;26407:102;;26526:95;26617:3;26608:6;26526:95;:::i;:::-;26519:102;;26638:148;26782:3;26638:148;:::i;:::-;26631:155;;26803:3;26796:10;;26111:701;;;;;:::o;26818:663::-;27059:3;27081:148;27225:3;27081:148;:::i;:::-;27074:155;;27239:75;27310:3;27301:6;27239:75;:::i;:::-;27339:2;27334:3;27330:12;27323:19;;27352:75;27423:3;27414:6;27352:75;:::i;:::-;27452:2;27447:3;27443:12;27436:19;;27472:3;27465:10;;26818:663;;;;;:::o;27487:222::-;27580:4;27618:2;27607:9;27603:18;27595:26;;27631:71;27699:1;27688:9;27684:17;27675:6;27631:71;:::i;:::-;27487:222;;;;:::o;27715:640::-;27910:4;27948:3;27937:9;27933:19;27925:27;;27962:71;28030:1;28019:9;28015:17;28006:6;27962:71;:::i;:::-;28043:72;28111:2;28100:9;28096:18;28087:6;28043:72;:::i;:::-;28125;28193:2;28182:9;28178:18;28169:6;28125:72;:::i;:::-;28244:9;28238:4;28234:20;28229:2;28218:9;28214:18;28207:48;28272:76;28343:4;28334:6;28272:76;:::i;:::-;28264:84;;27715:640;;;;;;;:::o;28361:210::-;28448:4;28486:2;28475:9;28471:18;28463:26;;28499:65;28561:1;28550:9;28546:17;28537:6;28499:65;:::i;:::-;28361:210;;;;:::o;28577:664::-;28782:4;28820:3;28809:9;28805:19;28797:27;;28834:71;28902:1;28891:9;28887:17;28878:6;28834:71;:::i;:::-;28915:72;28983:2;28972:9;28968:18;28959:6;28915:72;:::i;:::-;28997;29065:2;29054:9;29050:18;29041:6;28997:72;:::i;:::-;29079;29147:2;29136:9;29132:18;29123:6;29079:72;:::i;:::-;29161:73;29229:3;29218:9;29214:19;29205:6;29161:73;:::i;:::-;28577:664;;;;;;;;:::o;29247:332::-;29368:4;29406:2;29395:9;29391:18;29383:26;;29419:71;29487:1;29476:9;29472:17;29463:6;29419:71;:::i;:::-;29500:72;29568:2;29557:9;29553:18;29544:6;29500:72;:::i;:::-;29247:332;;;;;:::o;29585:545::-;29758:4;29796:3;29785:9;29781:19;29773:27;;29810:71;29878:1;29867:9;29863:17;29854:6;29810:71;:::i;:::-;29891:68;29955:2;29944:9;29940:18;29931:6;29891:68;:::i;:::-;29969:72;30037:2;30026:9;30022:18;30013:6;29969:72;:::i;:::-;30051;30119:2;30108:9;30104:18;30095:6;30051:72;:::i;:::-;29585:545;;;;;;;:::o;30136:313::-;30249:4;30287:2;30276:9;30272:18;30264:26;;30336:9;30330:4;30326:20;30322:1;30311:9;30307:17;30300:47;30364:78;30437:4;30428:6;30364:78;:::i;:::-;30356:86;;30136:313;;;;:::o;30455:419::-;30621:4;30659:2;30648:9;30644:18;30636:26;;30708:9;30702:4;30698:20;30694:1;30683:9;30679:17;30672:47;30736:131;30862:4;30736:131;:::i;:::-;30728:139;;30455:419;;;:::o;30880:::-;31046:4;31084:2;31073:9;31069:18;31061:26;;31133:9;31127:4;31123:20;31119:1;31108:9;31104:17;31097:47;31161:131;31287:4;31161:131;:::i;:::-;31153:139;;30880:419;;;:::o;31305:::-;31471:4;31509:2;31498:9;31494:18;31486:26;;31558:9;31552:4;31548:20;31544:1;31533:9;31529:17;31522:47;31586:131;31712:4;31586:131;:::i;:::-;31578:139;;31305:419;;;:::o;31730:::-;31896:4;31934:2;31923:9;31919:18;31911:26;;31983:9;31977:4;31973:20;31969:1;31958:9;31954:17;31947:47;32011:131;32137:4;32011:131;:::i;:::-;32003:139;;31730:419;;;:::o;32155:::-;32321:4;32359:2;32348:9;32344:18;32336:26;;32408:9;32402:4;32398:20;32394:1;32383:9;32379:17;32372:47;32436:131;32562:4;32436:131;:::i;:::-;32428:139;;32155:419;;;:::o;32580:::-;32746:4;32784:2;32773:9;32769:18;32761:26;;32833:9;32827:4;32823:20;32819:1;32808:9;32804:17;32797:47;32861:131;32987:4;32861:131;:::i;:::-;32853:139;;32580:419;;;:::o;33005:::-;33171:4;33209:2;33198:9;33194:18;33186:26;;33258:9;33252:4;33248:20;33244:1;33233:9;33229:17;33222:47;33286:131;33412:4;33286:131;:::i;:::-;33278:139;;33005:419;;;:::o;33430:::-;33596:4;33634:2;33623:9;33619:18;33611:26;;33683:9;33677:4;33673:20;33669:1;33658:9;33654:17;33647:47;33711:131;33837:4;33711:131;:::i;:::-;33703:139;;33430:419;;;:::o;33855:::-;34021:4;34059:2;34048:9;34044:18;34036:26;;34108:9;34102:4;34098:20;34094:1;34083:9;34079:17;34072:47;34136:131;34262:4;34136:131;:::i;:::-;34128:139;;33855:419;;;:::o;34280:::-;34446:4;34484:2;34473:9;34469:18;34461:26;;34533:9;34527:4;34523:20;34519:1;34508:9;34504:17;34497:47;34561:131;34687:4;34561:131;:::i;:::-;34553:139;;34280:419;;;:::o;34705:::-;34871:4;34909:2;34898:9;34894:18;34886:26;;34958:9;34952:4;34948:20;34944:1;34933:9;34929:17;34922:47;34986:131;35112:4;34986:131;:::i;:::-;34978:139;;34705:419;;;:::o;35130:::-;35296:4;35334:2;35323:9;35319:18;35311:26;;35383:9;35377:4;35373:20;35369:1;35358:9;35354:17;35347:47;35411:131;35537:4;35411:131;:::i;:::-;35403:139;;35130:419;;;:::o;35555:::-;35721:4;35759:2;35748:9;35744:18;35736:26;;35808:9;35802:4;35798:20;35794:1;35783:9;35779:17;35772:47;35836:131;35962:4;35836:131;:::i;:::-;35828:139;;35555:419;;;:::o;35980:::-;36146:4;36184:2;36173:9;36169:18;36161:26;;36233:9;36227:4;36223:20;36219:1;36208:9;36204:17;36197:47;36261:131;36387:4;36261:131;:::i;:::-;36253:139;;35980:419;;;:::o;36405:::-;36571:4;36609:2;36598:9;36594:18;36586:26;;36658:9;36652:4;36648:20;36644:1;36633:9;36629:17;36622:47;36686:131;36812:4;36686:131;:::i;:::-;36678:139;;36405:419;;;:::o;36830:::-;36996:4;37034:2;37023:9;37019:18;37011:26;;37083:9;37077:4;37073:20;37069:1;37058:9;37054:17;37047:47;37111:131;37237:4;37111:131;:::i;:::-;37103:139;;36830:419;;;:::o;37255:::-;37421:4;37459:2;37448:9;37444:18;37436:26;;37508:9;37502:4;37498:20;37494:1;37483:9;37479:17;37472:47;37536:131;37662:4;37536:131;:::i;:::-;37528:139;;37255:419;;;:::o;37680:::-;37846:4;37884:2;37873:9;37869:18;37861:26;;37933:9;37927:4;37923:20;37919:1;37908:9;37904:17;37897:47;37961:131;38087:4;37961:131;:::i;:::-;37953:139;;37680:419;;;:::o;38105:::-;38271:4;38309:2;38298:9;38294:18;38286:26;;38358:9;38352:4;38348:20;38344:1;38333:9;38329:17;38322:47;38386:131;38512:4;38386:131;:::i;:::-;38378:139;;38105:419;;;:::o;38530:::-;38696:4;38734:2;38723:9;38719:18;38711:26;;38783:9;38777:4;38773:20;38769:1;38758:9;38754:17;38747:47;38811:131;38937:4;38811:131;:::i;:::-;38803:139;;38530:419;;;:::o;38955:::-;39121:4;39159:2;39148:9;39144:18;39136:26;;39208:9;39202:4;39198:20;39194:1;39183:9;39179:17;39172:47;39236:131;39362:4;39236:131;:::i;:::-;39228:139;;38955:419;;;:::o;39380:::-;39546:4;39584:2;39573:9;39569:18;39561:26;;39633:9;39627:4;39623:20;39619:1;39608:9;39604:17;39597:47;39661:131;39787:4;39661:131;:::i;:::-;39653:139;;39380:419;;;:::o;39805:::-;39971:4;40009:2;39998:9;39994:18;39986:26;;40058:9;40052:4;40048:20;40044:1;40033:9;40029:17;40022:47;40086:131;40212:4;40086:131;:::i;:::-;40078:139;;39805:419;;;:::o;40230:::-;40396:4;40434:2;40423:9;40419:18;40411:26;;40483:9;40477:4;40473:20;40469:1;40458:9;40454:17;40447:47;40511:131;40637:4;40511:131;:::i;:::-;40503:139;;40230:419;;;:::o;40655:::-;40821:4;40859:2;40848:9;40844:18;40836:26;;40908:9;40902:4;40898:20;40894:1;40883:9;40879:17;40872:47;40936:131;41062:4;40936:131;:::i;:::-;40928:139;;40655:419;;;:::o;41080:::-;41246:4;41284:2;41273:9;41269:18;41261:26;;41333:9;41327:4;41323:20;41319:1;41308:9;41304:17;41297:47;41361:131;41487:4;41361:131;:::i;:::-;41353:139;;41080:419;;;:::o;41505:::-;41671:4;41709:2;41698:9;41694:18;41686:26;;41758:9;41752:4;41748:20;41744:1;41733:9;41729:17;41722:47;41786:131;41912:4;41786:131;:::i;:::-;41778:139;;41505:419;;;:::o;41930:::-;42096:4;42134:2;42123:9;42119:18;42111:26;;42183:9;42177:4;42173:20;42169:1;42158:9;42154:17;42147:47;42211:131;42337:4;42211:131;:::i;:::-;42203:139;;41930:419;;;:::o;42355:::-;42521:4;42559:2;42548:9;42544:18;42536:26;;42608:9;42602:4;42598:20;42594:1;42583:9;42579:17;42572:47;42636:131;42762:4;42636:131;:::i;:::-;42628:139;;42355:419;;;:::o;42780:::-;42946:4;42984:2;42973:9;42969:18;42961:26;;43033:9;43027:4;43023:20;43019:1;43008:9;43004:17;42997:47;43061:131;43187:4;43061:131;:::i;:::-;43053:139;;42780:419;;;:::o;43205:::-;43371:4;43409:2;43398:9;43394:18;43386:26;;43458:9;43452:4;43448:20;43444:1;43433:9;43429:17;43422:47;43486:131;43612:4;43486:131;:::i;:::-;43478:139;;43205:419;;;:::o;43630:::-;43796:4;43834:2;43823:9;43819:18;43811:26;;43883:9;43877:4;43873:20;43869:1;43858:9;43854:17;43847:47;43911:131;44037:4;43911:131;:::i;:::-;43903:139;;43630:419;;;:::o;44055:::-;44221:4;44259:2;44248:9;44244:18;44236:26;;44308:9;44302:4;44298:20;44294:1;44283:9;44279:17;44272:47;44336:131;44462:4;44336:131;:::i;:::-;44328:139;;44055:419;;;:::o;44480:::-;44646:4;44684:2;44673:9;44669:18;44661:26;;44733:9;44727:4;44723:20;44719:1;44708:9;44704:17;44697:47;44761:131;44887:4;44761:131;:::i;:::-;44753:139;;44480:419;;;:::o;44905:::-;45071:4;45109:2;45098:9;45094:18;45086:26;;45158:9;45152:4;45148:20;45144:1;45133:9;45129:17;45122:47;45186:131;45312:4;45186:131;:::i;:::-;45178:139;;44905:419;;;:::o;45330:::-;45496:4;45534:2;45523:9;45519:18;45511:26;;45583:9;45577:4;45573:20;45569:1;45558:9;45554:17;45547:47;45611:131;45737:4;45611:131;:::i;:::-;45603:139;;45330:419;;;:::o;45755:::-;45921:4;45959:2;45948:9;45944:18;45936:26;;46008:9;46002:4;45998:20;45994:1;45983:9;45979:17;45972:47;46036:131;46162:4;46036:131;:::i;:::-;46028:139;;45755:419;;;:::o;46180:218::-;46271:4;46309:2;46298:9;46294:18;46286:26;;46322:69;46388:1;46377:9;46373:17;46364:6;46322:69;:::i;:::-;46180:218;;;;:::o;46404:222::-;46497:4;46535:2;46524:9;46520:18;46512:26;;46548:71;46616:1;46605:9;46601:17;46592:6;46548:71;:::i;:::-;46404:222;;;;:::o;46632:214::-;46721:4;46759:2;46748:9;46744:18;46736:26;;46772:67;46836:1;46825:9;46821:17;46812:6;46772:67;:::i;:::-;46632:214;;;;:::o;46852:129::-;46886:6;46913:20;;:::i;:::-;46903:30;;46942:33;46970:4;46962:6;46942:33;:::i;:::-;46852:129;;;:::o;46987:75::-;47020:6;47053:2;47047:9;47037:19;;46987:75;:::o;47068:307::-;47129:4;47219:18;47211:6;47208:30;47205:56;;;47241:18;;:::i;:::-;47205:56;47279:29;47301:6;47279:29;:::i;:::-;47271:37;;47363:4;47357;47353:15;47345:23;;47068:307;;;:::o;47381:98::-;47432:6;47466:5;47460:12;47450:22;;47381:98;;;:::o;47485:99::-;47537:6;47571:5;47565:12;47555:22;;47485:99;;;:::o;47590:168::-;47673:11;47707:6;47702:3;47695:19;47747:4;47742:3;47738:14;47723:29;;47590:168;;;;:::o;47764:169::-;47848:11;47882:6;47877:3;47870:19;47922:4;47917:3;47913:14;47898:29;;47764:169;;;;:::o;47939:148::-;48041:11;48078:3;48063:18;;47939:148;;;;:::o;48093:273::-;48133:3;48152:20;48170:1;48152:20;:::i;:::-;48147:25;;48186:20;48204:1;48186:20;:::i;:::-;48181:25;;48308:1;48272:34;48268:42;48265:1;48262:49;48259:75;;;48314:18;;:::i;:::-;48259:75;48358:1;48355;48351:9;48344:16;;48093:273;;;;:::o;48372:242::-;48411:3;48430:19;48447:1;48430:19;:::i;:::-;48425:24;;48463:19;48480:1;48463:19;:::i;:::-;48458:24;;48556:1;48548:6;48544:14;48541:1;48538:21;48535:47;;;48562:18;;:::i;:::-;48535:47;48606:1;48603;48599:9;48592:16;;48372:242;;;;:::o;48620:305::-;48660:3;48679:20;48697:1;48679:20;:::i;:::-;48674:25;;48713:20;48731:1;48713:20;:::i;:::-;48708:25;;48867:1;48799:66;48795:74;48792:1;48789:81;48786:107;;;48873:18;;:::i;:::-;48786:107;48917:1;48914;48910:9;48903:16;;48620:305;;;;:::o;48931:185::-;48971:1;48988:20;49006:1;48988:20;:::i;:::-;48983:25;;49022:20;49040:1;49022:20;:::i;:::-;49017:25;;49061:1;49051:35;;49066:18;;:::i;:::-;49051:35;49108:1;49105;49101:9;49096:14;;48931:185;;;;:::o;49122:348::-;49162:7;49185:20;49203:1;49185:20;:::i;:::-;49180:25;;49219:20;49237:1;49219:20;:::i;:::-;49214:25;;49407:1;49339:66;49335:74;49332:1;49329:81;49324:1;49317:9;49310:17;49306:105;49303:131;;;49414:18;;:::i;:::-;49303:131;49462:1;49459;49455:9;49444:20;;49122:348;;;;:::o;49476:191::-;49516:4;49536:20;49554:1;49536:20;:::i;:::-;49531:25;;49570:20;49588:1;49570:20;:::i;:::-;49565:25;;49609:1;49606;49603:8;49600:34;;;49614:18;;:::i;:::-;49600:34;49659:1;49656;49652:9;49644:17;;49476:191;;;;:::o;49673:188::-;49712:4;49732:19;49749:1;49732:19;:::i;:::-;49727:24;;49765:19;49782:1;49765:19;:::i;:::-;49760:24;;49803:1;49800;49797:8;49794:34;;;49808:18;;:::i;:::-;49794:34;49853:1;49850;49846:9;49838:17;;49673:188;;;;:::o;49867:191::-;49907:4;49927:20;49945:1;49927:20;:::i;:::-;49922:25;;49961:20;49979:1;49961:20;:::i;:::-;49956:25;;50000:1;49997;49994:8;49991:34;;;50005:18;;:::i;:::-;49991:34;50050:1;50047;50043:9;50035:17;;49867:191;;;;:::o;50064:96::-;50101:7;50130:24;50148:5;50130:24;:::i;:::-;50119:35;;50064:96;;;:::o;50166:90::-;50200:7;50243:5;50236:13;50229:21;50218:32;;50166:90;;;:::o;50262:77::-;50299:7;50328:5;50317:16;;50262:77;;;:::o;50345:149::-;50381:7;50421:66;50414:5;50410:78;50399:89;;50345:149;;;:::o;50500:118::-;50537:7;50577:34;50570:5;50566:46;50555:57;;50500:118;;;:::o;50624:89::-;50660:7;50700:6;50693:5;50689:18;50678:29;;50624:89;;;:::o;50719:126::-;50756:7;50796:42;50789:5;50785:54;50774:65;;50719:126;;;:::o;50851:77::-;50888:7;50917:5;50906:16;;50851:77;;;:::o;50934:86::-;50969:7;51009:4;51002:5;50998:16;50987:27;;50934:86;;;:::o;51026:154::-;51110:6;51105:3;51100;51087:30;51172:1;51163:6;51158:3;51154:16;51147:27;51026:154;;;:::o;51186:307::-;51254:1;51264:113;51278:6;51275:1;51272:13;51264:113;;;51363:1;51358:3;51354:11;51348:18;51344:1;51339:3;51335:11;51328:39;51300:2;51297:1;51293:10;51288:15;;51264:113;;;51395:6;51392:1;51389:13;51386:101;;;51475:1;51466:6;51461:3;51457:16;51450:27;51386:101;51235:258;51186:307;;;:::o;51499:171::-;51538:3;51561:24;51579:5;51561:24;:::i;:::-;51552:33;;51607:4;51600:5;51597:15;51594:41;;;51615:18;;:::i;:::-;51594:41;51662:1;51655:5;51651:13;51644:20;;51499:171;;;:::o;51676:320::-;51720:6;51757:1;51751:4;51747:12;51737:22;;51804:1;51798:4;51794:12;51825:18;51815:81;;51881:4;51873:6;51869:17;51859:27;;51815:81;51943:2;51935:6;51932:14;51912:18;51909:38;51906:84;;;51962:18;;:::i;:::-;51906:84;51727:269;51676:320;;;:::o;52002:281::-;52085:27;52107:4;52085:27;:::i;:::-;52077:6;52073:40;52215:6;52203:10;52200:22;52179:18;52167:10;52164:34;52161:62;52158:88;;;52226:18;;:::i;:::-;52158:88;52266:10;52262:2;52255:22;52045:238;52002:281;;:::o;52289:233::-;52328:3;52351:24;52369:5;52351:24;:::i;:::-;52342:33;;52397:66;52390:5;52387:77;52384:103;;;52467:18;;:::i;:::-;52384:103;52514:1;52507:5;52503:13;52496:20;;52289:233;;;:::o;52528:79::-;52567:7;52596:5;52585:16;;52528:79;;;:::o;52613:176::-;52645:1;52662:20;52680:1;52662:20;:::i;:::-;52657:25;;52696:20;52714:1;52696:20;:::i;:::-;52691:25;;52735:1;52725:35;;52740:18;;:::i;:::-;52725:35;52781:1;52778;52774:9;52769:14;;52613:176;;;;:::o;52795:180::-;52843:77;52840:1;52833:88;52940:4;52937:1;52930:15;52964:4;52961:1;52954:15;52981:180;53029:77;53026:1;53019:88;53126:4;53123:1;53116:15;53150:4;53147:1;53140:15;53167:180;53215:77;53212:1;53205:88;53312:4;53309:1;53302:15;53336:4;53333:1;53326:15;53353:180;53401:77;53398:1;53391:88;53498:4;53495:1;53488:15;53522:4;53519:1;53512:15;53539:180;53587:77;53584:1;53577:88;53684:4;53681:1;53674:15;53708:4;53705:1;53698:15;53725:180;53773:77;53770:1;53763:88;53870:4;53867:1;53860:15;53894:4;53891:1;53884:15;53911:117;54020:1;54017;54010:12;54034:117;54143:1;54140;54133:12;54157:117;54266:1;54263;54256:12;54280:117;54389:1;54386;54379:12;54403:117;54512:1;54509;54502:12;54526:117;54635:1;54632;54625:12;54649:102;54690:6;54741:2;54737:7;54732:2;54725:5;54721:14;54717:28;54707:38;;54649:102;;;:::o;54757:174::-;54897:26;54893:1;54885:6;54881:14;54874:50;54757:174;:::o;54937:221::-;55077:34;55073:1;55065:6;55061:14;55054:58;55146:4;55141:2;55133:6;55129:15;55122:29;54937:221;:::o;55164:179::-;55304:31;55300:1;55292:6;55288:14;55281:55;55164:179;:::o;55349:221::-;55489:34;55485:1;55477:6;55473:14;55466:58;55558:4;55553:2;55545:6;55541:15;55534:29;55349:221;:::o;55576:181::-;55716:33;55712:1;55704:6;55700:14;55693:57;55576:181;:::o;55763:225::-;55903:34;55899:1;55891:6;55887:14;55880:58;55972:8;55967:2;55959:6;55955:15;55948:33;55763:225;:::o;55994:222::-;56134:34;56130:1;56122:6;56118:14;56111:58;56203:5;56198:2;56190:6;56186:15;56179:30;55994:222;:::o;56222:229::-;56362:34;56358:1;56350:6;56346:14;56339:58;56431:12;56426:2;56418:6;56414:15;56407:37;56222:229;:::o;56457:214::-;56597:66;56593:1;56585:6;56581:14;56574:90;56457:214;:::o;56677:222::-;56817:34;56813:1;56805:6;56801:14;56794:58;56886:5;56881:2;56873:6;56869:15;56862:30;56677:222;:::o;56905:229::-;57045:34;57041:1;57033:6;57029:14;57022:58;57114:12;57109:2;57101:6;57097:15;57090:37;56905:229;:::o;57140:176::-;57280:28;57276:1;57268:6;57264:14;57257:52;57140:176;:::o;57322:222::-;57462:34;57458:1;57450:6;57446:14;57439:58;57531:5;57526:2;57518:6;57514:15;57507:30;57322:222;:::o;57550:179::-;57690:31;57686:1;57678:6;57674:14;57667:55;57550:179;:::o;57735:224::-;57875:34;57871:1;57863:6;57859:14;57852:58;57944:7;57939:2;57931:6;57927:15;57920:32;57735:224;:::o;57965:221::-;58105:34;58101:1;58093:6;58089:14;58082:58;58174:4;58169:2;58161:6;58157:15;58150:29;57965:221;:::o;58192:234::-;58332:34;58328:1;58320:6;58316:14;58309:58;58401:17;58396:2;58388:6;58384:15;58377:42;58192:234;:::o;58432:244::-;58572:34;58568:1;58560:6;58556:14;58549:58;58641:27;58636:2;58628:6;58624:15;58617:52;58432:244;:::o;58682:230::-;58822:34;58818:1;58810:6;58806:14;58799:58;58891:13;58886:2;58878:6;58874:15;58867:38;58682:230;:::o;58918:221::-;59058:34;59054:1;59046:6;59042:14;59035:58;59127:4;59122:2;59114:6;59110:15;59103:29;58918:221;:::o;59145:234::-;59285:34;59281:1;59273:6;59269:14;59262:58;59354:17;59349:2;59341:6;59337:15;59330:42;59145:234;:::o;59385:225::-;59525:34;59521:1;59513:6;59509:14;59502:58;59594:8;59589:2;59581:6;59577:15;59570:33;59385:225;:::o;59616:155::-;59756:7;59752:1;59744:6;59740:14;59733:31;59616:155;:::o;59777:182::-;59917:34;59913:1;59905:6;59901:14;59894:58;59777:182;:::o;59965:176::-;60105:28;60101:1;60093:6;60089:14;60082:52;59965:176;:::o;60147:237::-;60287:34;60283:1;60275:6;60271:14;60264:58;60356:20;60351:2;60343:6;60339:15;60332:45;60147:237;:::o;60390:165::-;60530:17;60526:1;60518:6;60514:14;60507:41;60390:165;:::o;60561:221::-;60701:34;60697:1;60689:6;60685:14;60678:58;60770:4;60765:2;60757:6;60753:15;60746:29;60561:221;:::o;60788:176::-;60928:28;60924:1;60916:6;60912:14;60905:52;60788:176;:::o;60970:238::-;61110:34;61106:1;61098:6;61094:14;61087:58;61179:21;61174:2;61166:6;61162:15;61155:46;60970:238;:::o;61214:179::-;61354:31;61350:1;61342:6;61338:14;61331:55;61214:179;:::o;61399:220::-;61539:34;61535:1;61527:6;61523:14;61516:58;61608:3;61603:2;61595:6;61591:15;61584:28;61399:220;:::o;61625:172::-;61765:24;61761:1;61753:6;61749:14;61742:48;61625:172;:::o;61803:181::-;61943:33;61939:1;61931:6;61927:14;61920:57;61803:181;:::o;61990:233::-;62130:34;62126:1;62118:6;62114:14;62107:58;62199:16;62194:2;62186:6;62182:15;62175:41;61990:233;:::o;62229:181::-;62369:33;62365:1;62357:6;62353:14;62346:57;62229:181;:::o;62416:234::-;62556:34;62552:1;62544:6;62540:14;62533:58;62625:17;62620:2;62612:6;62608:15;62601:42;62416:234;:::o;62656:232::-;62796:34;62792:1;62784:6;62780:14;62773:58;62865:15;62860:2;62852:6;62848:15;62841:40;62656:232;:::o;62894:221::-;63034:34;63030:1;63022:6;63018:14;63011:58;63103:4;63098:2;63090:6;63086:15;63079:29;62894:221;:::o;63121:122::-;63194:24;63212:5;63194:24;:::i;:::-;63187:5;63184:35;63174:63;;63233:1;63230;63223:12;63174:63;63121:122;:::o;63249:116::-;63319:21;63334:5;63319:21;:::i;:::-;63312:5;63309:32;63299:60;;63355:1;63352;63345:12;63299:60;63249:116;:::o;63371:120::-;63443:23;63460:5;63443:23;:::i;:::-;63436:5;63433:34;63423:62;;63481:1;63478;63471:12;63423:62;63371:120;:::o;63497:::-;63569:23;63586:5;63569:23;:::i;:::-;63562:5;63559:34;63549:62;;63607:1;63604;63597:12;63549:62;63497:120;:::o;63623:122::-;63696:24;63714:5;63696:24;:::i;:::-;63689:5;63686:35;63676:63;;63735:1;63732;63725:12;63676:63;63623:122;:::o;63751:118::-;63822:22;63838:5;63822:22;:::i;:::-;63815:5;63812:33;63802:61;;63859:1;63856;63849:12;63802:61;63751:118;:::o

Swarm Source

ipfs://6f88b56b92fc4f5ba199724f13a74273e7dd0301ba291381d106459e31bafe95
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.