ETH Price: $3,264.38 (+0.13%)
Gas: 2 Gwei

Token

SupCaitlinDAO (CDAO)
 

Overview

Max Total Supply

640 CDAO

Holders

206

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
t1ger.eth
Balance
1 CDAO
0x63dc4f566aD10D88284a9a6cB39d935eaF75ba83
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:
caitlin_dao

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-18
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @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: @openzeppelin/contracts/token/ERC721/IERC721.sol


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

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// 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: @openzeppelin/contracts/utils/Context.sol


// 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: contracts/ERC721A.sol


// Creators: locationtba.eth, 2pmflow.eth

pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * 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.
   */
  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(totalSupply). 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(), ".json"))
        : "";
  }

  /**
   * @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:
   *
   * - `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 > currentIndex - 1) {
      endIndex = currentIndex - 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: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/cait_dao.sol



pragma solidity ^0.8.0;





contract caitlin_dao is ERC721A, Ownable {
   uint256 public NFT_PRICE = 0.02 ether;
    uint256 public MAX_SUPPLY = 2222;
    uint256 public MAX_MINTS = 10;
    uint256 public MAX_MINTS_RESERVED = 5;
    uint256 public freeTokens = 555;
    string public projName = "SupCaitlinDAO";
    string public projSym = "CDAO";

    bool public DROP_ACTIVE = false;

    string public baseURI = "https://ipfs.io/ipfs/QmYLzM4uvqx3r8mA1VuaAKuZkSdXp2gB77mh5xt3vYxRWo/";
    mapping(address => uint) addressToReservedMints;
    
    constructor() ERC721A(projName, projSym, MAX_MINTS, MAX_SUPPLY) {}

    function mint(uint256 numTokens) public payable {
        require(DROP_ACTIVE, "Sale not started");
        require(
            numTokens > 0 && numTokens <= MAX_MINTS,
            "Must mint between 1 and 10 tokens"
        );
        require(totalSupply() + numTokens <= MAX_SUPPLY, "Sold Out");
        require(
            msg.value >= NFT_PRICE * numTokens,
            "Amount of ether sent is not enough"
        );

        _safeMint(msg.sender, numTokens);
    }

    function freeMint(uint256 numTokens) public {
        require(DROP_ACTIVE, "Sale not started");
        require(
            numTokens > 0 && numTokens <= MAX_MINTS_RESERVED,
            "Must mint between 1 and 5 tokens"
        );
        require(
            addressToReservedMints[msg.sender] + numTokens <= MAX_MINTS_RESERVED,
            "Only 5 reserved mints per wallet"
        );
        require(totalSupply() + numTokens <= MAX_SUPPLY, "Sold Out");
        require(
            totalSupply() + numTokens <= freeTokens,
            "There are no reserved mints left"
        );

        addressToReservedMints[msg.sender] += numTokens;
        _safeMint(msg.sender, numTokens);
    }

    function flipDropState() public onlyOwner {
        DROP_ACTIVE = !DROP_ACTIVE;
    }

    // function setBaseURI(string memory newBaseURI) public onlyOwner {
    //     baseURI = newBaseURI;
    // }

    // function setPrice(uint256 newPrice) public onlyOwner {
    //     NFT_PRICE = newPrice;
    // }

    // function setMaxMints(uint256 newMax) public onlyOwner {
    //     MAX_MINTS = newMax;
    // }

    // function setSupply(uint256 newSupply) public onlyOwner {
    //     MAX_SUPPLY = newSupply;
    // }

    // function setFreeTokens(uint256 newReserve) public onlyOwner {
    //     freeTokens = newReserve;
    // }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseURI;
    }
    
    function reservedMintedBy() external view returns (uint256) {
        return addressToReservedMints[msg.sender];
    }

    function withdraw() public onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

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":"DROP_ACTIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINTS_RESERVED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipDropState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"projName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"projSym","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedMintedBy","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60c060405260008055600060075566470de4df8200006009556108ae600a55600a600b556005600c5561022b600d556040518060400160405280600d81526020017f537570436169746c696e44414f00000000000000000000000000000000000000815250600e90805190602001906200007b92919062000417565b506040518060400160405280600481526020017f4344414f00000000000000000000000000000000000000000000000000000000815250600f9080519060200190620000c992919062000417565b506000601060006101000a81548160ff02191690831515021790555060405180608001604052806044815260200162004d9960449139601190805190602001906200011692919062000417565b503480156200012457600080fd5b50600e805462000134906200056a565b80601f016020809104026020016040519081016040528092919081815260200182805462000162906200056a565b8015620001b35780601f106200018757610100808354040283529160200191620001b3565b820191906000526020600020905b8154815290600101906020018083116200019557829003601f168201915b5050505050600f8054620001c7906200056a565b80601f0160208091040260200160405190810160405280929190818152602001828054620001f5906200056a565b8015620002465780601f106200021a5761010080835404028352916020019162000246565b820191906000526020600020905b8154815290600101906020018083116200022857829003601f168201915b5050505050600b54600a546000811162000297576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028e9062000537565b60405180910390fd5b60008211620002dd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002d49062000515565b60405180910390fd5b8360019080519060200190620002f592919062000417565b5082600290805190602001906200030e92919062000417565b508160a0818152505080608081815250505050505062000343620003376200034960201b60201c565b6200035160201b60201c565b6200066d565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b82805462000425906200056a565b90600052602060002090601f01602090048101928262000449576000855562000495565b82601f106200046457805160ff191683800117855562000495565b8280016001018555821562000495579182015b828111156200049457825182559160200191906001019062000477565b5b509050620004a49190620004a8565b5090565b5b80821115620004c3576000816000905550600101620004a9565b5090565b6000620004d660278362000559565b9150620004e382620005cf565b604082019050919050565b6000620004fd602e8362000559565b91506200050a826200061e565b604082019050919050565b600060208201905081810360008301526200053081620004c7565b9050919050565b600060208201905081810360008301526200055281620004ee565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200058357607f821691505b602082108114156200059a5762000599620005a0565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243373231413a206d61782062617463682073697a65206d7573742062652060008201527f6e6f6e7a65726f00000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060008201527f6e6f6e7a65726f20737570706c79000000000000000000000000000000000000602082015250565b60805160a0516146fb6200069e600039600081816122a0015281816122c9015261298a0152600050506146fb6000f3fe6080604052600436106101f95760003560e01c80637c928fe91161010d578063b88d4fde116100a0578063da241d061161006f578063da241d0614610704578063e03c69e81461072f578063e985e9c51461075a578063f2fde38b14610797578063f7cd09c7146107c0576101f9565b8063b88d4fde14610648578063c87b56dd14610671578063cce132d1146106ae578063d7224ba0146106d9576101f9565b8063a0712d68116100dc578063a0712d68146105ad578063a22cb465146105c9578063a7b8cd4d146105f2578063b875e2ce1461061d576101f9565b80637c928fe9146105175780638da5cb5b1461054057806395d89b411461056b57806396f8f6dd14610596576101f9565b80633ccfd60b11610190578063676dd5631161015f578063676dd563146104425780636c0360eb1461046d5780636fe8f9c51461049857806370a08231146104c3578063715018a614610500576101f9565b80633ccfd60b1461038857806342842e0e1461039f5780634f6ccce7146103c85780636352211e14610405576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613091565b6107eb565b6040516102329190613652565b60405180910390f35b34801561024757600080fd5b50610250610935565b60405161025d919061366d565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906130eb565b6109c7565b60405161029a91906135eb565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613051565b610a4c565b005b3480156102d857600080fd5b506102e1610b65565b6040516102ee91906139ef565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612f3b565b610b6e565b005b34801561032c57600080fd5b5061034760048036038101906103429190613051565b610b7e565b60405161035491906139ef565b60405180910390f35b34801561036957600080fd5b50610372610d7c565b60405161037f91906139ef565b60405180910390f35b34801561039457600080fd5b5061039d610d82565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612f3b565b610e3e565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906130eb565b610e5e565b6040516103fc91906139ef565b60405180910390f35b34801561041157600080fd5b5061042c600480360381019061042791906130eb565b610eb1565b60405161043991906135eb565b60405180910390f35b34801561044e57600080fd5b50610457610ec7565b60405161046491906139ef565b60405180910390f35b34801561047957600080fd5b50610482610ecd565b60405161048f919061366d565b60405180910390f35b3480156104a457600080fd5b506104ad610f5b565b6040516104ba91906139ef565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e59190612ece565b610f61565b6040516104f791906139ef565b60405180910390f35b34801561050c57600080fd5b5061051561104a565b005b34801561052357600080fd5b5061053e600480360381019061053991906130eb565b6110d2565b005b34801561054c57600080fd5b50610555611312565b60405161056291906135eb565b60405180910390f35b34801561057757600080fd5b5061058061133c565b60405161058d919061366d565b60405180910390f35b3480156105a257600080fd5b506105ab6113ce565b005b6105c760048036038101906105c291906130eb565b611476565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613011565b6115ca565b005b3480156105fe57600080fd5b5061060761174b565b60405161061491906139ef565b60405180910390f35b34801561062957600080fd5b50610632611792565b60405161063f91906139ef565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190612f8e565b611798565b005b34801561067d57600080fd5b50610698600480360381019061069391906130eb565b6117f4565b6040516106a5919061366d565b60405180910390f35b3480156106ba57600080fd5b506106c361189b565b6040516106d091906139ef565b60405180910390f35b3480156106e557600080fd5b506106ee6118a1565b6040516106fb91906139ef565b60405180910390f35b34801561071057600080fd5b506107196118a7565b604051610726919061366d565b60405180910390f35b34801561073b57600080fd5b50610744611935565b604051610751919061366d565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190612efb565b6119c3565b60405161078e9190613652565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190612ece565b611a57565b005b3480156107cc57600080fd5b506107d5611b4f565b6040516107e29190613652565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092e575061092d82611b62565b5b9050919050565b60606001805461094490613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461097090613d2e565b80156109bd5780601f10610992576101008083540402835291602001916109bd565b820191906000526020600020905b8154815290600101906020018083116109a057829003601f168201915b5050505050905090565b60006109d282611bcc565b610a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a08906139af565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5782610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf906138ef565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae7611bd9565b73ffffffffffffffffffffffffffffffffffffffff161480610b165750610b1581610b10611bd9565b6119c3565b5b610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c906137cf565b60405180910390fd5b610b60838383611be1565b505050565b60008054905090565b610b79838383611c93565b505050565b6000610b8983610f61565b8210610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc19061368f565b60405180910390fd5b6000610bd4610b65565b905060008060005b83811015610d3a576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cce57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d265786841415610d17578195505050505050610d76565b8380610d2290613d91565b9450505b508080610d3290613d91565b915050610bdc565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d9061396f565b60405180910390fd5b92915050565b600a5481565b610d8a611bd9565b73ffffffffffffffffffffffffffffffffffffffff16610da8611312565b73ffffffffffffffffffffffffffffffffffffffff1614610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df59061384f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610e3c57600080fd5b565b610e5983838360405180602001604052806000815250611798565b505050565b6000610e68610b65565b8210610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea09061372f565b60405180910390fd5b819050919050565b6000610ebc8261224c565b600001519050919050565b60095481565b60118054610eda90613d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0690613d2e565b8015610f535780601f10610f2857610100808354040283529160200191610f53565b820191906000526020600020905b815481529060010190602001808311610f3657829003601f168201915b505050505081565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc99061380f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611052611bd9565b73ffffffffffffffffffffffffffffffffffffffff16611070611312565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd9061384f565b60405180910390fd5b6110d0600061244f565b565b601060009054906101000a900460ff16611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906137af565b60405180910390fd5b6000811180156111335750600c548111155b611172576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611169906137ef565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111c09190613ae9565b1115611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f89061370f565b60405180910390fd5b600a548161120d610b65565b6112179190613ae9565b1115611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f906136af565b60405180910390fd5b600d5481611264610b65565b61126e9190613ae9565b11156112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a69061376f565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112fe9190613ae9565b9250508190555061130f3382612515565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461134b90613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461137790613d2e565b80156113c45780601f10611399576101008083540402835291602001916113c4565b820191906000526020600020905b8154815290600101906020018083116113a757829003601f168201915b5050505050905090565b6113d6611bd9565b73ffffffffffffffffffffffffffffffffffffffff166113f4611312565b73ffffffffffffffffffffffffffffffffffffffff161461144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061384f565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b601060009054906101000a900460ff166114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc906137af565b60405180910390fd5b6000811180156114d75750600b548111155b611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906138cf565b60405180910390fd5b600a5481611522610b65565b61152c9190613ae9565b111561156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906136af565b60405180910390fd5b8060095461157b9190613b70565b3410156115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b49061378f565b60405180910390fd5b6115c73382612515565b50565b6115d2611bd9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061388f565b60405180910390fd5b806006600061164d611bd9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116fa611bd9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161173f9190613652565b60405180910390a35050565b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600c5481565b6117a3848484611c93565b6117af84848484612533565b6117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e59061390f565b60405180910390fd5b50505050565b60606117ff82611bcc565b61183e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118359061386f565b60405180910390fd5b60006118486126ca565b905060008151116118685760405180602001604052806000815250611893565b806118728461275c565b6040516020016118839291906135bc565b6040516020818303038152906040525b915050919050565b600b5481565b60075481565b600f80546118b490613d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546118e090613d2e565b801561192d5780601f106119025761010080835404028352916020019161192d565b820191906000526020600020905b81548152906001019060200180831161191057829003601f168201915b505050505081565b600e805461194290613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461196e90613d2e565b80156119bb5780601f10611990576101008083540402835291602001916119bb565b820191906000526020600020905b81548152906001019060200180831161199e57829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5f611bd9565b73ffffffffffffffffffffffffffffffffffffffff16611a7d611312565b73ffffffffffffffffffffffffffffffffffffffff1614611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca9061384f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a906136cf565b60405180910390fd5b611b4c8161244f565b50565b601060009054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c9e8261224c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cc5611bd9565b73ffffffffffffffffffffffffffffffffffffffff161480611d215750611cea611bd9565b73ffffffffffffffffffffffffffffffffffffffff16611d09846109c7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d3d5750611d3c8260000151611d37611bd9565b6119c3565b5b905080611d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d76906138af565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de89061382f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e589061374f565b60405180910390fd5b611e6e85858560016128bd565b611e7e6000848460000151611be1565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611eec9190613bca565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f909190613aa3565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120969190613ae9565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121dc5761210c81611bcc565b156121db576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461224486868660016128c3565b505050505050565b612254612dbb565b61225d82611bcc565b61229c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612293906136ef565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000083106123005760017f0000000000000000000000000000000000000000000000000000000000000000846122f39190613bfe565b6122fd9190613ae9565b90505b60008390505b81811061240e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123fa5780935050505061244a565b50808061240690613d04565b915050612306565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124419061398f565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61252f8282604051806020016040528060008152506128c9565b5050565b60006125548473ffffffffffffffffffffffffffffffffffffffff16612da8565b156126bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261257d611bd9565b8786866040518563ffffffff1660e01b815260040161259f9493929190613606565b602060405180830381600087803b1580156125b957600080fd5b505af19250505080156125ea57506040513d601f19601f820116820180604052508101906125e791906130be565b60015b61266d573d806000811461261a576040519150601f19603f3d011682016040523d82523d6000602084013e61261f565b606091505b50600081511415612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c9061390f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126c2565b600190505b949350505050565b6060601180546126d990613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461270590613d2e565b80156127525780601f1061272757610100808354040283529160200191612752565b820191906000526020600020905b81548152906001019060200180831161273557829003601f168201915b5050505050905090565b606060008214156127a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128b8565b600082905060005b600082146127d65780806127bf90613d91565b915050600a826127cf9190613b3f565b91506127ac565b60008167ffffffffffffffff8111156127f2576127f1613ec7565b5b6040519080825280601f01601f1916602001820160405280156128245781602001600182028036833780820191505090505b5090505b600085146128b15760018261283d9190613bfe565b9150600a8561284c9190613dda565b60306128589190613ae9565b60f81b81838151811061286e5761286d613e98565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128aa9190613b3f565b9450612828565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561293f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129369061394f565b60405180910390fd5b61294881611bcc565b15612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f9061392f565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000008311156129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e2906139cf565b60405180910390fd5b6129f860008583866128bd565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612af59190613aa3565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b1c9190613aa3565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612d8b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d2b6000888488612533565b612d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d619061390f565b60405180910390fd5b8180612d7590613d91565b9250508080612d8390613d91565b915050612cba565b5080600081905550612da060008785886128c3565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000612e08612e0384613a2f565b613a0a565b905082815260208101848484011115612e2457612e23613efb565b5b612e2f848285613cc2565b509392505050565b600081359050612e4681614669565b92915050565b600081359050612e5b81614680565b92915050565b600081359050612e7081614697565b92915050565b600081519050612e8581614697565b92915050565b600082601f830112612ea057612e9f613ef6565b5b8135612eb0848260208601612df5565b91505092915050565b600081359050612ec8816146ae565b92915050565b600060208284031215612ee457612ee3613f05565b5b6000612ef284828501612e37565b91505092915050565b60008060408385031215612f1257612f11613f05565b5b6000612f2085828601612e37565b9250506020612f3185828601612e37565b9150509250929050565b600080600060608486031215612f5457612f53613f05565b5b6000612f6286828701612e37565b9350506020612f7386828701612e37565b9250506040612f8486828701612eb9565b9150509250925092565b60008060008060808587031215612fa857612fa7613f05565b5b6000612fb687828801612e37565b9450506020612fc787828801612e37565b9350506040612fd887828801612eb9565b925050606085013567ffffffffffffffff811115612ff957612ff8613f00565b5b61300587828801612e8b565b91505092959194509250565b6000806040838503121561302857613027613f05565b5b600061303685828601612e37565b925050602061304785828601612e4c565b9150509250929050565b6000806040838503121561306857613067613f05565b5b600061307685828601612e37565b925050602061308785828601612eb9565b9150509250929050565b6000602082840312156130a7576130a6613f05565b5b60006130b584828501612e61565b91505092915050565b6000602082840312156130d4576130d3613f05565b5b60006130e284828501612e76565b91505092915050565b60006020828403121561310157613100613f05565b5b600061310f84828501612eb9565b91505092915050565b61312181613c32565b82525050565b61313081613c44565b82525050565b600061314182613a60565b61314b8185613a76565b935061315b818560208601613cd1565b61316481613f0a565b840191505092915050565b600061317a82613a6b565b6131848185613a87565b9350613194818560208601613cd1565b61319d81613f0a565b840191505092915050565b60006131b382613a6b565b6131bd8185613a98565b93506131cd818560208601613cd1565b80840191505092915050565b60006131e6602283613a87565b91506131f182613f1b565b604082019050919050565b6000613209600883613a87565b915061321482613f6a565b602082019050919050565b600061322c602683613a87565b915061323782613f93565b604082019050919050565b600061324f602a83613a87565b915061325a82613fe2565b604082019050919050565b6000613272602083613a87565b915061327d82614031565b602082019050919050565b6000613295602383613a87565b91506132a08261405a565b604082019050919050565b60006132b8602583613a87565b91506132c3826140a9565b604082019050919050565b60006132db602083613a87565b91506132e6826140f8565b602082019050919050565b60006132fe602283613a87565b915061330982614121565b604082019050919050565b6000613321601083613a87565b915061332c82614170565b602082019050919050565b6000613344603983613a87565b915061334f82614199565b604082019050919050565b6000613367602083613a87565b9150613372826141e8565b602082019050919050565b600061338a602b83613a87565b915061339582614211565b604082019050919050565b60006133ad602683613a87565b91506133b882614260565b604082019050919050565b60006133d0600583613a98565b91506133db826142af565b600582019050919050565b60006133f3602083613a87565b91506133fe826142d8565b602082019050919050565b6000613416602f83613a87565b915061342182614301565b604082019050919050565b6000613439601a83613a87565b915061344482614350565b602082019050919050565b600061345c603283613a87565b915061346782614379565b604082019050919050565b600061347f602183613a87565b915061348a826143c8565b604082019050919050565b60006134a2602283613a87565b91506134ad82614417565b604082019050919050565b60006134c5603383613a87565b91506134d082614466565b604082019050919050565b60006134e8601d83613a87565b91506134f3826144b5565b602082019050919050565b600061350b602183613a87565b9150613516826144de565b604082019050919050565b600061352e602e83613a87565b91506135398261452d565b604082019050919050565b6000613551602f83613a87565b915061355c8261457c565b604082019050919050565b6000613574602d83613a87565b915061357f826145cb565b604082019050919050565b6000613597602283613a87565b91506135a28261461a565b604082019050919050565b6135b681613cb8565b82525050565b60006135c882856131a8565b91506135d482846131a8565b91506135df826133c3565b91508190509392505050565b60006020820190506136006000830184613118565b92915050565b600060808201905061361b6000830187613118565b6136286020830186613118565b61363560408301856135ad565b81810360608301526136478184613136565b905095945050505050565b60006020820190506136676000830184613127565b92915050565b60006020820190508181036000830152613687818461316f565b905092915050565b600060208201905081810360008301526136a8816131d9565b9050919050565b600060208201905081810360008301526136c8816131fc565b9050919050565b600060208201905081810360008301526136e88161321f565b9050919050565b6000602082019050818103600083015261370881613242565b9050919050565b6000602082019050818103600083015261372881613265565b9050919050565b6000602082019050818103600083015261374881613288565b9050919050565b60006020820190508181036000830152613768816132ab565b9050919050565b60006020820190508181036000830152613788816132ce565b9050919050565b600060208201905081810360008301526137a8816132f1565b9050919050565b600060208201905081810360008301526137c881613314565b9050919050565b600060208201905081810360008301526137e881613337565b9050919050565b600060208201905081810360008301526138088161335a565b9050919050565b600060208201905081810360008301526138288161337d565b9050919050565b60006020820190508181036000830152613848816133a0565b9050919050565b60006020820190508181036000830152613868816133e6565b9050919050565b6000602082019050818103600083015261388881613409565b9050919050565b600060208201905081810360008301526138a88161342c565b9050919050565b600060208201905081810360008301526138c88161344f565b9050919050565b600060208201905081810360008301526138e881613472565b9050919050565b6000602082019050818103600083015261390881613495565b9050919050565b60006020820190508181036000830152613928816134b8565b9050919050565b60006020820190508181036000830152613948816134db565b9050919050565b60006020820190508181036000830152613968816134fe565b9050919050565b6000602082019050818103600083015261398881613521565b9050919050565b600060208201905081810360008301526139a881613544565b9050919050565b600060208201905081810360008301526139c881613567565b9050919050565b600060208201905081810360008301526139e88161358a565b9050919050565b6000602082019050613a0460008301846135ad565b92915050565b6000613a14613a25565b9050613a208282613d60565b919050565b6000604051905090565b600067ffffffffffffffff821115613a4a57613a49613ec7565b5b613a5382613f0a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613aae82613c7c565b9150613ab983613c7c565b9250826fffffffffffffffffffffffffffffffff03821115613ade57613add613e0b565b5b828201905092915050565b6000613af482613cb8565b9150613aff83613cb8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b3457613b33613e0b565b5b828201905092915050565b6000613b4a82613cb8565b9150613b5583613cb8565b925082613b6557613b64613e3a565b5b828204905092915050565b6000613b7b82613cb8565b9150613b8683613cb8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bbf57613bbe613e0b565b5b828202905092915050565b6000613bd582613c7c565b9150613be083613c7c565b925082821015613bf357613bf2613e0b565b5b828203905092915050565b6000613c0982613cb8565b9150613c1483613cb8565b925082821015613c2757613c26613e0b565b5b828203905092915050565b6000613c3d82613c98565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cef578082015181840152602081019050613cd4565b83811115613cfe576000848401525b50505050565b6000613d0f82613cb8565b91506000821415613d2357613d22613e0b565b5b600182039050919050565b60006002820490506001821680613d4657607f821691505b60208210811415613d5a57613d59613e69565b5b50919050565b613d6982613f0a565b810181811067ffffffffffffffff82111715613d8857613d87613ec7565b5b80604052505050565b6000613d9c82613cb8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dcf57613dce613e0b565b5b600182019050919050565b6000613de582613cb8565b9150613df083613cb8565b925082613e0057613dff613e3a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4f6e6c792035207265736572766564206d696e7473207065722077616c6c6574600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f546865726520617265206e6f207265736572766564206d696e7473206c656674600082015250565b7f416d6f756e74206f662065746865722073656e74206973206e6f7420656e6f7560008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f4d757374206d696e74206265747765656e203120616e64203520746f6b656e73600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d757374206d696e74206265747765656e203120616e6420313020746f6b656e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61467281613c32565b811461467d57600080fd5b50565b61468981613c44565b811461469457600080fd5b50565b6146a081613c50565b81146146ab57600080fd5b50565b6146b781613cb8565b81146146c257600080fd5b5056fea26469706673582212200b51b114d45b04dfb7031fc435bb3dd2b303ed1fa34aed7ce8720e84b455b60b64736f6c6343000807003368747470733a2f2f697066732e696f2f697066732f516d594c7a4d34757671783372386d4131567561414b755a6b5364587032674237376d683578743376597852576f2f

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80637c928fe91161010d578063b88d4fde116100a0578063da241d061161006f578063da241d0614610704578063e03c69e81461072f578063e985e9c51461075a578063f2fde38b14610797578063f7cd09c7146107c0576101f9565b8063b88d4fde14610648578063c87b56dd14610671578063cce132d1146106ae578063d7224ba0146106d9576101f9565b8063a0712d68116100dc578063a0712d68146105ad578063a22cb465146105c9578063a7b8cd4d146105f2578063b875e2ce1461061d576101f9565b80637c928fe9146105175780638da5cb5b1461054057806395d89b411461056b57806396f8f6dd14610596576101f9565b80633ccfd60b11610190578063676dd5631161015f578063676dd563146104425780636c0360eb1461046d5780636fe8f9c51461049857806370a08231146104c3578063715018a614610500576101f9565b80633ccfd60b1461038857806342842e0e1461039f5780634f6ccce7146103c85780636352211e14610405576101f9565b806318160ddd116101cc57806318160ddd146102cc57806323b872dd146102f75780632f745c591461032057806332cb6b0c1461035d576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613091565b6107eb565b6040516102329190613652565b60405180910390f35b34801561024757600080fd5b50610250610935565b60405161025d919061366d565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906130eb565b6109c7565b60405161029a91906135eb565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613051565b610a4c565b005b3480156102d857600080fd5b506102e1610b65565b6040516102ee91906139ef565b60405180910390f35b34801561030357600080fd5b5061031e60048036038101906103199190612f3b565b610b6e565b005b34801561032c57600080fd5b5061034760048036038101906103429190613051565b610b7e565b60405161035491906139ef565b60405180910390f35b34801561036957600080fd5b50610372610d7c565b60405161037f91906139ef565b60405180910390f35b34801561039457600080fd5b5061039d610d82565b005b3480156103ab57600080fd5b506103c660048036038101906103c19190612f3b565b610e3e565b005b3480156103d457600080fd5b506103ef60048036038101906103ea91906130eb565b610e5e565b6040516103fc91906139ef565b60405180910390f35b34801561041157600080fd5b5061042c600480360381019061042791906130eb565b610eb1565b60405161043991906135eb565b60405180910390f35b34801561044e57600080fd5b50610457610ec7565b60405161046491906139ef565b60405180910390f35b34801561047957600080fd5b50610482610ecd565b60405161048f919061366d565b60405180910390f35b3480156104a457600080fd5b506104ad610f5b565b6040516104ba91906139ef565b60405180910390f35b3480156104cf57600080fd5b506104ea60048036038101906104e59190612ece565b610f61565b6040516104f791906139ef565b60405180910390f35b34801561050c57600080fd5b5061051561104a565b005b34801561052357600080fd5b5061053e600480360381019061053991906130eb565b6110d2565b005b34801561054c57600080fd5b50610555611312565b60405161056291906135eb565b60405180910390f35b34801561057757600080fd5b5061058061133c565b60405161058d919061366d565b60405180910390f35b3480156105a257600080fd5b506105ab6113ce565b005b6105c760048036038101906105c291906130eb565b611476565b005b3480156105d557600080fd5b506105f060048036038101906105eb9190613011565b6115ca565b005b3480156105fe57600080fd5b5061060761174b565b60405161061491906139ef565b60405180910390f35b34801561062957600080fd5b50610632611792565b60405161063f91906139ef565b60405180910390f35b34801561065457600080fd5b5061066f600480360381019061066a9190612f8e565b611798565b005b34801561067d57600080fd5b50610698600480360381019061069391906130eb565b6117f4565b6040516106a5919061366d565b60405180910390f35b3480156106ba57600080fd5b506106c361189b565b6040516106d091906139ef565b60405180910390f35b3480156106e557600080fd5b506106ee6118a1565b6040516106fb91906139ef565b60405180910390f35b34801561071057600080fd5b506107196118a7565b604051610726919061366d565b60405180910390f35b34801561073b57600080fd5b50610744611935565b604051610751919061366d565b60405180910390f35b34801561076657600080fd5b50610781600480360381019061077c9190612efb565b6119c3565b60405161078e9190613652565b60405180910390f35b3480156107a357600080fd5b506107be60048036038101906107b99190612ece565b611a57565b005b3480156107cc57600080fd5b506107d5611b4f565b6040516107e29190613652565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108b657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061091e57507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061092e575061092d82611b62565b5b9050919050565b60606001805461094490613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461097090613d2e565b80156109bd5780601f10610992576101008083540402835291602001916109bd565b820191906000526020600020905b8154815290600101906020018083116109a057829003601f168201915b5050505050905090565b60006109d282611bcc565b610a11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a08906139af565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a5782610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf906138ef565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae7611bd9565b73ffffffffffffffffffffffffffffffffffffffff161480610b165750610b1581610b10611bd9565b6119c3565b5b610b55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4c906137cf565b60405180910390fd5b610b60838383611be1565b505050565b60008054905090565b610b79838383611c93565b505050565b6000610b8983610f61565b8210610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc19061368f565b60405180910390fd5b6000610bd4610b65565b905060008060005b83811015610d3a576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610cce57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d265786841415610d17578195505050505050610d76565b8380610d2290613d91565b9450505b508080610d3290613d91565b915050610bdc565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d9061396f565b60405180910390fd5b92915050565b600a5481565b610d8a611bd9565b73ffffffffffffffffffffffffffffffffffffffff16610da8611312565b73ffffffffffffffffffffffffffffffffffffffff1614610dfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df59061384f565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610e3c57600080fd5b565b610e5983838360405180602001604052806000815250611798565b505050565b6000610e68610b65565b8210610ea9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea09061372f565b60405180910390fd5b819050919050565b6000610ebc8261224c565b600001519050919050565b60095481565b60118054610eda90613d2e565b80601f0160208091040260200160405190810160405280929190818152602001828054610f0690613d2e565b8015610f535780601f10610f2857610100808354040283529160200191610f53565b820191906000526020600020905b815481529060010190602001808311610f3657829003601f168201915b505050505081565b600d5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc99061380f565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611052611bd9565b73ffffffffffffffffffffffffffffffffffffffff16611070611312565b73ffffffffffffffffffffffffffffffffffffffff16146110c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bd9061384f565b60405180910390fd5b6110d0600061244f565b565b601060009054906101000a900460ff16611121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611118906137af565b60405180910390fd5b6000811180156111335750600c548111155b611172576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611169906137ef565b60405180910390fd5b600c5481601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546111c09190613ae9565b1115611201576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f89061370f565b60405180910390fd5b600a548161120d610b65565b6112179190613ae9565b1115611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f906136af565b60405180910390fd5b600d5481611264610b65565b61126e9190613ae9565b11156112af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a69061376f565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546112fe9190613ae9565b9250508190555061130f3382612515565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461134b90613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461137790613d2e565b80156113c45780601f10611399576101008083540402835291602001916113c4565b820191906000526020600020905b8154815290600101906020018083116113a757829003601f168201915b5050505050905090565b6113d6611bd9565b73ffffffffffffffffffffffffffffffffffffffff166113f4611312565b73ffffffffffffffffffffffffffffffffffffffff161461144a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114419061384f565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b601060009054906101000a900460ff166114c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114bc906137af565b60405180910390fd5b6000811180156114d75750600b548111155b611516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150d906138cf565b60405180910390fd5b600a5481611522610b65565b61152c9190613ae9565b111561156d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611564906136af565b60405180910390fd5b8060095461157b9190613b70565b3410156115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b49061378f565b60405180910390fd5b6115c73382612515565b50565b6115d2611bd9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611640576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116379061388f565b60405180910390fd5b806006600061164d611bd9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116fa611bd9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161173f9190613652565b60405180910390a35050565b6000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b600c5481565b6117a3848484611c93565b6117af84848484612533565b6117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e59061390f565b60405180910390fd5b50505050565b60606117ff82611bcc565b61183e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118359061386f565b60405180910390fd5b60006118486126ca565b905060008151116118685760405180602001604052806000815250611893565b806118728461275c565b6040516020016118839291906135bc565b6040516020818303038152906040525b915050919050565b600b5481565b60075481565b600f80546118b490613d2e565b80601f01602080910402602001604051908101604052809291908181526020018280546118e090613d2e565b801561192d5780601f106119025761010080835404028352916020019161192d565b820191906000526020600020905b81548152906001019060200180831161191057829003601f168201915b505050505081565b600e805461194290613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461196e90613d2e565b80156119bb5780601f10611990576101008083540402835291602001916119bb565b820191906000526020600020905b81548152906001019060200180831161199e57829003601f168201915b505050505081565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611a5f611bd9565b73ffffffffffffffffffffffffffffffffffffffff16611a7d611312565b73ffffffffffffffffffffffffffffffffffffffff1614611ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aca9061384f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3a906136cf565b60405180910390fd5b611b4c8161244f565b50565b601060009054906101000a900460ff1681565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b600033905090565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000611c9e8261224c565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff16611cc5611bd9565b73ffffffffffffffffffffffffffffffffffffffff161480611d215750611cea611bd9565b73ffffffffffffffffffffffffffffffffffffffff16611d09846109c7565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d3d5750611d3c8260000151611d37611bd9565b6119c3565b5b905080611d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d76906138af565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de89061382f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e589061374f565b60405180910390fd5b611e6e85858560016128bd565b611e7e6000848460000151611be1565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611eec9190613bca565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff16611f909190613aa3565b92506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060405180604001604052808573ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555090505060006001846120969190613ae9565b9050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156121dc5761210c81611bcc565b156121db576040518060400160405280846000015173ffffffffffffffffffffffffffffffffffffffff168152602001846020015167ffffffffffffffff168152506003600083815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055509050505b5b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461224486868660016128c3565b505050505050565b612254612dbb565b61225d82611bcc565b61229c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612293906136ef565b60405180910390fd5b60007f000000000000000000000000000000000000000000000000000000000000000a83106123005760017f000000000000000000000000000000000000000000000000000000000000000a846122f39190613bfe565b6122fd9190613ae9565b90505b60008390505b81811061240e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146123fa5780935050505061244a565b50808061240690613d04565b915050612306565b506040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124419061398f565b60405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b61252f8282604051806020016040528060008152506128c9565b5050565b60006125548473ffffffffffffffffffffffffffffffffffffffff16612da8565b156126bd578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261257d611bd9565b8786866040518563ffffffff1660e01b815260040161259f9493929190613606565b602060405180830381600087803b1580156125b957600080fd5b505af19250505080156125ea57506040513d601f19601f820116820180604052508101906125e791906130be565b60015b61266d573d806000811461261a576040519150601f19603f3d011682016040523d82523d6000602084013e61261f565b606091505b50600081511415612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265c9061390f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126c2565b600190505b949350505050565b6060601180546126d990613d2e565b80601f016020809104026020016040519081016040528092919081815260200182805461270590613d2e565b80156127525780601f1061272757610100808354040283529160200191612752565b820191906000526020600020905b81548152906001019060200180831161273557829003601f168201915b5050505050905090565b606060008214156127a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506128b8565b600082905060005b600082146127d65780806127bf90613d91565b915050600a826127cf9190613b3f565b91506127ac565b60008167ffffffffffffffff8111156127f2576127f1613ec7565b5b6040519080825280601f01601f1916602001820160405280156128245781602001600182028036833780820191505090505b5090505b600085146128b15760018261283d9190613bfe565b9150600a8561284c9190613dda565b60306128589190613ae9565b60f81b81838151811061286e5761286d613e98565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128aa9190613b3f565b9450612828565b8093505050505b919050565b50505050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561293f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129369061394f565b60405180910390fd5b61294881611bcc565b15612988576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161297f9061392f565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000a8311156129eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e2906139cf565b60405180910390fd5b6129f860008583866128bd565b6000600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206040518060400160405290816000820160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681526020016000820160109054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168152505090506040518060400160405280858360000151612af59190613aa3565b6fffffffffffffffffffffffffffffffff168152602001858360200151612b1c9190613aa3565b6fffffffffffffffffffffffffffffffff16815250600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060208201518160000160106101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555090505060405180604001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020014267ffffffffffffffff168152506003600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550905050600082905060005b85811015612d8b57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d2b6000888488612533565b612d6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d619061390f565b60405180910390fd5b8180612d7590613d91565b9250508080612d8390613d91565b915050612cba565b5080600081905550612da060008785886128c3565b505050505050565b600080823b905060008111915050919050565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b6000612e08612e0384613a2f565b613a0a565b905082815260208101848484011115612e2457612e23613efb565b5b612e2f848285613cc2565b509392505050565b600081359050612e4681614669565b92915050565b600081359050612e5b81614680565b92915050565b600081359050612e7081614697565b92915050565b600081519050612e8581614697565b92915050565b600082601f830112612ea057612e9f613ef6565b5b8135612eb0848260208601612df5565b91505092915050565b600081359050612ec8816146ae565b92915050565b600060208284031215612ee457612ee3613f05565b5b6000612ef284828501612e37565b91505092915050565b60008060408385031215612f1257612f11613f05565b5b6000612f2085828601612e37565b9250506020612f3185828601612e37565b9150509250929050565b600080600060608486031215612f5457612f53613f05565b5b6000612f6286828701612e37565b9350506020612f7386828701612e37565b9250506040612f8486828701612eb9565b9150509250925092565b60008060008060808587031215612fa857612fa7613f05565b5b6000612fb687828801612e37565b9450506020612fc787828801612e37565b9350506040612fd887828801612eb9565b925050606085013567ffffffffffffffff811115612ff957612ff8613f00565b5b61300587828801612e8b565b91505092959194509250565b6000806040838503121561302857613027613f05565b5b600061303685828601612e37565b925050602061304785828601612e4c565b9150509250929050565b6000806040838503121561306857613067613f05565b5b600061307685828601612e37565b925050602061308785828601612eb9565b9150509250929050565b6000602082840312156130a7576130a6613f05565b5b60006130b584828501612e61565b91505092915050565b6000602082840312156130d4576130d3613f05565b5b60006130e284828501612e76565b91505092915050565b60006020828403121561310157613100613f05565b5b600061310f84828501612eb9565b91505092915050565b61312181613c32565b82525050565b61313081613c44565b82525050565b600061314182613a60565b61314b8185613a76565b935061315b818560208601613cd1565b61316481613f0a565b840191505092915050565b600061317a82613a6b565b6131848185613a87565b9350613194818560208601613cd1565b61319d81613f0a565b840191505092915050565b60006131b382613a6b565b6131bd8185613a98565b93506131cd818560208601613cd1565b80840191505092915050565b60006131e6602283613a87565b91506131f182613f1b565b604082019050919050565b6000613209600883613a87565b915061321482613f6a565b602082019050919050565b600061322c602683613a87565b915061323782613f93565b604082019050919050565b600061324f602a83613a87565b915061325a82613fe2565b604082019050919050565b6000613272602083613a87565b915061327d82614031565b602082019050919050565b6000613295602383613a87565b91506132a08261405a565b604082019050919050565b60006132b8602583613a87565b91506132c3826140a9565b604082019050919050565b60006132db602083613a87565b91506132e6826140f8565b602082019050919050565b60006132fe602283613a87565b915061330982614121565b604082019050919050565b6000613321601083613a87565b915061332c82614170565b602082019050919050565b6000613344603983613a87565b915061334f82614199565b604082019050919050565b6000613367602083613a87565b9150613372826141e8565b602082019050919050565b600061338a602b83613a87565b915061339582614211565b604082019050919050565b60006133ad602683613a87565b91506133b882614260565b604082019050919050565b60006133d0600583613a98565b91506133db826142af565b600582019050919050565b60006133f3602083613a87565b91506133fe826142d8565b602082019050919050565b6000613416602f83613a87565b915061342182614301565b604082019050919050565b6000613439601a83613a87565b915061344482614350565b602082019050919050565b600061345c603283613a87565b915061346782614379565b604082019050919050565b600061347f602183613a87565b915061348a826143c8565b604082019050919050565b60006134a2602283613a87565b91506134ad82614417565b604082019050919050565b60006134c5603383613a87565b91506134d082614466565b604082019050919050565b60006134e8601d83613a87565b91506134f3826144b5565b602082019050919050565b600061350b602183613a87565b9150613516826144de565b604082019050919050565b600061352e602e83613a87565b91506135398261452d565b604082019050919050565b6000613551602f83613a87565b915061355c8261457c565b604082019050919050565b6000613574602d83613a87565b915061357f826145cb565b604082019050919050565b6000613597602283613a87565b91506135a28261461a565b604082019050919050565b6135b681613cb8565b82525050565b60006135c882856131a8565b91506135d482846131a8565b91506135df826133c3565b91508190509392505050565b60006020820190506136006000830184613118565b92915050565b600060808201905061361b6000830187613118565b6136286020830186613118565b61363560408301856135ad565b81810360608301526136478184613136565b905095945050505050565b60006020820190506136676000830184613127565b92915050565b60006020820190508181036000830152613687818461316f565b905092915050565b600060208201905081810360008301526136a8816131d9565b9050919050565b600060208201905081810360008301526136c8816131fc565b9050919050565b600060208201905081810360008301526136e88161321f565b9050919050565b6000602082019050818103600083015261370881613242565b9050919050565b6000602082019050818103600083015261372881613265565b9050919050565b6000602082019050818103600083015261374881613288565b9050919050565b60006020820190508181036000830152613768816132ab565b9050919050565b60006020820190508181036000830152613788816132ce565b9050919050565b600060208201905081810360008301526137a8816132f1565b9050919050565b600060208201905081810360008301526137c881613314565b9050919050565b600060208201905081810360008301526137e881613337565b9050919050565b600060208201905081810360008301526138088161335a565b9050919050565b600060208201905081810360008301526138288161337d565b9050919050565b60006020820190508181036000830152613848816133a0565b9050919050565b60006020820190508181036000830152613868816133e6565b9050919050565b6000602082019050818103600083015261388881613409565b9050919050565b600060208201905081810360008301526138a88161342c565b9050919050565b600060208201905081810360008301526138c88161344f565b9050919050565b600060208201905081810360008301526138e881613472565b9050919050565b6000602082019050818103600083015261390881613495565b9050919050565b60006020820190508181036000830152613928816134b8565b9050919050565b60006020820190508181036000830152613948816134db565b9050919050565b60006020820190508181036000830152613968816134fe565b9050919050565b6000602082019050818103600083015261398881613521565b9050919050565b600060208201905081810360008301526139a881613544565b9050919050565b600060208201905081810360008301526139c881613567565b9050919050565b600060208201905081810360008301526139e88161358a565b9050919050565b6000602082019050613a0460008301846135ad565b92915050565b6000613a14613a25565b9050613a208282613d60565b919050565b6000604051905090565b600067ffffffffffffffff821115613a4a57613a49613ec7565b5b613a5382613f0a565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613aae82613c7c565b9150613ab983613c7c565b9250826fffffffffffffffffffffffffffffffff03821115613ade57613add613e0b565b5b828201905092915050565b6000613af482613cb8565b9150613aff83613cb8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b3457613b33613e0b565b5b828201905092915050565b6000613b4a82613cb8565b9150613b5583613cb8565b925082613b6557613b64613e3a565b5b828204905092915050565b6000613b7b82613cb8565b9150613b8683613cb8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bbf57613bbe613e0b565b5b828202905092915050565b6000613bd582613c7c565b9150613be083613c7c565b925082821015613bf357613bf2613e0b565b5b828203905092915050565b6000613c0982613cb8565b9150613c1483613cb8565b925082821015613c2757613c26613e0b565b5b828203905092915050565b6000613c3d82613c98565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613cef578082015181840152602081019050613cd4565b83811115613cfe576000848401525b50505050565b6000613d0f82613cb8565b91506000821415613d2357613d22613e0b565b5b600182039050919050565b60006002820490506001821680613d4657607f821691505b60208210811415613d5a57613d59613e69565b5b50919050565b613d6982613f0a565b810181811067ffffffffffffffff82111715613d8857613d87613ec7565b5b80604052505050565b6000613d9c82613cb8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613dcf57613dce613e0b565b5b600182019050919050565b6000613de582613cb8565b9150613df083613cb8565b925082613e0057613dff613e3a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f536f6c64204f7574000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f4f6e6c792035207265736572766564206d696e7473207065722077616c6c6574600082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f546865726520617265206e6f207265736572766564206d696e7473206c656674600082015250565b7f416d6f756e74206f662065746865722073656e74206973206e6f7420656e6f7560008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74207374617274656400000000000000000000000000000000600082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f4d757374206d696e74206265747765656e203120616e64203520746f6b656e73600082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f4d757374206d696e74206265747765656e203120616e6420313020746f6b656e60008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a20746f6b656e20616c7265616479206d696e746564000000600082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e7469747920746f206d696e7420746f6f20686960008201527f6768000000000000000000000000000000000000000000000000000000000000602082015250565b61467281613c32565b811461467d57600080fd5b50565b61468981613c44565b811461469457600080fd5b50565b6146a081613c50565b81146146ab57600080fd5b50565b6146b781613cb8565b81146146c257600080fd5b5056fea26469706673582212200b51b114d45b04dfb7031fc435bb3dd2b303ed1fa34aed7ce8720e84b455b60b64736f6c63430008070033

Deployed Bytecode Sourcemap

42139:2847:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27310:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29036:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30570:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30133:379;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25874:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31420:142;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26502:744;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42230:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44871:112;;;;;;;;;;;;;:::i;:::-;;31625:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26037:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28859:118;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42186:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42513:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42349:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27736:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41248:103;;;;;;;;;;;;;:::i;:::-;;43241:711;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40597:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29191:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43960:87;;;;;;;;;;;;;:::i;:::-;;42748:485;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30838:274;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44743:120;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42305:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31845:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29352:403;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42269:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36176:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42434:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42387:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31175:186;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41506:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42473:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27310:370;27437:4;27482:25;27467:40;;;:11;:40;;;;:99;;;;27533:33;27518:48;;;:11;:48;;;;27467:99;:160;;;;27592:35;27577:50;;;:11;:50;;;;27467:160;:207;;;;27638:36;27662:11;27638:23;:36::i;:::-;27467:207;27453:221;;27310:370;;;:::o;29036:94::-;29090:13;29119:5;29112:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29036:94;:::o;30570:204::-;30638:7;30662:16;30670:7;30662;:16::i;:::-;30654:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30744:15;:24;30760:7;30744:24;;;;;;;;;;;;;;;;;;;;;30737:31;;30570:204;;;:::o;30133:379::-;30202:13;30218:24;30234:7;30218:15;:24::i;:::-;30202:40;;30263:5;30257:11;;:2;:11;;;;30249:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;30348:5;30332:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30357:37;30374:5;30381:12;:10;:12::i;:::-;30357:16;:37::i;:::-;30332:62;30316:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;30478:28;30487:2;30491:7;30500:5;30478:8;:28::i;:::-;30195:317;30133:379;;:::o;25874:94::-;25927:7;25950:12;;25943:19;;25874:94;:::o;31420:142::-;31528:28;31538:4;31544:2;31548:7;31528:9;:28::i;:::-;31420:142;;;:::o;26502:744::-;26611:7;26646:16;26656:5;26646:9;:16::i;:::-;26638:5;:24;26630:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;26708:22;26733:13;:11;:13::i;:::-;26708:38;;26753:19;26783:25;26833:9;26828:350;26852:14;26848:1;:18;26828:350;;;26882:31;26916:11;:14;26928:1;26916:14;;;;;;;;;;;26882:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26969:1;26943:28;;:9;:14;;;:28;;;26939:89;;27004:9;:14;;;26984:34;;26939:89;27061:5;27040:26;;:17;:26;;;27036:135;;;27098:5;27083:11;:20;27079:59;;;27125:1;27118:8;;;;;;;;;27079:59;27148:13;;;;;:::i;:::-;;;;27036:135;26873:305;26868:3;;;;;:::i;:::-;;;;26828:350;;;;27184:56;;;;;;;;;;:::i;:::-;;;;;;;;26502:744;;;;;:::o;42230:32::-;;;;:::o;44871:112::-;40828:12;:10;:12::i;:::-;40817:23;;:7;:5;:7::i;:::-;:23;;;40809:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44935:10:::1;44927:24;;:47;44952:21;44927:47;;;;;;;;;;;;;;;;;;;;;;;44919:56;;;::::0;::::1;;44871:112::o:0;31625:157::-;31737:39;31754:4;31760:2;31764:7;31737:39;;;;;;;;;;;;:16;:39::i;:::-;31625:157;;;:::o;26037:177::-;26104:7;26136:13;:11;:13::i;:::-;26128:5;:21;26120:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;26203:5;26196:12;;26037:177;;;:::o;28859:118::-;28923:7;28946:20;28958:7;28946:11;:20::i;:::-;:25;;;28939:32;;28859:118;;;:::o;42186:37::-;;;;:::o;42513:94::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42349:31::-;;;;:::o;27736:211::-;27800:7;27841:1;27824:19;;:5;:19;;;;27816:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;27913:12;:19;27926:5;27913:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27905:36;;27898:43;;27736:211;;;:::o;41248:103::-;40828:12;:10;:12::i;:::-;40817:23;;:7;:5;:7::i;:::-;:23;;;40809:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41313:30:::1;41340:1;41313:18;:30::i;:::-;41248:103::o:0;43241:711::-;43304:11;;;;;;;;;;;43296:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;43381:1;43369:9;:13;:48;;;;;43399:18;;43386:9;:31;;43369:48;43347:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;43560:18;;43547:9;43510:22;:34;43533:10;43510:34;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:68;;43488:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;43686:10;;43673:9;43657:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;43649:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;43771:10;;43758:9;43742:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;43720:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;43892:9;43854:22;:34;43877:10;43854:34;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;43912:32;43922:10;43934:9;43912;:32::i;:::-;43241:711;:::o;40597:87::-;40643:7;40670:6;;;;;;;;;;;40663:13;;40597:87;:::o;29191:98::-;29247:13;29276:7;29269:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29191:98;:::o;43960:87::-;40828:12;:10;:12::i;:::-;40817:23;;:7;:5;:7::i;:::-;:23;;;40809:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44028:11:::1;;;;;;;;;;;44027:12;44013:11;;:26;;;;;;;;;;;;;;;;;;43960:87::o:0;42748:485::-;42815:11;;;;;;;;;;;42807:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;42892:1;42880:9;:13;:39;;;;;42910:9;;42897;:22;;42880:39;42858:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;43028:10;;43015:9;42999:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;42991:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;43109:9;43097;;:21;;;;:::i;:::-;43084:9;:34;;43062:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;43193:32;43203:10;43215:9;43193;:32::i;:::-;42748:485;:::o;30838:274::-;30941:12;:10;:12::i;:::-;30929:24;;:8;:24;;;;30921:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;31038:8;30993:18;:32;31012:12;:10;:12::i;:::-;30993:32;;;;;;;;;;;;;;;:42;31026:8;30993:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;31087:8;31058:48;;31073:12;:10;:12::i;:::-;31058:48;;;31097:8;31058:48;;;;;;:::i;:::-;;;;;;;;30838:274;;:::o;44743:120::-;44794:7;44821:22;:34;44844:10;44821:34;;;;;;;;;;;;;;;;44814:41;;44743:120;:::o;42305:37::-;;;;:::o;31845:311::-;31982:28;31992:4;31998:2;32002:7;31982:9;:28::i;:::-;32033:48;32056:4;32062:2;32066:7;32075:5;32033:22;:48::i;:::-;32017:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;31845:311;;;;:::o;29352:403::-;29450:13;29491:16;29499:7;29491;:16::i;:::-;29475:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;29581:21;29605:10;:8;:10::i;:::-;29581:34;;29660:1;29642:7;29636:21;:25;:113;;;;;;;;;;;;;;;;;29697:7;29706:18;:7;:16;:18::i;:::-;29680:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29636:113;29622:127;;;29352:403;;;:::o;42269:29::-;;;;:::o;36176:43::-;;;;:::o;42434:30::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42387:40::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31175:186::-;31297:4;31320:18;:25;31339:5;31320:25;;;;;;;;;;;;;;;:35;31346:8;31320:35;;;;;;;;;;;;;;;;;;;;;;;;;31313:42;;31175:186;;;;:::o;41506:201::-;40828:12;:10;:12::i;:::-;40817:23;;:7;:5;:7::i;:::-;:23;;;40809:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41615:1:::1;41595:22;;:8;:22;;;;41587:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;41671:28;41690:8;41671:18;:28::i;:::-;41506:201:::0;:::o;42473:31::-;;;;;;;;;;;;;:::o;13121:157::-;13206:4;13245:25;13230:40;;;:11;:40;;;;13223:47;;13121:157;;;:::o;32395:105::-;32452:4;32482:12;;32472:7;:22;32465:29;;32395:105;;;:::o;23471:98::-;23524:7;23551:10;23544:17;;23471:98;:::o;35998:172::-;36122:2;36095:15;:24;36111:7;36095:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36156:7;36152:2;36136:28;;36145:5;36136:28;;;;;;;;;;;;35998:172;;;:::o;34363:1529::-;34460:35;34498:20;34510:7;34498:11;:20::i;:::-;34460:58;;34527:22;34569:13;:18;;;34553:34;;:12;:10;:12::i;:::-;:34;;;:81;;;;34622:12;:10;:12::i;:::-;34598:36;;:20;34610:7;34598:11;:20::i;:::-;:36;;;34553:81;:142;;;;34645:50;34662:13;:18;;;34682:12;:10;:12::i;:::-;34645:16;:50::i;:::-;34553:142;34527:169;;34721:17;34705:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;34853:4;34831:26;;:13;:18;;;:26;;;34815:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;34942:1;34928:16;;:2;:16;;;;34920:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34995:43;35017:4;35023:2;35027:7;35036:1;34995:21;:43::i;:::-;35095:49;35112:1;35116:7;35125:13;:18;;;35095:8;:49::i;:::-;35183:1;35153:12;:18;35166:4;35153:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35219:1;35191:12;:16;35204:2;35191:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;35250:43;;;;;;;;35265:2;35250:43;;;;;;35276:15;35250:43;;;;;35227:11;:20;35239:7;35227:20;;;;;;;;;;;:66;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35521:19;35553:1;35543:7;:11;;;;:::i;:::-;35521:33;;35606:1;35565:43;;:11;:24;35577:11;35565:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;35561:236;;;35623:20;35631:11;35623:7;:20::i;:::-;35619:171;;;35683:97;;;;;;;;35710:13;:18;;;35683:97;;;;;;35741:13;:28;;;35683:97;;;;;35656:11;:24;35668:11;35656:24;;;;;;;;;;;:124;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35619:171;35561:236;35829:7;35825:2;35810:27;;35819:4;35810:27;;;;;;;;;;;;35844:42;35865:4;35871:2;35875:7;35884:1;35844:20;:42::i;:::-;34453:1439;;;34363:1529;;;:::o;28199:606::-;28275:21;;:::i;:::-;28316:16;28324:7;28316;:16::i;:::-;28308:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;28388:26;28436:12;28425:7;:23;28421:93;;28505:1;28490:12;28480:7;:22;;;;:::i;:::-;:26;;;;:::i;:::-;28459:47;;28421:93;28527:12;28542:7;28527:22;;28522:212;28559:18;28551:4;:26;28522:212;;28596:31;28630:11;:17;28642:4;28630:17;;;;;;;;;;;28596:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28686:1;28660:28;;:9;:14;;;:28;;;28656:71;;28708:9;28701:16;;;;;;;28656:71;28587:147;28579:6;;;;;:::i;:::-;;;;28522:212;;;;28742:57;;;;;;;;;;:::i;:::-;;;;;;;;28199:606;;;;:::o;41867:191::-;41941:16;41960:6;;;;;;;;;;;41941:25;;41986:8;41977:6;;:17;;;;;;;;;;;;;;;;;;42041:8;42010:40;;42031:8;42010:40;;;;;;;;;;;;41930:128;41867:191;:::o;32506:98::-;32571:27;32581:2;32585:8;32571:27;;;;;;;;;;;;:9;:27::i;:::-;32506:98;;:::o;37709:690::-;37846:4;37863:15;:2;:13;;;:15::i;:::-;37859:535;;;37918:2;37902:36;;;37939:12;:10;:12::i;:::-;37953:4;37959:7;37968:5;37902:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37889:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38150:1;38133:6;:13;:18;38129:215;;;38166:61;;;;;;;;;;:::i;:::-;;;;;;;;38129:215;38312:6;38306:13;38297:6;38293:2;38289:15;38282:38;37889:464;38034:45;;;38024:55;;;:6;:55;;;;38017:62;;;;;37859:535;38382:4;38375:11;;37709:690;;;;;;;:::o;44623:108::-;44683:13;44716:7;44709:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44623:108;:::o;398:723::-;454:13;684:1;675:5;:10;671:53;;;702:10;;;;;;;;;;;;;;;;;;;;;671:53;734:12;749:5;734:20;;765:14;790:78;805:1;797:4;:9;790:78;;823:8;;;;;:::i;:::-;;;;854:2;846:10;;;;;:::i;:::-;;;790:78;;;878:19;910:6;900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;878:39;;928:154;944:1;935:5;:10;928:154;;972:1;962:11;;;;;:::i;:::-;;;1039:2;1031:5;:10;;;;:::i;:::-;1018:2;:24;;;;:::i;:::-;1005:39;;988:6;995;988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1068:2;1059:11;;;;;:::i;:::-;;;928:154;;;1106:6;1092:21;;;;;398:723;;;;:::o;38861:141::-;;;;;:::o;39388:140::-;;;;;:::o;32859:1272::-;32964:20;32987:12;;32964:35;;33028:1;33014:16;;:2;:16;;;;33006:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33205:21;33213:12;33205:7;:21::i;:::-;33204:22;33196:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;33287:12;33275:8;:24;;33267:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33347:61;33377:1;33381:2;33385:12;33399:8;33347:21;:61::i;:::-;33417:30;33450:12;:16;33463:2;33450:16;;;;;;;;;;;;;;;33417:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33492:119;;;;;;;;33542:8;33512:11;:19;;;:39;;;;:::i;:::-;33492:119;;;;;;33595:8;33560:11;:24;;;:44;;;;:::i;:::-;33492:119;;;;;33473:12;:16;33486:2;33473:16;;;;;;;;;;;;;;;:138;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33646:43;;;;;;;;33661:2;33646:43;;;;;;33672:15;33646:43;;;;;33618:11;:25;33630:12;33618:25;;;;;;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33698:20;33721:12;33698:35;;33747:9;33742:281;33766:8;33762:1;:12;33742:281;;;33820:12;33816:2;33795:38;;33812:1;33795:38;;;;;;;;;;;;33860:59;33891:1;33895:2;33899:12;33913:5;33860:22;:59::i;:::-;33842:150;;;;;;;;;;;;:::i;:::-;;;;;;;;;34001:14;;;;;:::i;:::-;;;;33776:3;;;;;:::i;:::-;;;;33742:281;;;;34046:12;34031;:27;;;;34065:60;34094:1;34098:2;34102:12;34116:8;34065:20;:60::i;:::-;32957:1174;;;32859:1272;;;:::o;2977:387::-;3037:4;3245:12;3312:7;3300:20;3292:28;;3355:1;3348:4;:8;3341:15;;;2977:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;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;1354:139::-;1400:5;1438:6;1425:20;1416:29;;1454:33;1481:5;1454:33;:::i;:::-;1354:139;;;;:::o;1499:329::-;1558:6;1607:2;1595:9;1586:7;1582:23;1578:32;1575:119;;;1613:79;;:::i;:::-;1575:119;1733:1;1758:53;1803:7;1794:6;1783:9;1779:22;1758:53;:::i;:::-;1748:63;;1704:117;1499:329;;;;:::o;1834:474::-;1902:6;1910;1959:2;1947:9;1938:7;1934:23;1930:32;1927:119;;;1965:79;;:::i;:::-;1927:119;2085:1;2110:53;2155:7;2146:6;2135:9;2131:22;2110:53;:::i;:::-;2100:63;;2056:117;2212:2;2238:53;2283:7;2274:6;2263:9;2259:22;2238:53;:::i;:::-;2228:63;;2183:118;1834:474;;;;;:::o;2314:619::-;2391:6;2399;2407;2456:2;2444:9;2435:7;2431:23;2427:32;2424:119;;;2462:79;;:::i;:::-;2424:119;2582:1;2607:53;2652:7;2643:6;2632:9;2628:22;2607:53;:::i;:::-;2597:63;;2553:117;2709:2;2735:53;2780:7;2771:6;2760:9;2756:22;2735:53;:::i;:::-;2725:63;;2680:118;2837:2;2863:53;2908:7;2899:6;2888:9;2884:22;2863:53;:::i;:::-;2853:63;;2808:118;2314:619;;;;;:::o;2939:943::-;3034:6;3042;3050;3058;3107:3;3095:9;3086:7;3082:23;3078:33;3075:120;;;3114:79;;:::i;:::-;3075:120;3234:1;3259:53;3304:7;3295:6;3284:9;3280:22;3259:53;:::i;:::-;3249:63;;3205:117;3361:2;3387:53;3432:7;3423:6;3412:9;3408:22;3387:53;:::i;:::-;3377:63;;3332:118;3489:2;3515:53;3560:7;3551:6;3540:9;3536:22;3515:53;:::i;:::-;3505:63;;3460:118;3645:2;3634:9;3630:18;3617:32;3676:18;3668:6;3665:30;3662:117;;;3698:79;;:::i;:::-;3662:117;3803:62;3857:7;3848:6;3837:9;3833:22;3803:62;:::i;:::-;3793:72;;3588:287;2939:943;;;;;;;:::o;3888:468::-;3953:6;3961;4010:2;3998:9;3989:7;3985:23;3981:32;3978:119;;;4016:79;;:::i;:::-;3978:119;4136:1;4161:53;4206:7;4197:6;4186:9;4182:22;4161:53;:::i;:::-;4151:63;;4107:117;4263:2;4289:50;4331:7;4322:6;4311:9;4307:22;4289:50;:::i;:::-;4279:60;;4234:115;3888:468;;;;;:::o;4362:474::-;4430:6;4438;4487:2;4475:9;4466:7;4462:23;4458:32;4455:119;;;4493:79;;:::i;:::-;4455:119;4613:1;4638:53;4683:7;4674:6;4663:9;4659:22;4638:53;:::i;:::-;4628:63;;4584:117;4740:2;4766:53;4811:7;4802:6;4791:9;4787:22;4766:53;:::i;:::-;4756:63;;4711:118;4362:474;;;;;:::o;4842:327::-;4900:6;4949:2;4937:9;4928:7;4924:23;4920:32;4917:119;;;4955:79;;:::i;:::-;4917:119;5075:1;5100:52;5144:7;5135:6;5124:9;5120:22;5100:52;:::i;:::-;5090:62;;5046:116;4842:327;;;;:::o;5175:349::-;5244:6;5293:2;5281:9;5272:7;5268:23;5264:32;5261:119;;;5299:79;;:::i;:::-;5261:119;5419:1;5444:63;5499:7;5490:6;5479:9;5475:22;5444:63;:::i;:::-;5434:73;;5390:127;5175:349;;;;:::o;5530:329::-;5589:6;5638:2;5626:9;5617:7;5613:23;5609:32;5606:119;;;5644:79;;:::i;:::-;5606:119;5764:1;5789:53;5834:7;5825:6;5814:9;5810:22;5789:53;:::i;:::-;5779:63;;5735:117;5530:329;;;;:::o;5865:118::-;5952:24;5970:5;5952:24;:::i;:::-;5947:3;5940:37;5865:118;;:::o;5989:109::-;6070:21;6085:5;6070:21;:::i;:::-;6065:3;6058:34;5989:109;;:::o;6104:360::-;6190:3;6218:38;6250:5;6218:38;:::i;:::-;6272:70;6335:6;6330:3;6272:70;:::i;:::-;6265:77;;6351:52;6396:6;6391:3;6384:4;6377:5;6373:16;6351:52;:::i;:::-;6428:29;6450:6;6428:29;:::i;:::-;6423:3;6419:39;6412:46;;6194:270;6104:360;;;;:::o;6470:364::-;6558:3;6586:39;6619:5;6586:39;:::i;:::-;6641:71;6705:6;6700:3;6641:71;:::i;:::-;6634:78;;6721:52;6766:6;6761:3;6754:4;6747:5;6743:16;6721:52;:::i;:::-;6798:29;6820:6;6798:29;:::i;:::-;6793:3;6789:39;6782:46;;6562:272;6470:364;;;;:::o;6840:377::-;6946:3;6974:39;7007:5;6974:39;:::i;:::-;7029:89;7111:6;7106:3;7029:89;:::i;:::-;7022:96;;7127:52;7172:6;7167:3;7160:4;7153:5;7149:16;7127:52;:::i;:::-;7204:6;7199:3;7195:16;7188:23;;6950:267;6840:377;;;;:::o;7223:366::-;7365:3;7386:67;7450:2;7445:3;7386:67;:::i;:::-;7379:74;;7462:93;7551:3;7462:93;:::i;:::-;7580:2;7575:3;7571:12;7564:19;;7223:366;;;:::o;7595:365::-;7737:3;7758:66;7822:1;7817:3;7758:66;:::i;:::-;7751:73;;7833:93;7922:3;7833:93;:::i;:::-;7951:2;7946:3;7942:12;7935:19;;7595:365;;;:::o;7966:366::-;8108:3;8129:67;8193:2;8188:3;8129:67;:::i;:::-;8122:74;;8205:93;8294:3;8205:93;:::i;:::-;8323:2;8318:3;8314:12;8307:19;;7966:366;;;:::o;8338:::-;8480:3;8501:67;8565:2;8560:3;8501:67;:::i;:::-;8494:74;;8577:93;8666:3;8577:93;:::i;:::-;8695:2;8690:3;8686:12;8679:19;;8338:366;;;:::o;8710:::-;8852:3;8873:67;8937:2;8932:3;8873:67;:::i;:::-;8866:74;;8949:93;9038:3;8949:93;:::i;:::-;9067:2;9062:3;9058:12;9051:19;;8710:366;;;:::o;9082:::-;9224:3;9245:67;9309:2;9304:3;9245:67;:::i;:::-;9238:74;;9321:93;9410:3;9321:93;:::i;:::-;9439:2;9434:3;9430:12;9423:19;;9082:366;;;:::o;9454:::-;9596:3;9617:67;9681:2;9676:3;9617:67;:::i;:::-;9610:74;;9693:93;9782:3;9693:93;:::i;:::-;9811:2;9806:3;9802:12;9795:19;;9454:366;;;:::o;9826:::-;9968:3;9989:67;10053:2;10048:3;9989:67;:::i;:::-;9982:74;;10065:93;10154:3;10065:93;:::i;:::-;10183:2;10178:3;10174:12;10167:19;;9826:366;;;:::o;10198:::-;10340:3;10361:67;10425:2;10420:3;10361:67;:::i;:::-;10354:74;;10437:93;10526:3;10437:93;:::i;:::-;10555:2;10550:3;10546:12;10539:19;;10198:366;;;:::o;10570:::-;10712:3;10733:67;10797:2;10792:3;10733:67;:::i;:::-;10726:74;;10809:93;10898:3;10809:93;:::i;:::-;10927:2;10922:3;10918:12;10911:19;;10570:366;;;:::o;10942:::-;11084:3;11105:67;11169:2;11164:3;11105:67;:::i;:::-;11098:74;;11181:93;11270:3;11181:93;:::i;:::-;11299:2;11294:3;11290:12;11283:19;;10942:366;;;:::o;11314:::-;11456:3;11477:67;11541:2;11536:3;11477:67;:::i;:::-;11470:74;;11553:93;11642:3;11553:93;:::i;:::-;11671:2;11666:3;11662:12;11655:19;;11314:366;;;:::o;11686:::-;11828:3;11849:67;11913:2;11908:3;11849:67;:::i;:::-;11842:74;;11925:93;12014:3;11925:93;:::i;:::-;12043:2;12038:3;12034:12;12027:19;;11686:366;;;:::o;12058:::-;12200:3;12221:67;12285:2;12280:3;12221:67;:::i;:::-;12214:74;;12297:93;12386:3;12297:93;:::i;:::-;12415:2;12410:3;12406:12;12399:19;;12058:366;;;:::o;12430:400::-;12590:3;12611:84;12693:1;12688:3;12611:84;:::i;:::-;12604:91;;12704:93;12793:3;12704:93;:::i;:::-;12822:1;12817:3;12813:11;12806:18;;12430:400;;;:::o;12836:366::-;12978:3;12999:67;13063:2;13058:3;12999:67;:::i;:::-;12992:74;;13075:93;13164:3;13075:93;:::i;:::-;13193:2;13188:3;13184:12;13177:19;;12836:366;;;:::o;13208:::-;13350:3;13371:67;13435:2;13430:3;13371:67;:::i;:::-;13364:74;;13447:93;13536:3;13447:93;:::i;:::-;13565:2;13560:3;13556:12;13549:19;;13208:366;;;:::o;13580:::-;13722:3;13743:67;13807:2;13802:3;13743:67;:::i;:::-;13736:74;;13819:93;13908:3;13819:93;:::i;:::-;13937:2;13932:3;13928:12;13921:19;;13580:366;;;:::o;13952:::-;14094:3;14115:67;14179:2;14174:3;14115:67;:::i;:::-;14108:74;;14191:93;14280:3;14191:93;:::i;:::-;14309:2;14304:3;14300:12;14293:19;;13952:366;;;:::o;14324:::-;14466:3;14487:67;14551:2;14546:3;14487:67;:::i;:::-;14480:74;;14563:93;14652:3;14563:93;:::i;:::-;14681:2;14676:3;14672:12;14665:19;;14324:366;;;:::o;14696:::-;14838:3;14859:67;14923:2;14918:3;14859:67;:::i;:::-;14852:74;;14935:93;15024:3;14935:93;:::i;:::-;15053:2;15048:3;15044:12;15037:19;;14696:366;;;:::o;15068:::-;15210:3;15231:67;15295:2;15290:3;15231:67;:::i;:::-;15224:74;;15307:93;15396:3;15307:93;:::i;:::-;15425:2;15420:3;15416:12;15409:19;;15068:366;;;:::o;15440:::-;15582:3;15603:67;15667:2;15662:3;15603:67;:::i;:::-;15596:74;;15679:93;15768:3;15679:93;:::i;:::-;15797:2;15792:3;15788:12;15781:19;;15440:366;;;:::o;15812:::-;15954:3;15975:67;16039:2;16034:3;15975:67;:::i;:::-;15968:74;;16051:93;16140:3;16051:93;:::i;:::-;16169:2;16164:3;16160:12;16153:19;;15812:366;;;:::o;16184:::-;16326:3;16347:67;16411:2;16406:3;16347:67;:::i;:::-;16340:74;;16423:93;16512:3;16423:93;:::i;:::-;16541:2;16536:3;16532:12;16525:19;;16184:366;;;:::o;16556:::-;16698:3;16719:67;16783:2;16778:3;16719:67;:::i;:::-;16712:74;;16795:93;16884:3;16795:93;:::i;:::-;16913:2;16908:3;16904:12;16897:19;;16556:366;;;:::o;16928:::-;17070:3;17091:67;17155:2;17150:3;17091:67;:::i;:::-;17084:74;;17167:93;17256:3;17167:93;:::i;:::-;17285:2;17280:3;17276:12;17269:19;;16928:366;;;:::o;17300:::-;17442:3;17463:67;17527:2;17522:3;17463:67;:::i;:::-;17456:74;;17539:93;17628:3;17539:93;:::i;:::-;17657:2;17652:3;17648:12;17641:19;;17300:366;;;:::o;17672:118::-;17759:24;17777:5;17759:24;:::i;:::-;17754:3;17747:37;17672:118;;:::o;17796:701::-;18077:3;18099:95;18190:3;18181:6;18099:95;:::i;:::-;18092:102;;18211:95;18302:3;18293:6;18211:95;:::i;:::-;18204:102;;18323:148;18467:3;18323:148;:::i;:::-;18316:155;;18488:3;18481:10;;17796:701;;;;;:::o;18503:222::-;18596:4;18634:2;18623:9;18619:18;18611:26;;18647:71;18715:1;18704:9;18700:17;18691:6;18647:71;:::i;:::-;18503:222;;;;:::o;18731:640::-;18926:4;18964:3;18953:9;18949:19;18941:27;;18978:71;19046:1;19035:9;19031:17;19022:6;18978:71;:::i;:::-;19059:72;19127:2;19116:9;19112:18;19103:6;19059:72;:::i;:::-;19141;19209:2;19198:9;19194:18;19185:6;19141:72;:::i;:::-;19260:9;19254:4;19250:20;19245:2;19234:9;19230:18;19223:48;19288:76;19359:4;19350:6;19288:76;:::i;:::-;19280:84;;18731:640;;;;;;;:::o;19377:210::-;19464:4;19502:2;19491:9;19487:18;19479:26;;19515:65;19577:1;19566:9;19562:17;19553:6;19515:65;:::i;:::-;19377:210;;;;:::o;19593:313::-;19706:4;19744:2;19733:9;19729:18;19721:26;;19793:9;19787:4;19783:20;19779:1;19768:9;19764:17;19757:47;19821:78;19894:4;19885:6;19821:78;:::i;:::-;19813:86;;19593:313;;;;:::o;19912:419::-;20078:4;20116:2;20105:9;20101:18;20093:26;;20165:9;20159:4;20155:20;20151:1;20140:9;20136:17;20129:47;20193:131;20319:4;20193:131;:::i;:::-;20185:139;;19912:419;;;:::o;20337:::-;20503:4;20541:2;20530:9;20526:18;20518:26;;20590:9;20584:4;20580:20;20576:1;20565:9;20561:17;20554:47;20618:131;20744:4;20618:131;:::i;:::-;20610:139;;20337:419;;;:::o;20762:::-;20928:4;20966:2;20955:9;20951:18;20943:26;;21015:9;21009:4;21005:20;21001:1;20990:9;20986:17;20979:47;21043:131;21169:4;21043:131;:::i;:::-;21035:139;;20762:419;;;:::o;21187:::-;21353:4;21391:2;21380:9;21376:18;21368:26;;21440:9;21434:4;21430:20;21426:1;21415:9;21411:17;21404:47;21468:131;21594:4;21468:131;:::i;:::-;21460:139;;21187:419;;;:::o;21612:::-;21778:4;21816:2;21805:9;21801:18;21793:26;;21865:9;21859:4;21855:20;21851:1;21840:9;21836:17;21829:47;21893:131;22019:4;21893:131;:::i;:::-;21885:139;;21612:419;;;:::o;22037:::-;22203:4;22241:2;22230:9;22226:18;22218:26;;22290:9;22284:4;22280:20;22276:1;22265:9;22261:17;22254:47;22318:131;22444:4;22318:131;:::i;:::-;22310:139;;22037:419;;;:::o;22462:::-;22628:4;22666:2;22655:9;22651:18;22643:26;;22715:9;22709:4;22705:20;22701:1;22690:9;22686:17;22679:47;22743:131;22869:4;22743:131;:::i;:::-;22735:139;;22462:419;;;:::o;22887:::-;23053:4;23091:2;23080:9;23076:18;23068:26;;23140:9;23134:4;23130:20;23126:1;23115:9;23111:17;23104:47;23168:131;23294:4;23168:131;:::i;:::-;23160:139;;22887:419;;;:::o;23312:::-;23478:4;23516:2;23505:9;23501:18;23493:26;;23565:9;23559:4;23555:20;23551:1;23540:9;23536:17;23529:47;23593:131;23719:4;23593:131;:::i;:::-;23585:139;;23312:419;;;:::o;23737:::-;23903:4;23941:2;23930:9;23926:18;23918:26;;23990:9;23984:4;23980:20;23976:1;23965:9;23961:17;23954:47;24018:131;24144:4;24018:131;:::i;:::-;24010:139;;23737:419;;;:::o;24162:::-;24328:4;24366:2;24355:9;24351:18;24343:26;;24415:9;24409:4;24405:20;24401:1;24390:9;24386:17;24379:47;24443:131;24569:4;24443:131;:::i;:::-;24435:139;;24162:419;;;:::o;24587:::-;24753:4;24791:2;24780:9;24776:18;24768:26;;24840:9;24834:4;24830:20;24826:1;24815:9;24811:17;24804:47;24868:131;24994:4;24868:131;:::i;:::-;24860:139;;24587:419;;;:::o;25012:::-;25178:4;25216:2;25205:9;25201:18;25193:26;;25265:9;25259:4;25255:20;25251:1;25240:9;25236:17;25229:47;25293:131;25419:4;25293:131;:::i;:::-;25285:139;;25012:419;;;:::o;25437:::-;25603:4;25641:2;25630:9;25626:18;25618:26;;25690:9;25684:4;25680:20;25676:1;25665:9;25661:17;25654:47;25718:131;25844:4;25718:131;:::i;:::-;25710:139;;25437:419;;;:::o;25862:::-;26028:4;26066:2;26055:9;26051:18;26043:26;;26115:9;26109:4;26105:20;26101:1;26090:9;26086:17;26079:47;26143:131;26269:4;26143:131;:::i;:::-;26135:139;;25862:419;;;:::o;26287:::-;26453:4;26491:2;26480:9;26476:18;26468:26;;26540:9;26534:4;26530:20;26526:1;26515:9;26511:17;26504:47;26568:131;26694:4;26568:131;:::i;:::-;26560:139;;26287:419;;;:::o;26712:::-;26878:4;26916:2;26905:9;26901:18;26893:26;;26965:9;26959:4;26955:20;26951:1;26940:9;26936:17;26929:47;26993:131;27119:4;26993:131;:::i;:::-;26985:139;;26712:419;;;:::o;27137:::-;27303:4;27341:2;27330:9;27326:18;27318:26;;27390:9;27384:4;27380:20;27376:1;27365:9;27361:17;27354:47;27418:131;27544:4;27418:131;:::i;:::-;27410:139;;27137:419;;;:::o;27562:::-;27728:4;27766:2;27755:9;27751:18;27743:26;;27815:9;27809:4;27805:20;27801:1;27790:9;27786:17;27779:47;27843:131;27969:4;27843:131;:::i;:::-;27835:139;;27562:419;;;:::o;27987:::-;28153:4;28191:2;28180:9;28176:18;28168:26;;28240:9;28234:4;28230:20;28226:1;28215:9;28211:17;28204:47;28268:131;28394:4;28268:131;:::i;:::-;28260:139;;27987:419;;;:::o;28412:::-;28578:4;28616:2;28605:9;28601:18;28593:26;;28665:9;28659:4;28655:20;28651:1;28640:9;28636:17;28629:47;28693:131;28819:4;28693:131;:::i;:::-;28685:139;;28412:419;;;:::o;28837:::-;29003:4;29041:2;29030:9;29026:18;29018:26;;29090:9;29084:4;29080:20;29076:1;29065:9;29061:17;29054:47;29118:131;29244:4;29118:131;:::i;:::-;29110:139;;28837:419;;;:::o;29262:::-;29428:4;29466:2;29455:9;29451:18;29443:26;;29515:9;29509:4;29505:20;29501:1;29490:9;29486:17;29479:47;29543:131;29669:4;29543:131;:::i;:::-;29535:139;;29262:419;;;:::o;29687:::-;29853:4;29891:2;29880:9;29876:18;29868:26;;29940:9;29934:4;29930:20;29926:1;29915:9;29911:17;29904:47;29968:131;30094:4;29968:131;:::i;:::-;29960:139;;29687:419;;;:::o;30112:::-;30278:4;30316:2;30305:9;30301:18;30293:26;;30365:9;30359:4;30355:20;30351:1;30340:9;30336:17;30329:47;30393:131;30519:4;30393:131;:::i;:::-;30385:139;;30112:419;;;:::o;30537:::-;30703:4;30741:2;30730:9;30726:18;30718:26;;30790:9;30784:4;30780:20;30776:1;30765:9;30761:17;30754:47;30818:131;30944:4;30818:131;:::i;:::-;30810:139;;30537:419;;;:::o;30962:::-;31128:4;31166:2;31155:9;31151:18;31143:26;;31215:9;31209:4;31205:20;31201:1;31190:9;31186:17;31179:47;31243:131;31369:4;31243:131;:::i;:::-;31235:139;;30962:419;;;:::o;31387:222::-;31480:4;31518:2;31507:9;31503:18;31495:26;;31531:71;31599:1;31588:9;31584:17;31575:6;31531:71;:::i;:::-;31387:222;;;;:::o;31615:129::-;31649:6;31676:20;;:::i;:::-;31666:30;;31705:33;31733:4;31725:6;31705:33;:::i;:::-;31615:129;;;:::o;31750:75::-;31783:6;31816:2;31810:9;31800:19;;31750:75;:::o;31831:307::-;31892:4;31982:18;31974:6;31971:30;31968:56;;;32004:18;;:::i;:::-;31968:56;32042:29;32064:6;32042:29;:::i;:::-;32034:37;;32126:4;32120;32116:15;32108:23;;31831:307;;;:::o;32144:98::-;32195:6;32229:5;32223:12;32213:22;;32144:98;;;:::o;32248:99::-;32300:6;32334:5;32328:12;32318:22;;32248:99;;;:::o;32353:168::-;32436:11;32470:6;32465:3;32458:19;32510:4;32505:3;32501:14;32486:29;;32353:168;;;;:::o;32527:169::-;32611:11;32645:6;32640:3;32633:19;32685:4;32680:3;32676:14;32661:29;;32527:169;;;;:::o;32702:148::-;32804:11;32841:3;32826:18;;32702:148;;;;:::o;32856:273::-;32896:3;32915:20;32933:1;32915:20;:::i;:::-;32910:25;;32949:20;32967:1;32949:20;:::i;:::-;32944:25;;33071:1;33035:34;33031:42;33028:1;33025:49;33022:75;;;33077:18;;:::i;:::-;33022:75;33121:1;33118;33114:9;33107:16;;32856:273;;;;:::o;33135:305::-;33175:3;33194:20;33212:1;33194:20;:::i;:::-;33189:25;;33228:20;33246:1;33228:20;:::i;:::-;33223:25;;33382:1;33314:66;33310:74;33307:1;33304:81;33301:107;;;33388:18;;:::i;:::-;33301:107;33432:1;33429;33425:9;33418:16;;33135:305;;;;:::o;33446:185::-;33486:1;33503:20;33521:1;33503:20;:::i;:::-;33498:25;;33537:20;33555:1;33537:20;:::i;:::-;33532:25;;33576:1;33566:35;;33581:18;;:::i;:::-;33566:35;33623:1;33620;33616:9;33611:14;;33446:185;;;;:::o;33637:348::-;33677:7;33700:20;33718:1;33700:20;:::i;:::-;33695:25;;33734:20;33752:1;33734:20;:::i;:::-;33729:25;;33922:1;33854:66;33850:74;33847:1;33844:81;33839:1;33832:9;33825:17;33821:105;33818:131;;;33929:18;;:::i;:::-;33818:131;33977:1;33974;33970:9;33959:20;;33637:348;;;;:::o;33991:191::-;34031:4;34051:20;34069:1;34051:20;:::i;:::-;34046:25;;34085:20;34103:1;34085:20;:::i;:::-;34080:25;;34124:1;34121;34118:8;34115:34;;;34129:18;;:::i;:::-;34115:34;34174:1;34171;34167:9;34159:17;;33991:191;;;;:::o;34188:::-;34228:4;34248:20;34266:1;34248:20;:::i;:::-;34243:25;;34282:20;34300:1;34282:20;:::i;:::-;34277:25;;34321:1;34318;34315:8;34312:34;;;34326:18;;:::i;:::-;34312:34;34371:1;34368;34364:9;34356:17;;34188:191;;;;:::o;34385:96::-;34422:7;34451:24;34469:5;34451:24;:::i;:::-;34440:35;;34385:96;;;:::o;34487:90::-;34521:7;34564:5;34557:13;34550:21;34539:32;;34487:90;;;:::o;34583:149::-;34619:7;34659:66;34652:5;34648:78;34637:89;;34583:149;;;:::o;34738:118::-;34775:7;34815:34;34808:5;34804:46;34793:57;;34738:118;;;:::o;34862:126::-;34899:7;34939:42;34932:5;34928:54;34917:65;;34862:126;;;:::o;34994:77::-;35031:7;35060:5;35049:16;;34994:77;;;:::o;35077:154::-;35161:6;35156:3;35151;35138:30;35223:1;35214:6;35209:3;35205:16;35198:27;35077:154;;;:::o;35237:307::-;35305:1;35315:113;35329:6;35326:1;35323:13;35315:113;;;35414:1;35409:3;35405:11;35399:18;35395:1;35390:3;35386:11;35379:39;35351:2;35348:1;35344:10;35339:15;;35315:113;;;35446:6;35443:1;35440:13;35437:101;;;35526:1;35517:6;35512:3;35508:16;35501:27;35437:101;35286:258;35237:307;;;:::o;35550:171::-;35589:3;35612:24;35630:5;35612:24;:::i;:::-;35603:33;;35658:4;35651:5;35648:15;35645:41;;;35666:18;;:::i;:::-;35645:41;35713:1;35706:5;35702:13;35695:20;;35550:171;;;:::o;35727:320::-;35771:6;35808:1;35802:4;35798:12;35788:22;;35855:1;35849:4;35845:12;35876:18;35866:81;;35932:4;35924:6;35920:17;35910:27;;35866:81;35994:2;35986:6;35983:14;35963:18;35960:38;35957:84;;;36013:18;;:::i;:::-;35957:84;35778:269;35727:320;;;:::o;36053:281::-;36136:27;36158:4;36136:27;:::i;:::-;36128:6;36124:40;36266:6;36254:10;36251:22;36230:18;36218:10;36215:34;36212:62;36209:88;;;36277:18;;:::i;:::-;36209:88;36317:10;36313:2;36306:22;36096:238;36053:281;;:::o;36340:233::-;36379:3;36402:24;36420:5;36402:24;:::i;:::-;36393:33;;36448:66;36441:5;36438:77;36435:103;;;36518:18;;:::i;:::-;36435:103;36565:1;36558:5;36554:13;36547:20;;36340:233;;;:::o;36579:176::-;36611:1;36628:20;36646:1;36628:20;:::i;:::-;36623:25;;36662:20;36680:1;36662:20;:::i;:::-;36657:25;;36701:1;36691:35;;36706:18;;:::i;:::-;36691:35;36747:1;36744;36740:9;36735:14;;36579:176;;;;:::o;36761:180::-;36809:77;36806:1;36799:88;36906:4;36903:1;36896:15;36930:4;36927:1;36920:15;36947:180;36995:77;36992:1;36985:88;37092:4;37089:1;37082:15;37116:4;37113:1;37106:15;37133:180;37181:77;37178:1;37171:88;37278:4;37275:1;37268:15;37302:4;37299:1;37292:15;37319:180;37367:77;37364:1;37357:88;37464:4;37461:1;37454:15;37488:4;37485:1;37478:15;37505:180;37553:77;37550:1;37543:88;37650:4;37647:1;37640:15;37674:4;37671:1;37664:15;37691:117;37800:1;37797;37790:12;37814:117;37923:1;37920;37913:12;37937:117;38046:1;38043;38036:12;38060:117;38169:1;38166;38159:12;38183:102;38224:6;38275:2;38271:7;38266:2;38259:5;38255:14;38251:28;38241:38;;38183:102;;;:::o;38291:221::-;38431:34;38427:1;38419:6;38415:14;38408:58;38500:4;38495:2;38487:6;38483:15;38476:29;38291:221;:::o;38518:158::-;38658:10;38654:1;38646:6;38642:14;38635:34;38518:158;:::o;38682:225::-;38822:34;38818:1;38810:6;38806:14;38799:58;38891:8;38886:2;38878:6;38874:15;38867:33;38682:225;:::o;38913:229::-;39053:34;39049:1;39041:6;39037:14;39030:58;39122:12;39117:2;39109:6;39105:15;39098:37;38913:229;:::o;39148:182::-;39288:34;39284:1;39276:6;39272:14;39265:58;39148:182;:::o;39336:222::-;39476:34;39472:1;39464:6;39460:14;39453:58;39545:5;39540:2;39532:6;39528:15;39521:30;39336:222;:::o;39564:224::-;39704:34;39700:1;39692:6;39688:14;39681:58;39773:7;39768:2;39760:6;39756:15;39749:32;39564:224;:::o;39794:182::-;39934:34;39930:1;39922:6;39918:14;39911:58;39794:182;:::o;39982:221::-;40122:34;40118:1;40110:6;40106:14;40099:58;40191:4;40186:2;40178:6;40174:15;40167:29;39982:221;:::o;40209:166::-;40349:18;40345:1;40337:6;40333:14;40326:42;40209:166;:::o;40381:244::-;40521:34;40517:1;40509:6;40505:14;40498:58;40590:27;40585:2;40577:6;40573:15;40566:52;40381:244;:::o;40631:182::-;40771:34;40767:1;40759:6;40755:14;40748:58;40631:182;:::o;40819:230::-;40959:34;40955:1;40947:6;40943:14;40936:58;41028:13;41023:2;41015:6;41011:15;41004:38;40819:230;:::o;41055:225::-;41195:34;41191:1;41183:6;41179:14;41172:58;41264:8;41259:2;41251:6;41247:15;41240:33;41055:225;:::o;41286:155::-;41426:7;41422:1;41414:6;41410:14;41403:31;41286:155;:::o;41447:182::-;41587:34;41583:1;41575:6;41571:14;41564:58;41447:182;:::o;41635:234::-;41775:34;41771:1;41763:6;41759:14;41752:58;41844:17;41839:2;41831:6;41827:15;41820:42;41635:234;:::o;41875:176::-;42015:28;42011:1;42003:6;41999:14;41992:52;41875:176;:::o;42057:237::-;42197:34;42193:1;42185:6;42181:14;42174:58;42266:20;42261:2;42253:6;42249:15;42242:45;42057:237;:::o;42300:220::-;42440:34;42436:1;42428:6;42424:14;42417:58;42509:3;42504:2;42496:6;42492:15;42485:28;42300:220;:::o;42526:221::-;42666:34;42662:1;42654:6;42650:14;42643:58;42735:4;42730:2;42722:6;42718:15;42711:29;42526:221;:::o;42753:238::-;42893:34;42889:1;42881:6;42877:14;42870:58;42962:21;42957:2;42949:6;42945:15;42938:46;42753:238;:::o;42997:179::-;43137:31;43133:1;43125:6;43121:14;43114:55;42997:179;:::o;43182:220::-;43322:34;43318:1;43310:6;43306:14;43299:58;43391:3;43386:2;43378:6;43374:15;43367:28;43182:220;:::o;43408:233::-;43548:34;43544:1;43536:6;43532:14;43525:58;43617:16;43612:2;43604:6;43600:15;43593:41;43408:233;:::o;43647:234::-;43787:34;43783:1;43775:6;43771:14;43764:58;43856:17;43851:2;43843:6;43839:15;43832:42;43647:234;:::o;43887:232::-;44027:34;44023:1;44015:6;44011:14;44004:58;44096:15;44091:2;44083:6;44079:15;44072:40;43887:232;:::o;44125:221::-;44265:34;44261:1;44253:6;44249:14;44242:58;44334:4;44329:2;44321:6;44317:15;44310:29;44125:221;:::o;44352:122::-;44425:24;44443:5;44425:24;:::i;:::-;44418:5;44415:35;44405:63;;44464:1;44461;44454:12;44405:63;44352:122;:::o;44480:116::-;44550:21;44565:5;44550:21;:::i;:::-;44543:5;44540:32;44530:60;;44586:1;44583;44576:12;44530:60;44480:116;:::o;44602:120::-;44674:23;44691:5;44674:23;:::i;:::-;44667:5;44664:34;44654:62;;44712:1;44709;44702:12;44654:62;44602:120;:::o;44728:122::-;44801:24;44819:5;44801:24;:::i;:::-;44794:5;44791:35;44781:63;;44840:1;44837;44830:12;44781:63;44728:122;:::o

Swarm Source

ipfs://0b51b114d45b04dfb7031fc435bb3dd2b303ed1fa34aed7ce8720e84b455b60b
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.