ETH Price: $3,314.87 (-4.48%)

Token

Caribbean Pass (CABP)
 

Overview

Max Total Supply

0 CABP

Holders

415

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
velvetbastard.eth
0x35d73a2a6cb9e82ac020437add6b50611964399a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Genesis Collection By Racs-O Total supply: 4200 NFTs No Roadmap. No Discord. If you love clear waters and good vibes....

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CaribbeanPass

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-31
*/

/**
 *Submitted for verification at Etherscan.io on 2022-03-30
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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);
    }
}
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
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);
}
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}
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);
    }
}
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

contract CaribbeanPass is ERC1155, Ownable, ERC1155Burnable, ERC1155Supply {

    mapping(uint256 => uint256) public price;
    mapping(uint256 => uint256) public supply;
    mapping(uint256 => uint256) public burnQ;
    mapping(address => mapping(uint256 => uint256)) public numberMinted;    

    uint256 public burned =0; 

    string public name;
    string public symbol;

    bool public status = true;

    using Strings for uint256;

    address public apeAddress = 0x4d224452801ACEd8B2F0aebE155379bb5D594381;

    string baseuri = "ipfs://QmYqnTaKzUKLgyHyeeV9T6pddFhDnNzUhiWBNkr5QM2kpJ/";

    constructor() ERC1155("ipfs://QmYqnTaKzUKLgyHyeeV9T6pddFhDnNzUhiWBNkr5QM2kpJ/{id}.json") {
        name = "Caribbean Pass";
        symbol = "CABP";

        price[1] = 5 ether;
        price[2] = 25 ether;
        price[3] = 50 ether;
        price[4] = 75 ether;

        supply[1] = 2501;
        supply[2] = 1001;
        supply[3] = 501;
        supply[4] = 201;

        burnQ[2] = 5;
        burnQ[3] = 10;
        burnQ[4] = 15;
    }
    function setPrice(uint256 id, uint256 p) public onlyOwner{
        price[id] = p;
    }

    function setStatus() public onlyOwner{
        status = !status;
    }

    function setBurnQ(uint256 id, uint256 b) public onlyOwner{
        burnQ[id] = b;
    }

    function mint(address account, uint256 id, uint256 amount) public onlyOwner {
        _mint(account, id, amount, "");
    }

    function mintBronzeA(uint256 q) public {
        require(status, "Minting is paused");
        require( totalSupply(1) < 1001 + burned, "Free Bronze Sold Out" );
        require( q > 0 && q < 3, "Invalid Quantity Given" );
        require( numberMinted[msg.sender][1] + q < 3, "Cannot mint more than 2 free bronze" );

        numberMinted[msg.sender][1] += q;
        _mint(msg.sender, 1, q, "");
    }

    function mintBronze(uint256 q) public {
        require(status, "Minting is paused");
        require( totalSupply(1) < supply[1] + burned - 500, "Bronze Sold Out" );
        require( q > 0 && q < 8, "Invalid Quantity Given" );
        require( numberMinted[msg.sender][1] + q < 8, "Cannot mint more than 5 bronze" );
        IERC20(apeAddress).transferFrom(msg.sender, 0x7F65D1e07E31c9D9e0C9d9F5Fa00FcA317c3B064, price[1]*q);

        numberMinted[msg.sender][1] += q;
        _mint(msg.sender, 1, q, "");
    }
    function getMinted (uint256 id) public view returns (uint256){
        return numberMinted[msg.sender][id];
    }
    function mint(uint256 id, uint256 q) public {
        require(status, "Minting is paused");
        require( id > 1 && id < 5, "Invalid Id");
        require( q < 11, "Max 10 per Txn");
        require( totalSupply(id)+q < supply[id], "Membership Sold Out" );

        _mint(msg.sender, id, q, "");
        numberMinted[msg.sender][id]++;
        IERC20(apeAddress).transferFrom(msg.sender, 0x7F65D1e07E31c9D9e0C9d9F5Fa00FcA317c3B064, price[id]*q);
    }

    function burnMint(uint256 id, uint256 q) public {
        require(status, "Minting is paused");
        require( q < 11, "Max 10 per Txn");
        require( id > 1 && id < 5, "Invalid Id");
        require( totalSupply(id)+q < supply[id], "Sold Out" );

        _burn(msg.sender, 1, burnQ[id]*q);
        _mint(msg.sender, id, q, "");

        burned+= (burnQ[id]*q);
    }

    function setURI(string memory newuri) public onlyOwner {
        baseuri = newuri;
    }

    function uri(uint256 tokenId) override public view returns (string memory) { 
        return string(
            abi.encodePacked(baseuri, Strings.toString(tokenId), ".json")
        );
    }

    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data) internal override(ERC1155, ERC1155Supply){
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"apeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"q","type":"uint256"}],"name":"burnMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"burnQ","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"getMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"q","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"mintBronze","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"q","type":"uint256"}],"name":"mintBronzeA","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"numberMinted","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":"","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","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":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"name":"setBurnQ","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"p","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"supply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

6000600955600c80546001600160a81b031916744d224452801aced8b2f0aebe155379bb5d5943810117905560e06040526036608081815290620030c260a03980516200005591600d9160209091019062000324565b503480156200006357600080fd5b506040518060600160405280603f8152602001620030f8603f91396200008981620002b9565b506200009533620002d2565b60408051808201909152600e8082526d43617269626265616e205061737360901b6020909201918252620000cc91600a9162000324565b50604080518082019091526004808252630434142560e41b6020909201918252620000fa91600b9162000324565b50674563918244f400007f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b5568015af1d78b58c400007f89832631fb3c3307a103ba2c84ab569c64d6182a18893dcd163f0f1c2090733a556802b5e3af16b18800007fa9bc9a3a348c357ba16b37005d7e6b3236198c0e939f4af8c5f19b8deeb8ebc055680410d586a20a4c00007f3eec716f11ba9e820c81ca75eb978ffb45831ef8b7a53e5e422c26008e1ca6d5556109c57f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31556103e97f8819ef417987f8ae7a81f42cdfb18815282fe989326fbff903d13cf0e03ace29556101f57f75f96ab15d697e93042dc45b5c896c4b27e89bb6eaf39475c5c371cb2513f7d25560c97fc5069e24aaadb2addc3e52e868fcf3f4f8acf5a87e24300992fd4540c2a87eed55600760205260057fb7c774451310d1be4108bc180d1b52823cb0ee0274a6c0081bcaf94f115fb96d55600a7f3be6fd20d5acfde5b873b48692cd31f4d3c7e8ee8a813af4696af8859e5ca6c6556004600052600f7fb805995a7ec585a251200611a61d179cfd7fb105e1ab17dc415a7336783786f75562000407565b8051620002ce90600290602084019062000324565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200033290620003ca565b90600052602060002090601f016020900481019282620003565760008555620003a1565b82601f106200037157805160ff1916838001178555620003a1565b82800160010185558215620003a1579182015b82811115620003a157825182559160200191906001019062000384565b50620003af929150620003b3565b5090565b5b80821115620003af5760008155600101620003b4565b600181811c90821680620003df57607f821691505b602082108114156200040157634e487b7160e01b600052602260045260246000fd5b50919050565b612cab80620004176000396000f3fe608060405234801561001057600080fd5b50600436106102055760003560e01c8063715018a61161011a578063b2c2eb7d116100ad578063ebf8b9a81161007c578063ebf8b9a8146104eb578063f242432a146104fe578063f2fde38b14610511578063f5298aca14610524578063f7d975771461053757600080fd5b8063b2c2eb7d14610474578063bd85b03914610487578063c0336629146104a7578063e985e9c5146104af57600080fd5b80638db1e5c8116100e95780638db1e5c81461041b57806395d89b411461042e578063a0f8ae4714610436578063a22cb4651461046157600080fd5b8063715018a6146103d957806373f42561146103e157806380034f57146103ea5780638da5cb5b1461040a57600080fd5b8063200d2ed21161019d5780634e1273f41161016c5780634e1273f4146103415780634f558e791461036157806360f61cec146103835780636638d926146103b35780636b20c454146103c657600080fd5b8063200d2ed2146102e157806326a49e37146102ee5780632eb2c2d61461030e578063354030231461032157600080fd5b80630e89341c116101d95780630e89341c1461027d578063156e29f6146102905780631a9e379f146102a35780631b2ef1ca146102ce57600080fd5b8062fdd58e1461020a57806301ffc9a71461023057806302fe53051461025357806306fdde0314610268575b600080fd5b61021d61021836600461208a565b61054a565b6040519081526020015b60405180910390f35b61024361023e3660046120ca565b6105e1565b6040519015158152602001610227565b61026661026136600461218f565b610633565b005b610270610674565b6040516102279190612234565b61027061028b366004612247565b610702565b61026661029e366004612260565b610736565b61021d6102b1366004612247565b336000908152600860209081526040808320938352929052205490565b6102666102dc366004612293565b610780565b600c546102439060ff1681565b61021d6102fc366004612247565b60056020526000908152604090205481565b61026661031c36600461236a565b61099e565b61021d61032f366004612247565b60066020526000908152604090205481565b61035461034f366004612414565b610a35565b604051610227919061251a565b61024361036f366004612247565b600090815260046020526040902054151590565b600c5461039b9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610227565b6102666103c1366004612293565b610b5f565b6102666103d436600461252d565b610b9b565b610266610bde565b61021d60095481565b61021d6103f8366004612247565b60076020526000908152604090205481565b6003546001600160a01b031661039b565b610266610429366004612293565b610c14565b610270610d95565b61021d61044436600461208a565b600860209081526000928352604080842090915290825290205481565b61026661046f3660046125af565b610da2565b610266610482366004612247565b610dad565b61021d610495366004612247565b60009081526004602052604090205490565b61026661107c565b6102436104bd3660046125e6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102666104f9366004612247565b6110ba565b61026661050c366004612619565b61125e565b61026661051f36600461267e565b6112a3565b610266610532366004612260565b61133b565b610266610545366004612293565b61137e565b60006001600160a01b0383166105bb5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061061257506001600160e01b031982166303a24d0760e21b145b8061062d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b0316331461065d5760405162461bcd60e51b81526004016105b290612699565b805161067090600d906020840190611fd5565b5050565b600a8054610681906126ce565b80601f01602080910402602001604051908101604052809291908181526020018280546106ad906126ce565b80156106fa5780601f106106cf576101008083540402835291602001916106fa565b820191906000526020600020905b8154815290600101906020018083116106dd57829003601f168201915b505050505081565b6060600d61070f836113ba565b604051602001610720929190612725565b6040516020818303038152906040529050919050565b6003546001600160a01b031633146107605760405162461bcd60e51b81526004016105b290612699565b61077b838383604051806020016040528060008152506114c0565b505050565b600c5460ff166107a25760405162461bcd60e51b81526004016105b2906127e0565b6001821180156107b25750600582105b6107eb5760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a5908125960b21b60448201526064016105b2565b600b811061082c5760405162461bcd60e51b815260206004820152600e60248201526d26b0bc101898103832b9102a3c3760911b60448201526064016105b2565b600082815260066020908152604080832054600490925290912054610852908390612821565b106108955760405162461bcd60e51b815260206004820152601360248201527213595b58995c9cda1a5c0814dbdb190813dd5d606a1b60448201526064016105b2565b6108b0338383604051806020016040528060008152506114c0565b33600090815260086020908152604080832085845290915281208054916108d683612839565b9091555050600c546000838152600560205260409020546101009091046001600160a01b0316906323b872dd903390737f65d1e07e31c9d9e0c9d9f5fa00fca317c3b06490610926908690612854565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af115801561097a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190612873565b6001600160a01b0385163314806109ba57506109ba85336104bd565b610a215760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016105b2565b610a2e85858585856115d0565b5050505050565b60608151835114610a9a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105b2565b6000835167ffffffffffffffff811115610ab657610ab66120ee565b604051908082528060200260200182016040528015610adf578160200160208202803683370190505b50905060005b8451811015610b5757610b2a858281518110610b0357610b03612890565b6020026020010151858381518110610b1d57610b1d612890565b602002602001015161054a565b828281518110610b3c57610b3c612890565b6020908102919091010152610b5081612839565b9050610ae5565b509392505050565b6003546001600160a01b03163314610b895760405162461bcd60e51b81526004016105b290612699565b60009182526007602052604090912055565b6001600160a01b038316331480610bb75750610bb783336104bd565b610bd35760405162461bcd60e51b81526004016105b2906128a6565b61077b83838361177a565b6003546001600160a01b03163314610c085760405162461bcd60e51b81526004016105b290612699565b610c126000611908565b565b600c5460ff16610c365760405162461bcd60e51b81526004016105b2906127e0565b600b8110610c775760405162461bcd60e51b815260206004820152600e60248201526d26b0bc101898103832b9102a3c3760911b60448201526064016105b2565b600182118015610c875750600582105b610cc05760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a5908125960b21b60448201526064016105b2565b600082815260066020908152604080832054600490925290912054610ce6908390612821565b10610d1e5760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b60448201526064016105b2565b600082815260076020526040902054610d46903390600190610d41908590612854565b61195a565b610d61338383604051806020016040528060008152506114c0565b600082815260076020526040902054610d7b908290612854565b60096000828254610d8c9190612821565b90915550505050565b600b8054610681906126ce565b610670338383611a5b565b600c5460ff16610dcf5760405162461bcd60e51b81526004016105b2906127e0565b600954600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31546101f491610e0b91612821565b610e1591906128ef565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055410610e805760405162461bcd60e51b815260206004820152600f60248201526e109c9bdb9e994814dbdb190813dd5d608a1b60448201526064016105b2565b600081118015610e905750600881105b610ed55760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b21028bab0b73a34ba3c9023b4bb32b760511b60448201526064016105b2565b3360009081526008602081815260408084206001855290915290912054610efd908390612821565b10610f4a5760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206d696e74206d6f7265207468616e20352062726f6e7a65000060448201526064016105b2565b600c54600160005260056020527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b546101009091046001600160a01b0316906323b872dd903390737f65d1e07e31c9d9e0c9d9f5fa00fca317c3b06490610fb2908690612854565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a9190612873565b503360009081526008602090815260408083206001845290915281208054839290611056908490612821565b9250508190555061107933600183604051806020016040528060008152506114c0565b50565b6003546001600160a01b031633146110a65760405162461bcd60e51b81526004016105b290612699565b600c805460ff19811660ff90911615179055565b600c5460ff166110dc5760405162461bcd60e51b81526004016105b2906127e0565b6009546110eb906103e9612821565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05541061115b5760405162461bcd60e51b8152602060048201526014602482015273119c995948109c9bdb9e994814dbdb190813dd5d60621b60448201526064016105b2565b60008111801561116b5750600381105b6111b05760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b21028bab0b73a34ba3c9023b4bb32b760511b60448201526064016105b2565b336000908152600860209081526040808320600184529091529020546003906111da908390612821565b106112335760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206d696e74206d6f7265207468616e203220667265652062726f6044820152626e7a6560e81b60648201526084016105b2565b3360009081526008602090815260408083206001845290915281208054839290611056908490612821565b6001600160a01b03851633148061127a575061127a85336104bd565b6112965760405162461bcd60e51b81526004016105b2906128a6565b610a2e8585858585611b3c565b6003546001600160a01b031633146112cd5760405162461bcd60e51b81526004016105b290612699565b6001600160a01b0381166113325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105b2565b61107981611908565b6001600160a01b038316331480611357575061135783336104bd565b6113735760405162461bcd60e51b81526004016105b2906128a6565b61077b83838361195a565b6003546001600160a01b031633146113a85760405162461bcd60e51b81526004016105b290612699565b60009182526005602052604090912055565b6060816113de5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561140857806113f281612839565b91506114019050600a8361291c565b91506113e2565b60008167ffffffffffffffff811115611423576114236120ee565b6040519080825280601f01601f19166020018201604052801561144d576020820181803683370190505b5090505b84156114b8576114626001836128ef565b915061146f600a86612930565b61147a906030612821565b60f81b81838151811061148f5761148f612890565b60200101906001600160f81b031916908160001a9053506114b1600a8661291c565b9450611451565b949350505050565b6001600160a01b0384166115205760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016105b2565b336115408160008761153188611c59565b61153a88611c59565b87611ca4565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611570908490612821565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a2e81600087878787611cb2565b81518351146115f15760405162461bcd60e51b81526004016105b290612944565b6001600160a01b0384166116175760405162461bcd60e51b81526004016105b29061298c565b33611626818787878787611ca4565b60005b845181101561170c57600085828151811061164657611646612890565b60200260200101519050600085838151811061166457611664612890565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156116b45760405162461bcd60e51b81526004016105b2906129d1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906116f1908490612821565b925050819055505050508061170590612839565b9050611629565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161175c929190612a1b565b60405180910390a4611772818787878787611e0e565b505050505050565b6001600160a01b0383166117a05760405162461bcd60e51b81526004016105b290612a40565b80518251146117c15760405162461bcd60e51b81526004016105b290612944565b60003390506117e481856000868660405180602001604052806000815250611ca4565b60005b83518110156118a957600084828151811061180457611804612890565b60200260200101519050600084838151811061182257611822612890565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156118725760405162461bcd60e51b81526004016105b290612a83565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806118a181612839565b9150506117e7565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516118fa929190612a1b565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166119805760405162461bcd60e51b81526004016105b290612a40565b336119af8185600061199187611c59565b61199a87611c59565b60405180602001604052806000815250611ca4565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156119f05760405162461bcd60e51b81526004016105b290612a83565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b816001600160a01b0316836001600160a01b03161415611acf5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105b2565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611b625760405162461bcd60e51b81526004016105b29061298c565b33611b7281878761153188611c59565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611bb35760405162461bcd60e51b81526004016105b2906129d1565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611bf0908490612821565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c50828888888888611cb2565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611c9357611c93612890565b602090810291909101015292915050565b611772868686868686611ec9565b6001600160a01b0384163b156117725760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611cf69089908990889088908890600401612ac7565b6020604051808303816000875af1925050508015611d31575060408051601f3d908101601f19168201909252611d2e91810190612b0c565b60015b611dde57611d3d612b29565b806308c379a01415611d775750611d52612b45565b80611d5d5750611d79565b8060405162461bcd60e51b81526004016105b29190612234565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016105b2565b6001600160e01b0319811663f23a6e6160e01b14611c505760405162461bcd60e51b81526004016105b290612bcf565b6001600160a01b0384163b156117725760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e529089908990889088908890600401612c17565b6020604051808303816000875af1925050508015611e8d575060408051601f3d908101601f19168201909252611e8a91810190612b0c565b60015b611e9957611d3d612b29565b6001600160e01b0319811663bc197c8160e01b14611c505760405162461bcd60e51b81526004016105b290612bcf565b6001600160a01b038516611f505760005b8351811015611f4e57828181518110611ef557611ef5612890565b602002602001015160046000868481518110611f1357611f13612890565b602002602001015181526020019081526020016000206000828254611f389190612821565b90915550611f47905081612839565b9050611eda565b505b6001600160a01b0384166117725760005b8351811015611c5057828181518110611f7c57611f7c612890565b602002602001015160046000868481518110611f9a57611f9a612890565b602002602001015181526020019081526020016000206000828254611fbf91906128ef565b90915550611fce905081612839565b9050611f61565b828054611fe1906126ce565b90600052602060002090601f0160209004810192826120035760008555612049565b82601f1061201c57805160ff1916838001178555612049565b82800160010185558215612049579182015b8281111561204957825182559160200191906001019061202e565b50612055929150612059565b5090565b5b80821115612055576000815560010161205a565b80356001600160a01b038116811461208557600080fd5b919050565b6000806040838503121561209d57600080fd5b6120a68361206e565b946020939093013593505050565b6001600160e01b03198116811461107957600080fd5b6000602082840312156120dc57600080fd5b81356120e7816120b4565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561212a5761212a6120ee565b6040525050565b600067ffffffffffffffff83111561214b5761214b6120ee565b604051612162601f8501601f191660200182612104565b80915083815284848401111561217757600080fd5b83836020830137600060208583010152509392505050565b6000602082840312156121a157600080fd5b813567ffffffffffffffff8111156121b857600080fd5b8201601f810184136121c957600080fd5b6114b884823560208401612131565b60005b838110156121f35781810151838201526020016121db565b83811115612202576000848401525b50505050565b600081518084526122208160208601602086016121d8565b601f01601f19169290920160200192915050565b6020815260006120e76020830184612208565b60006020828403121561225957600080fd5b5035919050565b60008060006060848603121561227557600080fd5b61227e8461206e565b95602085013595506040909401359392505050565b600080604083850312156122a657600080fd5b50508035926020909101359150565b600067ffffffffffffffff8211156122cf576122cf6120ee565b5060051b60200190565b600082601f8301126122ea57600080fd5b813560206122f7826122b5565b6040516123048282612104565b83815260059390931b850182019282810191508684111561232457600080fd5b8286015b8481101561233f5780358352918301918301612328565b509695505050505050565b600082601f83011261235b57600080fd5b6120e783833560208501612131565b600080600080600060a0868803121561238257600080fd5b61238b8661206e565b94506123996020870161206e565b9350604086013567ffffffffffffffff808211156123b657600080fd5b6123c289838a016122d9565b945060608801359150808211156123d857600080fd5b6123e489838a016122d9565b935060808801359150808211156123fa57600080fd5b506124078882890161234a565b9150509295509295909350565b6000806040838503121561242757600080fd5b823567ffffffffffffffff8082111561243f57600080fd5b818501915085601f83011261245357600080fd5b81356020612460826122b5565b60405161246d8282612104565b83815260059390931b850182019282810191508984111561248d57600080fd5b948201945b838610156124b2576124a38661206e565b82529482019490820190612492565b965050860135925050808211156124c857600080fd5b506124d5858286016122d9565b9150509250929050565b600081518084526020808501945080840160005b8381101561250f578151875295820195908201906001016124f3565b509495945050505050565b6020815260006120e760208301846124df565b60008060006060848603121561254257600080fd5b61254b8461206e565b9250602084013567ffffffffffffffff8082111561256857600080fd5b612574878388016122d9565b9350604086013591508082111561258a57600080fd5b50612597868287016122d9565b9150509250925092565b801515811461107957600080fd5b600080604083850312156125c257600080fd5b6125cb8361206e565b915060208301356125db816125a1565b809150509250929050565b600080604083850312156125f957600080fd5b6126028361206e565b91506126106020840161206e565b90509250929050565b600080600080600060a0868803121561263157600080fd5b61263a8661206e565b94506126486020870161206e565b93506040860135925060608601359150608086013567ffffffffffffffff81111561267257600080fd5b6124078882890161234a565b60006020828403121561269057600080fd5b6120e78261206e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806126e257607f821691505b6020821081141561270357634e487b7160e01b600052602260045260246000fd5b50919050565b6000815161271b8185602086016121d8565b9290920192915050565b600080845481600182811c91508083168061274157607f831692505b602080841082141561276157634e487b7160e01b86526022600452602486fd5b8180156127755760018114612786576127b3565b60ff198616895284890196506127b3565b60008b81526020902060005b868110156127ab5781548b820152908501908301612792565b505084890196505b5050505050506127d76127c68286612709565b64173539b7b760d91b815260050190565b95945050505050565b602080825260119082015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156128345761283461280b565b500190565b600060001982141561284d5761284d61280b565b5060010190565b600081600019048311821515161561286e5761286e61280b565b500290565b60006020828403121561288557600080fd5b81516120e7816125a1565b634e487b7160e01b600052603260045260246000fd5b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6000828210156129015761290161280b565b500390565b634e487b7160e01b600052601260045260246000fd5b60008261292b5761292b612906565b500490565b60008261293f5761293f612906565b500690565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612a2e60408301856124df565b82810360208401526127d781856124df565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612b0190830184612208565b979650505050505050565b600060208284031215612b1e57600080fd5b81516120e7816120b4565b600060033d1115612b425760046000803e5060005160e01c5b90565b600060443d1015612b535790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612b8357505050505090565b8285019150815181811115612b9b5750505050505090565b843d8701016020828501011115612bb55750505050505090565b612bc460208286010187612104565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612c43908301866124df565b8281036060840152612c5581866124df565b90508281036080840152612c698185612208565b9897505050505050505056fea26469706673582212206832e44a6f68e988b4ea3bb9b5a517f34234758bce24cd54c0b6f183822ca93164736f6c634300080a0033697066733a2f2f516d59716e54614b7a554b4c677948796565563954367064644668446e4e7a55686957424e6b7235514d326b704a2f697066733a2f2f516d59716e54614b7a554b4c677948796565563954367064644668446e4e7a55686957424e6b7235514d326b704a2f7b69647d2e6a736f6e

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102055760003560e01c8063715018a61161011a578063b2c2eb7d116100ad578063ebf8b9a81161007c578063ebf8b9a8146104eb578063f242432a146104fe578063f2fde38b14610511578063f5298aca14610524578063f7d975771461053757600080fd5b8063b2c2eb7d14610474578063bd85b03914610487578063c0336629146104a7578063e985e9c5146104af57600080fd5b80638db1e5c8116100e95780638db1e5c81461041b57806395d89b411461042e578063a0f8ae4714610436578063a22cb4651461046157600080fd5b8063715018a6146103d957806373f42561146103e157806380034f57146103ea5780638da5cb5b1461040a57600080fd5b8063200d2ed21161019d5780634e1273f41161016c5780634e1273f4146103415780634f558e791461036157806360f61cec146103835780636638d926146103b35780636b20c454146103c657600080fd5b8063200d2ed2146102e157806326a49e37146102ee5780632eb2c2d61461030e578063354030231461032157600080fd5b80630e89341c116101d95780630e89341c1461027d578063156e29f6146102905780631a9e379f146102a35780631b2ef1ca146102ce57600080fd5b8062fdd58e1461020a57806301ffc9a71461023057806302fe53051461025357806306fdde0314610268575b600080fd5b61021d61021836600461208a565b61054a565b6040519081526020015b60405180910390f35b61024361023e3660046120ca565b6105e1565b6040519015158152602001610227565b61026661026136600461218f565b610633565b005b610270610674565b6040516102279190612234565b61027061028b366004612247565b610702565b61026661029e366004612260565b610736565b61021d6102b1366004612247565b336000908152600860209081526040808320938352929052205490565b6102666102dc366004612293565b610780565b600c546102439060ff1681565b61021d6102fc366004612247565b60056020526000908152604090205481565b61026661031c36600461236a565b61099e565b61021d61032f366004612247565b60066020526000908152604090205481565b61035461034f366004612414565b610a35565b604051610227919061251a565b61024361036f366004612247565b600090815260046020526040902054151590565b600c5461039b9061010090046001600160a01b031681565b6040516001600160a01b039091168152602001610227565b6102666103c1366004612293565b610b5f565b6102666103d436600461252d565b610b9b565b610266610bde565b61021d60095481565b61021d6103f8366004612247565b60076020526000908152604090205481565b6003546001600160a01b031661039b565b610266610429366004612293565b610c14565b610270610d95565b61021d61044436600461208a565b600860209081526000928352604080842090915290825290205481565b61026661046f3660046125af565b610da2565b610266610482366004612247565b610dad565b61021d610495366004612247565b60009081526004602052604090205490565b61026661107c565b6102436104bd3660046125e6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6102666104f9366004612247565b6110ba565b61026661050c366004612619565b61125e565b61026661051f36600461267e565b6112a3565b610266610532366004612260565b61133b565b610266610545366004612293565b61137e565b60006001600160a01b0383166105bb5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061061257506001600160e01b031982166303a24d0760e21b145b8061062d57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6003546001600160a01b0316331461065d5760405162461bcd60e51b81526004016105b290612699565b805161067090600d906020840190611fd5565b5050565b600a8054610681906126ce565b80601f01602080910402602001604051908101604052809291908181526020018280546106ad906126ce565b80156106fa5780601f106106cf576101008083540402835291602001916106fa565b820191906000526020600020905b8154815290600101906020018083116106dd57829003601f168201915b505050505081565b6060600d61070f836113ba565b604051602001610720929190612725565b6040516020818303038152906040529050919050565b6003546001600160a01b031633146107605760405162461bcd60e51b81526004016105b290612699565b61077b838383604051806020016040528060008152506114c0565b505050565b600c5460ff166107a25760405162461bcd60e51b81526004016105b2906127e0565b6001821180156107b25750600582105b6107eb5760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a5908125960b21b60448201526064016105b2565b600b811061082c5760405162461bcd60e51b815260206004820152600e60248201526d26b0bc101898103832b9102a3c3760911b60448201526064016105b2565b600082815260066020908152604080832054600490925290912054610852908390612821565b106108955760405162461bcd60e51b815260206004820152601360248201527213595b58995c9cda1a5c0814dbdb190813dd5d606a1b60448201526064016105b2565b6108b0338383604051806020016040528060008152506114c0565b33600090815260086020908152604080832085845290915281208054916108d683612839565b9091555050600c546000838152600560205260409020546101009091046001600160a01b0316906323b872dd903390737f65d1e07e31c9d9e0c9d9f5fa00fca317c3b06490610926908690612854565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af115801561097a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061077b9190612873565b6001600160a01b0385163314806109ba57506109ba85336104bd565b610a215760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016105b2565b610a2e85858585856115d0565b5050505050565b60608151835114610a9a5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016105b2565b6000835167ffffffffffffffff811115610ab657610ab66120ee565b604051908082528060200260200182016040528015610adf578160200160208202803683370190505b50905060005b8451811015610b5757610b2a858281518110610b0357610b03612890565b6020026020010151858381518110610b1d57610b1d612890565b602002602001015161054a565b828281518110610b3c57610b3c612890565b6020908102919091010152610b5081612839565b9050610ae5565b509392505050565b6003546001600160a01b03163314610b895760405162461bcd60e51b81526004016105b290612699565b60009182526007602052604090912055565b6001600160a01b038316331480610bb75750610bb783336104bd565b610bd35760405162461bcd60e51b81526004016105b2906128a6565b61077b83838361177a565b6003546001600160a01b03163314610c085760405162461bcd60e51b81526004016105b290612699565b610c126000611908565b565b600c5460ff16610c365760405162461bcd60e51b81526004016105b2906127e0565b600b8110610c775760405162461bcd60e51b815260206004820152600e60248201526d26b0bc101898103832b9102a3c3760911b60448201526064016105b2565b600182118015610c875750600582105b610cc05760405162461bcd60e51b815260206004820152600a602482015269125b9d985b1a5908125960b21b60448201526064016105b2565b600082815260066020908152604080832054600490925290912054610ce6908390612821565b10610d1e5760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b60448201526064016105b2565b600082815260076020526040902054610d46903390600190610d41908590612854565b61195a565b610d61338383604051806020016040528060008152506114c0565b600082815260076020526040902054610d7b908290612854565b60096000828254610d8c9190612821565b90915550505050565b600b8054610681906126ce565b610670338383611a5b565b600c5460ff16610dcf5760405162461bcd60e51b81526004016105b2906127e0565b600954600160005260066020527f3e5fec24aa4dc4e5aee2e025e51e1392c72a2500577559fae9665c6d52bd6a31546101f491610e0b91612821565b610e1591906128ef565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055410610e805760405162461bcd60e51b815260206004820152600f60248201526e109c9bdb9e994814dbdb190813dd5d608a1b60448201526064016105b2565b600081118015610e905750600881105b610ed55760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b21028bab0b73a34ba3c9023b4bb32b760511b60448201526064016105b2565b3360009081526008602081815260408084206001855290915290912054610efd908390612821565b10610f4a5760405162461bcd60e51b815260206004820152601e60248201527f43616e6e6f74206d696e74206d6f7265207468616e20352062726f6e7a65000060448201526064016105b2565b600c54600160005260056020527f1471eb6eb2c5e789fc3de43f8ce62938c7d1836ec861730447e2ada8fd81017b546101009091046001600160a01b0316906323b872dd903390737f65d1e07e31c9d9e0c9d9f5fa00fca317c3b06490610fb2908690612854565b6040516001600160e01b031960e086901b1681526001600160a01b03938416600482015292909116602483015260448201526064016020604051808303816000875af1158015611006573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061102a9190612873565b503360009081526008602090815260408083206001845290915281208054839290611056908490612821565b9250508190555061107933600183604051806020016040528060008152506114c0565b50565b6003546001600160a01b031633146110a65760405162461bcd60e51b81526004016105b290612699565b600c805460ff19811660ff90911615179055565b600c5460ff166110dc5760405162461bcd60e51b81526004016105b2906127e0565b6009546110eb906103e9612821565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe05541061115b5760405162461bcd60e51b8152602060048201526014602482015273119c995948109c9bdb9e994814dbdb190813dd5d60621b60448201526064016105b2565b60008111801561116b5750600381105b6111b05760405162461bcd60e51b815260206004820152601660248201527524b73b30b634b21028bab0b73a34ba3c9023b4bb32b760511b60448201526064016105b2565b336000908152600860209081526040808320600184529091529020546003906111da908390612821565b106112335760405162461bcd60e51b815260206004820152602360248201527f43616e6e6f74206d696e74206d6f7265207468616e203220667265652062726f6044820152626e7a6560e81b60648201526084016105b2565b3360009081526008602090815260408083206001845290915281208054839290611056908490612821565b6001600160a01b03851633148061127a575061127a85336104bd565b6112965760405162461bcd60e51b81526004016105b2906128a6565b610a2e8585858585611b3c565b6003546001600160a01b031633146112cd5760405162461bcd60e51b81526004016105b290612699565b6001600160a01b0381166113325760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105b2565b61107981611908565b6001600160a01b038316331480611357575061135783336104bd565b6113735760405162461bcd60e51b81526004016105b2906128a6565b61077b83838361195a565b6003546001600160a01b031633146113a85760405162461bcd60e51b81526004016105b290612699565b60009182526005602052604090912055565b6060816113de5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561140857806113f281612839565b91506114019050600a8361291c565b91506113e2565b60008167ffffffffffffffff811115611423576114236120ee565b6040519080825280601f01601f19166020018201604052801561144d576020820181803683370190505b5090505b84156114b8576114626001836128ef565b915061146f600a86612930565b61147a906030612821565b60f81b81838151811061148f5761148f612890565b60200101906001600160f81b031916908160001a9053506114b1600a8661291c565b9450611451565b949350505050565b6001600160a01b0384166115205760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016105b2565b336115408160008761153188611c59565b61153a88611c59565b87611ca4565b6000848152602081815260408083206001600160a01b038916845290915281208054859290611570908490612821565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610a2e81600087878787611cb2565b81518351146115f15760405162461bcd60e51b81526004016105b290612944565b6001600160a01b0384166116175760405162461bcd60e51b81526004016105b29061298c565b33611626818787878787611ca4565b60005b845181101561170c57600085828151811061164657611646612890565b60200260200101519050600085838151811061166457611664612890565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156116b45760405162461bcd60e51b81526004016105b2906129d1565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906116f1908490612821565b925050819055505050508061170590612839565b9050611629565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161175c929190612a1b565b60405180910390a4611772818787878787611e0e565b505050505050565b6001600160a01b0383166117a05760405162461bcd60e51b81526004016105b290612a40565b80518251146117c15760405162461bcd60e51b81526004016105b290612944565b60003390506117e481856000868660405180602001604052806000815250611ca4565b60005b83518110156118a957600084828151811061180457611804612890565b60200260200101519050600084838151811061182257611822612890565b602090810291909101810151600084815280835260408082206001600160a01b038c1683529093529190912054909150818110156118725760405162461bcd60e51b81526004016105b290612a83565b6000928352602083815260408085206001600160a01b038b16865290915290922091039055806118a181612839565b9150506117e7565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516118fa929190612a1b565b60405180910390a450505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0383166119805760405162461bcd60e51b81526004016105b290612a40565b336119af8185600061199187611c59565b61199a87611c59565b60405180602001604052806000815250611ca4565b6000838152602081815260408083206001600160a01b0388168452909152902054828110156119f05760405162461bcd60e51b81526004016105b290612a83565b6000848152602081815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b816001600160a01b0316836001600160a01b03161415611acf5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016105b2565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038416611b625760405162461bcd60e51b81526004016105b29061298c565b33611b7281878761153188611c59565b6000848152602081815260408083206001600160a01b038a16845290915290205483811015611bb35760405162461bcd60e51b81526004016105b2906129d1565b6000858152602081815260408083206001600160a01b038b8116855292528083208785039055908816825281208054869290611bf0908490612821565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c50828888888888611cb2565b50505050505050565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611c9357611c93612890565b602090810291909101015292915050565b611772868686868686611ec9565b6001600160a01b0384163b156117725760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611cf69089908990889088908890600401612ac7565b6020604051808303816000875af1925050508015611d31575060408051601f3d908101601f19168201909252611d2e91810190612b0c565b60015b611dde57611d3d612b29565b806308c379a01415611d775750611d52612b45565b80611d5d5750611d79565b8060405162461bcd60e51b81526004016105b29190612234565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016105b2565b6001600160e01b0319811663f23a6e6160e01b14611c505760405162461bcd60e51b81526004016105b290612bcf565b6001600160a01b0384163b156117725760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611e529089908990889088908890600401612c17565b6020604051808303816000875af1925050508015611e8d575060408051601f3d908101601f19168201909252611e8a91810190612b0c565b60015b611e9957611d3d612b29565b6001600160e01b0319811663bc197c8160e01b14611c505760405162461bcd60e51b81526004016105b290612bcf565b6001600160a01b038516611f505760005b8351811015611f4e57828181518110611ef557611ef5612890565b602002602001015160046000868481518110611f1357611f13612890565b602002602001015181526020019081526020016000206000828254611f389190612821565b90915550611f47905081612839565b9050611eda565b505b6001600160a01b0384166117725760005b8351811015611c5057828181518110611f7c57611f7c612890565b602002602001015160046000868481518110611f9a57611f9a612890565b602002602001015181526020019081526020016000206000828254611fbf91906128ef565b90915550611fce905081612839565b9050611f61565b828054611fe1906126ce565b90600052602060002090601f0160209004810192826120035760008555612049565b82601f1061201c57805160ff1916838001178555612049565b82800160010185558215612049579182015b8281111561204957825182559160200191906001019061202e565b50612055929150612059565b5090565b5b80821115612055576000815560010161205a565b80356001600160a01b038116811461208557600080fd5b919050565b6000806040838503121561209d57600080fd5b6120a68361206e565b946020939093013593505050565b6001600160e01b03198116811461107957600080fd5b6000602082840312156120dc57600080fd5b81356120e7816120b4565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561212a5761212a6120ee565b6040525050565b600067ffffffffffffffff83111561214b5761214b6120ee565b604051612162601f8501601f191660200182612104565b80915083815284848401111561217757600080fd5b83836020830137600060208583010152509392505050565b6000602082840312156121a157600080fd5b813567ffffffffffffffff8111156121b857600080fd5b8201601f810184136121c957600080fd5b6114b884823560208401612131565b60005b838110156121f35781810151838201526020016121db565b83811115612202576000848401525b50505050565b600081518084526122208160208601602086016121d8565b601f01601f19169290920160200192915050565b6020815260006120e76020830184612208565b60006020828403121561225957600080fd5b5035919050565b60008060006060848603121561227557600080fd5b61227e8461206e565b95602085013595506040909401359392505050565b600080604083850312156122a657600080fd5b50508035926020909101359150565b600067ffffffffffffffff8211156122cf576122cf6120ee565b5060051b60200190565b600082601f8301126122ea57600080fd5b813560206122f7826122b5565b6040516123048282612104565b83815260059390931b850182019282810191508684111561232457600080fd5b8286015b8481101561233f5780358352918301918301612328565b509695505050505050565b600082601f83011261235b57600080fd5b6120e783833560208501612131565b600080600080600060a0868803121561238257600080fd5b61238b8661206e565b94506123996020870161206e565b9350604086013567ffffffffffffffff808211156123b657600080fd5b6123c289838a016122d9565b945060608801359150808211156123d857600080fd5b6123e489838a016122d9565b935060808801359150808211156123fa57600080fd5b506124078882890161234a565b9150509295509295909350565b6000806040838503121561242757600080fd5b823567ffffffffffffffff8082111561243f57600080fd5b818501915085601f83011261245357600080fd5b81356020612460826122b5565b60405161246d8282612104565b83815260059390931b850182019282810191508984111561248d57600080fd5b948201945b838610156124b2576124a38661206e565b82529482019490820190612492565b965050860135925050808211156124c857600080fd5b506124d5858286016122d9565b9150509250929050565b600081518084526020808501945080840160005b8381101561250f578151875295820195908201906001016124f3565b509495945050505050565b6020815260006120e760208301846124df565b60008060006060848603121561254257600080fd5b61254b8461206e565b9250602084013567ffffffffffffffff8082111561256857600080fd5b612574878388016122d9565b9350604086013591508082111561258a57600080fd5b50612597868287016122d9565b9150509250925092565b801515811461107957600080fd5b600080604083850312156125c257600080fd5b6125cb8361206e565b915060208301356125db816125a1565b809150509250929050565b600080604083850312156125f957600080fd5b6126028361206e565b91506126106020840161206e565b90509250929050565b600080600080600060a0868803121561263157600080fd5b61263a8661206e565b94506126486020870161206e565b93506040860135925060608601359150608086013567ffffffffffffffff81111561267257600080fd5b6124078882890161234a565b60006020828403121561269057600080fd5b6120e78261206e565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806126e257607f821691505b6020821081141561270357634e487b7160e01b600052602260045260246000fd5b50919050565b6000815161271b8185602086016121d8565b9290920192915050565b600080845481600182811c91508083168061274157607f831692505b602080841082141561276157634e487b7160e01b86526022600452602486fd5b8180156127755760018114612786576127b3565b60ff198616895284890196506127b3565b60008b81526020902060005b868110156127ab5781548b820152908501908301612792565b505084890196505b5050505050506127d76127c68286612709565b64173539b7b760d91b815260050190565b95945050505050565b602080825260119082015270135a5b9d1a5b99c81a5cc81c185d5cd959607a1b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156128345761283461280b565b500190565b600060001982141561284d5761284d61280b565b5060010190565b600081600019048311821515161561286e5761286e61280b565b500290565b60006020828403121561288557600080fd5b81516120e7816125a1565b634e487b7160e01b600052603260045260246000fd5b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b6000828210156129015761290161280b565b500390565b634e487b7160e01b600052601260045260246000fd5b60008261292b5761292b612906565b500490565b60008261293f5761293f612906565b500690565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b604081526000612a2e60408301856124df565b82810360208401526127d781856124df565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612b0190830184612208565b979650505050505050565b600060208284031215612b1e57600080fd5b81516120e7816120b4565b600060033d1115612b425760046000803e5060005160e01c5b90565b600060443d1015612b535790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715612b8357505050505090565b8285019150815181811115612b9b5750505050505090565b843d8701016020828501011115612bb55750505050505090565b612bc460208286010187612104565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612c43908301866124df565b8281036060840152612c5581866124df565b90508281036080840152612c698185612208565b9897505050505050505056fea26469706673582212206832e44a6f68e988b4ea3bb9b5a517f34234758bce24cd54c0b6f183822ca93164736f6c634300080a0033

Deployed Bytecode Sourcemap

39477:3995:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19467:231;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;19467:231:0;;;;;;;;18490:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;18490:310:0;1019:187:1;42901:90:0;;;;;;:::i;:::-;;:::i;:::-;;39817:18;;;:::i;:::-;;;;;;;:::i;42999:195::-;;;;;;:::i;:::-;;:::i;40839:125::-;;;;;;:::i;:::-;;:::i;41918:115::-;;;;;;:::i;:::-;42010:10;41971:7;41997:24;;;:12;:24;;;;;;;;:28;;;;;;;;;41918:115;42039:463;;;;;;:::i;:::-;;:::i;39871:25::-;;;;;;;;;39561:40;;;;;;:::i;:::-;;;;;;;;;;;;;;21406:442;;;;;;:::i;:::-;;:::i;39608:41::-;;;;;;:::i;:::-;;;;;;;;;;;;;;19864:524;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;35977:122::-;;;;;;:::i;:::-;36034:4;35855:16;;;:12;:16;;;;;;-1:-1:-1;;;35977:122:0;39939:70;;;;;;;;-1:-1:-1;;;;;39939:70:0;;;;;;-1:-1:-1;;;;;8239:32:1;;;8221:51;;8209:2;8194:18;39939:70:0;8075:203:1;40742:89:0;;;;;;:::i;:::-;;:::i;35227:353::-;;;;;;:::i;:::-;;:::i;34031:103::-;;;:::i;39783:24::-;;;;;;39656:40;;;;;;:::i;:::-;;;;;;;;;;;;;;33380:87;33453:6;;-1:-1:-1;;;;;33453:6:0;33380:87;;42510:383;;;;;;:::i;:::-;;:::i;39842:20::-;;;:::i;39703:67::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;20461:155;;;;;;:::i;:::-;;:::i;41391:521::-;;;;;;:::i;:::-;;:::i;35766:113::-;;;;;;:::i;:::-;35828:7;35855:16;;;:12;:16;;;;;;;35766:113;40662:72;;;:::i;20688:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;20811:27:0;;;20787:4;20811:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;20688:168;40972:411;;;;;;:::i;:::-;;:::i;20928:401::-;;;;;;:::i;:::-;;:::i;34289:201::-;;;;;;:::i;:::-;;:::i;34898:321::-;;;;;;:::i;:::-;;:::i;40565:89::-;;;;;;:::i;:::-;;:::i;19467:231::-;19553:7;-1:-1:-1;;;;;19581:21:0;;19573:77;;;;-1:-1:-1;;;19573:77:0;;10669:2:1;19573:77:0;;;10651:21:1;10708:2;10688:18;;;10681:30;10747:34;10727:18;;;10720:62;-1:-1:-1;;;10798:18:1;;;10791:41;10849:19;;19573:77:0;;;;;;;;;-1:-1:-1;19668:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;19668:22:0;;;;;;;;;;;;19467:231::o;18490:310::-;18592:4;-1:-1:-1;;;;;;18629:41:0;;-1:-1:-1;;;18629:41:0;;:110;;-1:-1:-1;;;;;;;18687:52:0;;-1:-1:-1;;;18687:52:0;18629:110;:163;;;-1:-1:-1;;;;;;;;;;11272:40:0;;;18756:36;18609:183;18490:310;-1:-1:-1;;18490:310:0:o;42901:90::-;33453:6;;-1:-1:-1;;;;;33453:6:0;2189:10;33600:23;33592:68;;;;-1:-1:-1;;;33592:68:0;;;;;;;:::i;:::-;42967:16;;::::1;::::0;:7:::1;::::0;:16:::1;::::0;::::1;::::0;::::1;:::i;:::-;;42901:90:::0;:::o;39817:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42999:195::-;43059:13;43131:7;43140:25;43157:7;43140:16;:25::i;:::-;43114:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43086:100;;42999:195;;;:::o;40839:125::-;33453:6;;-1:-1:-1;;;;;33453:6:0;2189:10;33600:23;33592:68;;;;-1:-1:-1;;;33592:68:0;;;;;;;:::i;:::-;40926:30:::1;40932:7;40941:2;40945:6;40926:30;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;40839:125:::0;;;:::o;42039:463::-;42102:6;;;;42094:36;;;;-1:-1:-1;;;42094:36:0;;;;;;;:::i;:::-;42155:1;42150:2;:6;:16;;;;;42165:1;42160:2;:6;42150:16;42141:40;;;;-1:-1:-1;;;42141:40:0;;13913:2:1;42141:40:0;;;13895:21:1;13952:2;13932:18;;;13925:30;-1:-1:-1;;;13971:18:1;;;13964:40;14021:18;;42141:40:0;13711:334:1;42141:40:0;42205:2;42201:1;:6;42192:34;;;;-1:-1:-1;;;42192:34:0;;14252:2:1;42192:34:0;;;14234:21:1;14291:2;14271:18;;;14264:30;-1:-1:-1;;;14310:18:1;;;14303:44;14364:18;;42192:34:0;14050:338:1;42192:34:0;42266:10;;;;:6;:10;;;;;;;;;35855:12;:16;;;;;;;42246:17;;42262:1;;42246:17;:::i;:::-;:30;42237:64;;;;-1:-1:-1;;;42237:64:0;;14860:2:1;42237:64:0;;;14842:21:1;14899:2;14879:18;;;14872:30;-1:-1:-1;;;14918:18:1;;;14911:49;14977:18;;42237:64:0;14658:343:1;42237:64:0;42314:28;42320:10;42332:2;42336:1;42314:28;;;;;;;;;;;;:5;:28::i;:::-;42366:10;42353:24;;;;:12;:24;;;;;;;;:28;;;;;;;;:30;;;;;;:::i;:::-;;;;-1:-1:-1;;42401:10:0;;42482:9;;;;:5;:9;;;;;;42401:10;;;;-1:-1:-1;;;;;42401:10:0;;42394:31;;42426:10;;42438:42;;42482:11;;42492:1;;42482:11;:::i;:::-;42394:100;;-1:-1:-1;;;;;;42394:100:0;;;;;;;-1:-1:-1;;;;;15577:15:1;;;42394:100:0;;;15559:34:1;15629:15;;;;15609:18;;;15602:43;15661:18;;;15654:34;15494:18;;42394:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;21406:442::-;-1:-1:-1;;;;;21639:20:0;;2189:10;21639:20;;:60;;-1:-1:-1;21663:36:0;21680:4;2189:10;20688:168;:::i;21663:36::-;21617:160;;;;-1:-1:-1;;;21617:160:0;;16151:2:1;21617:160:0;;;16133:21:1;16190:2;16170:18;;;16163:30;16229:34;16209:18;;;16202:62;-1:-1:-1;;;16280:18:1;;;16273:48;16338:19;;21617:160:0;15949:414:1;21617:160:0;21788:52;21811:4;21817:2;21821:3;21826:7;21835:4;21788:22;:52::i;:::-;21406:442;;;;;:::o;19864:524::-;20020:16;20081:3;:10;20062:8;:15;:29;20054:83;;;;-1:-1:-1;;;20054:83:0;;16570:2:1;20054:83:0;;;16552:21:1;16609:2;16589:18;;;16582:30;16648:34;16628:18;;;16621:62;-1:-1:-1;;;16699:18:1;;;16692:39;16748:19;;20054:83:0;16368:405:1;20054:83:0;20150:30;20197:8;:15;20183:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20183:30:0;;20150:63;;20231:9;20226:122;20250:8;:15;20246:1;:19;20226:122;;;20306:30;20316:8;20325:1;20316:11;;;;;;;;:::i;:::-;;;;;;;20329:3;20333:1;20329:6;;;;;;;;:::i;:::-;;;;;;;20306:9;:30::i;:::-;20287:13;20301:1;20287:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;20267:3;;;:::i;:::-;;;20226:122;;;-1:-1:-1;20367:13:0;19864:524;-1:-1:-1;;;19864:524:0:o;40742:89::-;33453:6;;-1:-1:-1;;;;;33453:6:0;2189:10;33600:23;33592:68;;;;-1:-1:-1;;;33592:68:0;;;;;;;:::i;:::-;40810:9:::1;::::0;;;:5:::1;:9;::::0;;;;;:13;40742:89::o;35227:353::-;-1:-1:-1;;;;;35392:23:0;;2189:10;35392:23;;:66;;-1:-1:-1;35419:39:0;35436:7;2189:10;20688:168;:::i;35419:39::-;35370:157;;;;-1:-1:-1;;;35370:157:0;;;;;;;:::i;:::-;35540:32;35551:7;35560:3;35565:6;35540:10;:32::i;34031:103::-;33453:6;;-1:-1:-1;;;;;33453:6:0;2189:10;33600:23;33592:68;;;;-1:-1:-1;;;33592:68:0;;;;;;;:::i;:::-;34096:30:::1;34123:1;34096:18;:30::i;:::-;34031:103::o:0;42510:383::-;42577:6;;;;42569:36;;;;-1:-1:-1;;;42569:36:0;;;;;;;:::i;:::-;42629:2;42625:1;:6;42616:34;;;;-1:-1:-1;;;42616:34:0;;14252:2:1;42616:34:0;;;14234:21:1;14291:2;14271:18;;;14264:30;-1:-1:-1;;;14310:18:1;;;14303:44;14364:18;;42616:34:0;14050:338:1;42616:34:0;42675:1;42670:2;:6;:16;;;;;42685:1;42680:2;:6;42670:16;42661:40;;;;-1:-1:-1;;;42661:40:0;;13913:2:1;42661:40:0;;;13895:21:1;13952:2;13932:18;;;13925:30;-1:-1:-1;;;13971:18:1;;;13964:40;14021:18;;42661:40:0;13711:334:1;42661:40:0;42741:10;;;;:6;:10;;;;;;;;;35855:12;:16;;;;;;;42721:17;;42737:1;;42721:17;:::i;:::-;:30;42712:53;;;;-1:-1:-1;;;42712:53:0;;17522:2:1;42712:53:0;;;17504:21:1;17561:1;17541:18;;;17534:29;-1:-1:-1;;;17579:18:1;;;17572:38;17627:18;;42712:53:0;17320:331:1;42712:53:0;42799:9;;;;:5;:9;;;;;;42778:33;;42784:10;;42796:1;;42799:11;;42809:1;;42799:11;:::i;:::-;42778:5;:33::i;:::-;42822:28;42828:10;42840:2;42844:1;42822:28;;;;;;;;;;;;:5;:28::i;:::-;42873:9;;;;:5;:9;;;;;;:11;;42883:1;;42873:11;:::i;:::-;42863:6;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;42510:383:0:o;39842:20::-;;;;;;;:::i;20461:155::-;20556:52;2189:10;20589:8;20599;20556:18;:52::i;41391:521::-;41448:6;;;;41440:36;;;;-1:-1:-1;;;41440:36:0;;;;;;;:::i;:::-;41525:6;;41520:1;41513:9;;:6;:9;;;;41534:3;;41513:18;;;:::i;:::-;:24;;;;:::i;:::-;41508:1;35828:7;35855:16;:12;:16;;;;41496:41;41487:71;;;;-1:-1:-1;;;41487:71:0;;17988:2:1;41487:71:0;;;17970:21:1;18027:2;18007:18;;;18000:30;-1:-1:-1;;;18046:18:1;;;18039:45;18101:18;;41487:71:0;17786:339:1;41487:71:0;41582:1;41578;:5;:14;;;;;41591:1;41587;:5;41578:14;41569:51;;;;-1:-1:-1;;;41569:51:0;;18332:2:1;41569:51:0;;;18314:21:1;18371:2;18351:18;;;18344:30;-1:-1:-1;;;18390:18:1;;;18383:52;18452:18;;41569:51:0;18130:346:1;41569:51:0;41653:10;41640:24;;;;41674:1;41640:24;;;;;;;;41665:1;41640:27;;;;;;;;;:31;;41670:1;;41640:31;:::i;:::-;:35;41631:80;;;;-1:-1:-1;;;41631:80:0;;18683:2:1;41631:80:0;;;18665:21:1;18722:2;18702:18;;;18695:30;18761:32;18741:18;;;18734:60;18811:18;;41631:80:0;18481:354:1;41631:80:0;41729:10;;;41810:8;;:5;:8;;;;41729:10;;;;-1:-1:-1;;;;;41729:10:0;;41722:31;;41754:10;;41766:42;;41810:10;;41819:1;;41810:10;:::i;:::-;41722:99;;-1:-1:-1;;;;;;41722:99:0;;;;;;;-1:-1:-1;;;;;15577:15:1;;;41722:99:0;;;15559:34:1;15629:15;;;;15609:18;;;15602:43;15661:18;;;15654:34;15494:18;;41722:99:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;41847:10:0;41834:24;;;;:12;:24;;;;;;;;41859:1;41834:27;;;;;;;:32;;41865:1;;41834:24;:32;;41865:1;;41834:32;:::i;:::-;;;;;;;;41877:27;41883:10;41895:1;41898;41877:27;;;;;;;;;;;;:5;:27::i;:::-;41391:521;:::o;40662:72::-;33453:6;;-1:-1:-1;;;;;33453:6:0;2189:10;33600:23;33592:68;;;;-1:-1:-1;;;33592:68:0;;;;;;;:::i;:::-;40720:6:::1;::::0;;-1:-1:-1;;40710:16:0;::::1;40720:6;::::0;;::::1;40719:7;40710:16;::::0;;40662:72::o;40972:411::-;41030:6;;;;41022:36;;;;-1:-1:-1;;;41022:36:0;;;;;;;:::i;:::-;41102:6;;41095:13;;:4;:13;:::i;:::-;41090:1;35828:7;35855:16;:12;:16;;;;41078:30;41069:65;;;;-1:-1:-1;;;41069:65:0;;19042:2:1;41069:65:0;;;19024:21:1;19081:2;19061:18;;;19054:30;-1:-1:-1;;;19100:18:1;;;19093:50;19160:18;;41069:65:0;18840:344:1;41069:65:0;41158:1;41154;:5;:14;;;;;41167:1;41163;:5;41154:14;41145:51;;;;-1:-1:-1;;;41145:51:0;;18332:2:1;41145:51:0;;;18314:21:1;18371:2;18351:18;;;18344:30;-1:-1:-1;;;18390:18:1;;;18383:52;18452:18;;41145:51:0;18130:346:1;41145:51:0;41229:10;41216:24;;;;:12;:24;;;;;;;;41241:1;41216:27;;;;;;;;41250:1;;41216:31;;41246:1;;41216:31;:::i;:::-;:35;41207:85;;;;-1:-1:-1;;;41207:85:0;;19391:2:1;41207:85:0;;;19373:21:1;19430:2;19410:18;;;19403:30;19469:34;19449:18;;;19442:62;-1:-1:-1;;;19520:18:1;;;19513:33;19563:19;;41207:85:0;19189:399:1;41207:85:0;41318:10;41305:24;;;;:12;:24;;;;;;;;41330:1;41305:27;;;;;;;:32;;41336:1;;41305:24;:32;;41336:1;;41305:32;:::i;20928:401::-;-1:-1:-1;;;;;21136:20:0;;2189:10;21136:20;;:60;;-1:-1:-1;21160:36:0;21177:4;2189:10;20688:168;:::i;21160:36::-;21114:151;;;;-1:-1:-1;;;21114:151:0;;;;;;;:::i;:::-;21276:45;21294:4;21300:2;21304;21308:6;21316:4;21276:17;:45::i;34289:201::-;33453:6;;-1:-1:-1;;;;;33453:6:0;2189:10;33600:23;33592:68;;;;-1:-1:-1;;;33592:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34378:22:0;::::1;34370:73;;;::::0;-1:-1:-1;;;34370:73:0;;19795:2:1;34370:73:0::1;::::0;::::1;19777:21:1::0;19834:2;19814:18;;;19807:30;19873:34;19853:18;;;19846:62;-1:-1:-1;;;19924:18:1;;;19917:36;19970:19;;34370:73:0::1;19593:402:1::0;34370:73:0::1;34454:28;34473:8;34454:18;:28::i;34898:321::-:0;-1:-1:-1;;;;;35038:23:0;;2189:10;35038:23;;:66;;-1:-1:-1;35065:39:0;35082:7;2189:10;20688:168;:::i;35065:39::-;35016:157;;;;-1:-1:-1;;;35016:157:0;;;;;;;:::i;:::-;35186:25;35192:7;35201:2;35205:5;35186;:25::i;40565:89::-;33453:6;;-1:-1:-1;;;;;33453:6:0;2189:10;33600:23;33592:68;;;;-1:-1:-1;;;33592:68:0;;;;;;;:::i;:::-;40633:9:::1;::::0;;;:5:::1;:9;::::0;;;;;:13;40565:89::o;319:723::-;375:13;596:10;592:53;;-1:-1:-1;;623:10:0;;;;;;;;;;;;-1:-1:-1;;;623:10:0;;;;;319:723::o;592:53::-;670:5;655:12;711:78;718:9;;711:78;;744:8;;;;:::i;:::-;;-1:-1:-1;767:10:0;;-1:-1:-1;775:2:0;767:10;;:::i;:::-;;;711:78;;;799:19;831:6;821:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;821:17:0;;799:39;;849:154;856:10;;849:154;;883:11;893:1;883:11;;:::i;:::-;;-1:-1:-1;952:10:0;960:2;952:5;:10;:::i;:::-;939:24;;:2;:24;:::i;:::-;926:39;;909:6;916;909:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;909:56:0;;;;;;;;-1:-1:-1;980:11:0;989:2;980:11;;:::i;:::-;;;849:154;;;1027:6;319:723;-1:-1:-1;;;;319:723:0:o;25882:569::-;-1:-1:-1;;;;;26035:16:0;;26027:62;;;;-1:-1:-1;;;26027:62:0;;20576:2:1;26027:62:0;;;20558:21:1;20615:2;20595:18;;;20588:30;20654:34;20634:18;;;20627:62;-1:-1:-1;;;20705:18:1;;;20698:31;20746:19;;26027:62:0;20374:397:1;26027:62:0;2189:10;26146:102;2189:10;26102:16;26189:2;26193:21;26211:2;26193:17;:21::i;:::-;26216:25;26234:6;26216:17;:25::i;:::-;26243:4;26146:20;:102::i;:::-;26261:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26261:17:0;;;;;;;;;:27;;26282:6;;26261:9;:27;;26282:6;;26261:27;:::i;:::-;;;;-1:-1:-1;;26304:52:0;;;20950:25:1;;;21006:2;20991:18;;20984:34;;;-1:-1:-1;;;;;26304:52:0;;;;26337:1;;26304:52;;;;;;20923:18:1;26304:52:0;;;;;;;26369:74;26400:8;26418:1;26422:2;26426;26430:6;26438:4;26369:30;:74::i;23490:1074::-;23717:7;:14;23703:3;:10;:28;23695:81;;;;-1:-1:-1;;;23695:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;23795:16:0;;23787:66;;;;-1:-1:-1;;;23787:66:0;;;;;;;:::i;:::-;2189:10;23910:60;2189:10;23941:4;23947:2;23951:3;23956:7;23965:4;23910:20;:60::i;:::-;23988:9;23983:421;24007:3;:10;24003:1;:14;23983:421;;;24039:10;24052:3;24056:1;24052:6;;;;;;;;:::i;:::-;;;;;;;24039:19;;24073:14;24090:7;24098:1;24090:10;;;;;;;;:::i;:::-;;;;;;;;;;;;24117:19;24139:13;;;;;;;;;;-1:-1:-1;;;;;24139:19:0;;;;;;;;;;;;24090:10;;-1:-1:-1;24181:21:0;;;;24173:76;;;;-1:-1:-1;;;24173:76:0;;;;;;;:::i;:::-;24293:9;:13;;;;;;;;;;;-1:-1:-1;;;;;24293:19:0;;;;;;;;;;24315:20;;;24293:42;;24365:17;;;;;;;:27;;24315:20;;24293:9;24365:27;;24315:20;;24365:27;:::i;:::-;;;;;;;;24024:380;;;24019:3;;;;:::i;:::-;;;23983:421;;;;24451:2;-1:-1:-1;;;;;24421:47:0;24445:4;-1:-1:-1;;;;;24421:47:0;24435:8;-1:-1:-1;;;;;24421:47:0;;24455:3;24460:7;24421:47;;;;;;;:::i;:::-;;;;;;;;24481:75;24517:8;24527:4;24533:2;24537:3;24542:7;24551:4;24481:35;:75::i;:::-;23684:880;23490:1074;;;;;:::o;28643:891::-;-1:-1:-1;;;;;28795:18:0;;28787:66;;;;-1:-1:-1;;;28787:66:0;;;;;;;:::i;:::-;28886:7;:14;28872:3;:10;:28;28864:81;;;;-1:-1:-1;;;28864:81:0;;;;;;;:::i;:::-;28958:16;2189:10;28958:31;;29002:66;29023:8;29033:4;29047:1;29051:3;29056:7;29002:66;;;;;;;;;;;;:20;:66::i;:::-;29086:9;29081:373;29105:3;:10;29101:1;:14;29081:373;;;29137:10;29150:3;29154:1;29150:6;;;;;;;;:::i;:::-;;;;;;;29137:19;;29171:14;29188:7;29196:1;29188:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29215:19;29237:13;;;;;;;;;;-1:-1:-1;;;;;29237:19:0;;;;;;;;;;;;29188:10;;-1:-1:-1;29279:21:0;;;;29271:70;;;;-1:-1:-1;;;29271:70:0;;;;;;;:::i;:::-;29385:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29385:19:0;;;;;;;;;;29407:20;;29385:42;;29117:3;;;;:::i;:::-;;;;29081:373;;;;29509:1;-1:-1:-1;;;;;29471:55:0;29495:4;-1:-1:-1;;;;;29471:55:0;29485:8;-1:-1:-1;;;;;29471:55:0;;29513:3;29518:7;29471:55;;;;;;;:::i;:::-;;;;;;;;28776:758;28643:891;;;:::o;34650:191::-;34743:6;;;-1:-1:-1;;;;;34760:17:0;;;-1:-1:-1;;;;;;34760:17:0;;;;;;;34793:40;;34743:6;;;34760:17;34743:6;;34793:40;;34724:16;;34793:40;34713:128;34650:191;:::o;27792:648::-;-1:-1:-1;;;;;27919:18:0;;27911:66;;;;-1:-1:-1;;;27911:66:0;;;;;;;:::i;:::-;2189:10;28034:102;2189:10;28065:4;27990:16;28083:21;28101:2;28083:17;:21::i;:::-;28106:25;28124:6;28106:17;:25::i;:::-;28034:102;;;;;;;;;;;;:20;:102::i;:::-;28149:19;28171:13;;;;;;;;;;;-1:-1:-1;;;;;28171:19:0;;;;;;;;;;28209:21;;;;28201:70;;;;-1:-1:-1;;;28201:70:0;;;;;;;:::i;:::-;28307:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28307:19:0;;;;;;;;;;;;28329:20;;;28307:42;;28378:54;;20950:25:1;;;20991:18;;;20984:34;;;28307:19:0;;28378:54;;;;;;20923:18:1;28378:54:0;;;;;;;27900:540;;27792:648;;;:::o;29676:331::-;29831:8;-1:-1:-1;;;;;29822:17:0;:5;-1:-1:-1;;;;;29822:17:0;;;29814:71;;;;-1:-1:-1;;;29814:71:0;;23736:2:1;29814:71:0;;;23718:21:1;23775:2;23755:18;;;23748:30;23814:34;23794:18;;;23787:62;-1:-1:-1;;;23865:18:1;;;23858:39;23914:19;;29814:71:0;23534:405:1;29814:71:0;-1:-1:-1;;;;;29896:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;29896:46:0;;;;;;;;;;29958:41;;1159::1;;;29958::0;;1132:18:1;29958:41:0;;;;;;;29676:331;;;:::o;22312:820::-;-1:-1:-1;;;;;22500:16:0;;22492:66;;;;-1:-1:-1;;;22492:66:0;;;;;;;:::i;:::-;2189:10;22615:96;2189:10;22646:4;22652:2;22656:21;22674:2;22656:17;:21::i;22615:96::-;22724:19;22746:13;;;;;;;;;;;-1:-1:-1;;;;;22746:19:0;;;;;;;;;;22784:21;;;;22776:76;;;;-1:-1:-1;;;22776:76:0;;;;;;;:::i;:::-;22888:9;:13;;;;;;;;;;;-1:-1:-1;;;;;22888:19:0;;;;;;;;;;22910:20;;;22888:42;;22952:17;;;;;;;:27;;22910:20;;22888:9;22952:27;;22910:20;;22952:27;:::i;:::-;;;;-1:-1:-1;;22997:46:0;;;20950:25:1;;;21006:2;20991:18;;20984:34;;;-1:-1:-1;;;;;22997:46:0;;;;;;;;;;;;;;20923:18:1;22997:46:0;;;;;;;23056:68;23087:8;23097:4;23103:2;23107;23111:6;23119:4;23056:30;:68::i;:::-;22481:651;;22312:820;;;;;:::o;32765:198::-;32885:16;;;32899:1;32885:16;;;;;;;;;32831;;32860:22;;32885:16;;;;;;;;;;;;-1:-1:-1;32885:16:0;32860:41;;32923:7;32912:5;32918:1;32912:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;32950:5;32765:198;-1:-1:-1;;32765:198:0:o;43202:267::-;43395:66;43422:8;43432:4;43438:2;43442:3;43447:7;43456:4;43395:26;:66::i;31192:744::-;-1:-1:-1;;;;;31407:13:0;;3624:19;:23;31403:526;;31443:72;;-1:-1:-1;;;31443:72:0;;-1:-1:-1;;;;;31443:38:0;;;;;:72;;31482:8;;31492:4;;31498:2;;31502:6;;31510:4;;31443:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31443:72:0;;;;;;;;-1:-1:-1;;31443:72:0;;;;;;;;;;;;:::i;:::-;;;31439:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;31791:6;31784:14;;-1:-1:-1;;;31784:14:0;;;;;;;;:::i;31439:479::-;;;31840:62;;-1:-1:-1;;;31840:62:0;;25837:2:1;31840:62:0;;;25819:21:1;25876:2;25856:18;;;25849:30;25915:34;25895:18;;;25888:62;-1:-1:-1;;;25966:18:1;;;25959:50;26026:19;;31840:62:0;25635:416:1;31439:479:0;-1:-1:-1;;;;;;31565:55:0;;-1:-1:-1;;;31565:55:0;31561:154;;31645:50;;-1:-1:-1;;;31645:50:0;;;;;;;:::i;31944:813::-;-1:-1:-1;;;;;32184:13:0;;3624:19;:23;32180:570;;32220:79;;-1:-1:-1;;;32220:79:0;;-1:-1:-1;;;;;32220:43:0;;;;;:79;;32264:8;;32274:4;;32280:3;;32285:7;;32294:4;;32220:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32220:79:0;;;;;;;;-1:-1:-1;;32220:79:0;;;;;;;;;;;;:::i;:::-;;;32216:523;;;;:::i;:::-;-1:-1:-1;;;;;;32381:60:0;;-1:-1:-1;;;32381:60:0;32377:159;;32466:50;;-1:-1:-1;;;32466:50:0;;;;;;;:::i;36174:655::-;-1:-1:-1;;;;;36496:18:0;;36492:160;;36536:9;36531:110;36555:3;:10;36551:1;:14;36531:110;;;36615:7;36623:1;36615:10;;;;;;;;:::i;:::-;;;;;;;36591:12;:20;36604:3;36608:1;36604:6;;;;;;;;:::i;:::-;;;;;;;36591:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;36567:3:0;;-1:-1:-1;36567:3:0;;:::i;:::-;;;36531:110;;;;36492:160;-1:-1:-1;;;;;36668:16:0;;36664:158;;36706:9;36701:110;36725:3;:10;36721:1;:14;36701:110;;;36785:7;36793:1;36785:10;;;;;;;;:::i;:::-;;;;;;;36761:12;:20;36774:3;36778:1;36774:6;;;;;;;;:::i;:::-;;;;;;;36761:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;36737:3:0;;-1:-1:-1;36737:3:0;;:::i;:::-;;;36701:110;;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:1:o;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;1488:18;1473:34;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:469::-;1662:5;1696:18;1688:6;1685:30;1682:56;;;1718:18;;:::i;:::-;1767:2;1761:9;1779:69;1836:2;1815:15;;-1:-1:-1;;1811:29:1;1842:4;1807:40;1761:9;1779:69;:::i;:::-;1866:6;1857:15;;1896:6;1888;1881:22;1936:3;1927:6;1922:3;1918:16;1915:25;1912:45;;;1953:1;1950;1943:12;1912:45;2003:6;1998:3;1991:4;1983:6;1979:17;1966:44;2058:1;2051:4;2042:6;2034;2030:19;2026:30;2019:41;;1597:469;;;;;:::o;2071:451::-;2140:6;2193:2;2181:9;2172:7;2168:23;2164:32;2161:52;;;2209:1;2206;2199:12;2161:52;2249:9;2236:23;2282:18;2274:6;2271:30;2268:50;;;2314:1;2311;2304:12;2268:50;2337:22;;2390:4;2382:13;;2378:27;-1:-1:-1;2368:55:1;;2419:1;2416;2409:12;2368:55;2442:74;2508:7;2503:2;2490:16;2485:2;2481;2477:11;2442:74;:::i;2527:258::-;2599:1;2609:113;2623:6;2620:1;2617:13;2609:113;;;2699:11;;;2693:18;2680:11;;;2673:39;2645:2;2638:10;2609:113;;;2740:6;2737:1;2734:13;2731:48;;;2775:1;2766:6;2761:3;2757:16;2750:27;2731:48;;2527:258;;;:::o;2790:269::-;2843:3;2881:5;2875:12;2908:6;2903:3;2896:19;2924:63;2980:6;2973:4;2968:3;2964:14;2957:4;2950:5;2946:16;2924:63;:::i;:::-;3041:2;3020:15;-1:-1:-1;;3016:29:1;3007:39;;;;3048:4;3003:50;;2790:269;-1:-1:-1;;2790:269:1:o;3064:231::-;3213:2;3202:9;3195:21;3176:4;3233:56;3285:2;3274:9;3270:18;3262:6;3233:56;:::i;3300:180::-;3359:6;3412:2;3400:9;3391:7;3387:23;3383:32;3380:52;;;3428:1;3425;3418:12;3380:52;-1:-1:-1;3451:23:1;;3300:180;-1:-1:-1;3300:180:1:o;3485:322::-;3562:6;3570;3578;3631:2;3619:9;3610:7;3606:23;3602:32;3599:52;;;3647:1;3644;3637:12;3599:52;3670:29;3689:9;3670:29;:::i;:::-;3660:39;3746:2;3731:18;;3718:32;;-1:-1:-1;3797:2:1;3782:18;;;3769:32;;3485:322;-1:-1:-1;;;3485:322:1:o;3812:248::-;3880:6;3888;3941:2;3929:9;3920:7;3916:23;3912:32;3909:52;;;3957:1;3954;3947:12;3909:52;-1:-1:-1;;3980:23:1;;;4050:2;4035:18;;;4022:32;;-1:-1:-1;3812:248:1:o;4065:183::-;4125:4;4158:18;4150:6;4147:30;4144:56;;;4180:18;;:::i;:::-;-1:-1:-1;4225:1:1;4221:14;4237:4;4217:25;;4065:183::o;4253:724::-;4307:5;4360:3;4353:4;4345:6;4341:17;4337:27;4327:55;;4378:1;4375;4368:12;4327:55;4414:6;4401:20;4440:4;4463:43;4503:2;4463:43;:::i;:::-;4535:2;4529:9;4547:31;4575:2;4567:6;4547:31;:::i;:::-;4613:18;;;4705:1;4701:10;;;;4689:23;;4685:32;;;4647:15;;;;-1:-1:-1;4729:15:1;;;4726:35;;;4757:1;4754;4747:12;4726:35;4793:2;4785:6;4781:15;4805:142;4821:6;4816:3;4813:15;4805:142;;;4887:17;;4875:30;;4925:12;;;;4838;;4805:142;;;-1:-1:-1;4965:6:1;4253:724;-1:-1:-1;;;;;;4253:724:1:o;4982:221::-;5024:5;5077:3;5070:4;5062:6;5058:17;5054:27;5044:55;;5095:1;5092;5085:12;5044:55;5117:80;5193:3;5184:6;5171:20;5164:4;5156:6;5152:17;5117:80;:::i;5208:943::-;5362:6;5370;5378;5386;5394;5447:3;5435:9;5426:7;5422:23;5418:33;5415:53;;;5464:1;5461;5454:12;5415:53;5487:29;5506:9;5487:29;:::i;:::-;5477:39;;5535:38;5569:2;5558:9;5554:18;5535:38;:::i;:::-;5525:48;;5624:2;5613:9;5609:18;5596:32;5647:18;5688:2;5680:6;5677:14;5674:34;;;5704:1;5701;5694:12;5674:34;5727:61;5780:7;5771:6;5760:9;5756:22;5727:61;:::i;:::-;5717:71;;5841:2;5830:9;5826:18;5813:32;5797:48;;5870:2;5860:8;5857:16;5854:36;;;5886:1;5883;5876:12;5854:36;5909:63;5964:7;5953:8;5942:9;5938:24;5909:63;:::i;:::-;5899:73;;6025:3;6014:9;6010:19;5997:33;5981:49;;6055:2;6045:8;6042:16;6039:36;;;6071:1;6068;6061:12;6039:36;;6094:51;6137:7;6126:8;6115:9;6111:24;6094:51;:::i;:::-;6084:61;;;5208:943;;;;;;;;:::o;6156:1208::-;6274:6;6282;6335:2;6323:9;6314:7;6310:23;6306:32;6303:52;;;6351:1;6348;6341:12;6303:52;6391:9;6378:23;6420:18;6461:2;6453:6;6450:14;6447:34;;;6477:1;6474;6467:12;6447:34;6515:6;6504:9;6500:22;6490:32;;6560:7;6553:4;6549:2;6545:13;6541:27;6531:55;;6582:1;6579;6572:12;6531:55;6618:2;6605:16;6640:4;6663:43;6703:2;6663:43;:::i;:::-;6735:2;6729:9;6747:31;6775:2;6767:6;6747:31;:::i;:::-;6813:18;;;6901:1;6897:10;;;;6889:19;;6885:28;;;6847:15;;;;-1:-1:-1;6925:19:1;;;6922:39;;;6957:1;6954;6947:12;6922:39;6981:11;;;;7001:148;7017:6;7012:3;7009:15;7001:148;;;7083:23;7102:3;7083:23;:::i;:::-;7071:36;;7034:12;;;;7127;;;;7001:148;;;7168:6;-1:-1:-1;;7212:18:1;;7199:32;;-1:-1:-1;;7243:16:1;;;7240:36;;;7272:1;7269;7262:12;7240:36;;7295:63;7350:7;7339:8;7328:9;7324:24;7295:63;:::i;:::-;7285:73;;;6156:1208;;;;;:::o;7369:435::-;7422:3;7460:5;7454:12;7487:6;7482:3;7475:19;7513:4;7542:2;7537:3;7533:12;7526:19;;7579:2;7572:5;7568:14;7600:1;7610:169;7624:6;7621:1;7618:13;7610:169;;;7685:13;;7673:26;;7719:12;;;;7754:15;;;;7646:1;7639:9;7610:169;;;-1:-1:-1;7795:3:1;;7369:435;-1:-1:-1;;;;;7369:435:1:o;7809:261::-;7988:2;7977:9;7970:21;7951:4;8008:56;8060:2;8049:9;8045:18;8037:6;8008:56;:::i;8283:669::-;8410:6;8418;8426;8479:2;8467:9;8458:7;8454:23;8450:32;8447:52;;;8495:1;8492;8485:12;8447:52;8518:29;8537:9;8518:29;:::i;:::-;8508:39;;8598:2;8587:9;8583:18;8570:32;8621:18;8662:2;8654:6;8651:14;8648:34;;;8678:1;8675;8668:12;8648:34;8701:61;8754:7;8745:6;8734:9;8730:22;8701:61;:::i;:::-;8691:71;;8815:2;8804:9;8800:18;8787:32;8771:48;;8844:2;8834:8;8831:16;8828:36;;;8860:1;8857;8850:12;8828:36;;8883:63;8938:7;8927:8;8916:9;8912:24;8883:63;:::i;:::-;8873:73;;;8283:669;;;;;:::o;8957:118::-;9043:5;9036:13;9029:21;9022:5;9019:32;9009:60;;9065:1;9062;9055:12;9080:315;9145:6;9153;9206:2;9194:9;9185:7;9181:23;9177:32;9174:52;;;9222:1;9219;9212:12;9174:52;9245:29;9264:9;9245:29;:::i;:::-;9235:39;;9324:2;9313:9;9309:18;9296:32;9337:28;9359:5;9337:28;:::i;:::-;9384:5;9374:15;;;9080:315;;;;;:::o;9400:260::-;9468:6;9476;9529:2;9517:9;9508:7;9504:23;9500:32;9497:52;;;9545:1;9542;9535:12;9497:52;9568:29;9587:9;9568:29;:::i;:::-;9558:39;;9616:38;9650:2;9639:9;9635:18;9616:38;:::i;:::-;9606:48;;9400:260;;;;;:::o;9665:606::-;9769:6;9777;9785;9793;9801;9854:3;9842:9;9833:7;9829:23;9825:33;9822:53;;;9871:1;9868;9861:12;9822:53;9894:29;9913:9;9894:29;:::i;:::-;9884:39;;9942:38;9976:2;9965:9;9961:18;9942:38;:::i;:::-;9932:48;;10027:2;10016:9;10012:18;9999:32;9989:42;;10078:2;10067:9;10063:18;10050:32;10040:42;;10133:3;10122:9;10118:19;10105:33;10161:18;10153:6;10150:30;10147:50;;;10193:1;10190;10183:12;10147:50;10216:49;10257:7;10248:6;10237:9;10233:22;10216:49;:::i;10276:186::-;10335:6;10388:2;10376:9;10367:7;10363:23;10359:32;10356:52;;;10404:1;10401;10394:12;10356:52;10427:29;10446:9;10427:29;:::i;10879:356::-;11081:2;11063:21;;;11100:18;;;11093:30;11159:34;11154:2;11139:18;;11132:62;11226:2;11211:18;;10879:356::o;11240:380::-;11319:1;11315:12;;;;11362;;;11383:61;;11437:4;11429:6;11425:17;11415:27;;11383:61;11490:2;11482:6;11479:14;11459:18;11456:38;11453:161;;;11536:10;11531:3;11527:20;11524:1;11517:31;11571:4;11568:1;11561:15;11599:4;11596:1;11589:15;11453:161;;11240:380;;;:::o;11751:185::-;11793:3;11831:5;11825:12;11846:52;11891:6;11886:3;11879:4;11872:5;11868:16;11846:52;:::i;:::-;11914:16;;;;;11751:185;-1:-1:-1;;11751:185:1:o;12059:1301::-;12336:3;12365:1;12398:6;12392:13;12428:3;12450:1;12478:9;12474:2;12470:18;12460:28;;12538:2;12527:9;12523:18;12560;12550:61;;12604:4;12596:6;12592:17;12582:27;;12550:61;12630:2;12678;12670:6;12667:14;12647:18;12644:38;12641:165;;;-1:-1:-1;;;12705:33:1;;12761:4;12758:1;12751:15;12791:4;12712:3;12779:17;12641:165;12822:18;12849:104;;;;12967:1;12962:320;;;;12815:467;;12849:104;-1:-1:-1;;12882:24:1;;12870:37;;12927:16;;;;-1:-1:-1;12849:104:1;;12962:320;11698:1;11691:14;;;11735:4;11722:18;;13057:1;13071:165;13085:6;13082:1;13079:13;13071:165;;;13163:14;;13150:11;;;13143:35;13206:16;;;;13100:10;;13071:165;;;13075:3;;13265:6;13260:3;13256:16;13249:23;;12815:467;;;;;;;13298:56;13323:30;13349:3;13341:6;13323:30;:::i;:::-;-1:-1:-1;;;12001:20:1;;12046:1;12037:11;;11941:113;13298:56;13291:63;12059:1301;-1:-1:-1;;;;;12059:1301:1:o;13365:341::-;13567:2;13549:21;;;13606:2;13586:18;;;13579:30;-1:-1:-1;;;13640:2:1;13625:18;;13618:47;13697:2;13682:18;;13365:341::o;14393:127::-;14454:10;14449:3;14445:20;14442:1;14435:31;14485:4;14482:1;14475:15;14509:4;14506:1;14499:15;14525:128;14565:3;14596:1;14592:6;14589:1;14586:13;14583:39;;;14602:18;;:::i;:::-;-1:-1:-1;14638:9:1;;14525:128::o;15006:135::-;15045:3;-1:-1:-1;;15066:17:1;;15063:43;;;15086:18;;:::i;:::-;-1:-1:-1;15133:1:1;15122:13;;15006:135::o;15146:168::-;15186:7;15252:1;15248;15244:6;15240:14;15237:1;15234:21;15229:1;15222:9;15215:17;15211:45;15208:71;;;15259:18;;:::i;:::-;-1:-1:-1;15299:9:1;;15146:168::o;15699:245::-;15766:6;15819:2;15807:9;15798:7;15794:23;15790:32;15787:52;;;15835:1;15832;15825:12;15787:52;15867:9;15861:16;15886:28;15908:5;15886:28;:::i;16778:127::-;16839:10;16834:3;16830:20;16827:1;16820:31;16870:4;16867:1;16860:15;16894:4;16891:1;16884:15;16910:405;17112:2;17094:21;;;17151:2;17131:18;;;17124:30;17190:34;17185:2;17170:18;;17163:62;-1:-1:-1;;;17256:2:1;17241:18;;17234:39;17305:3;17290:19;;16910:405::o;17656:125::-;17696:4;17724:1;17721;17718:8;17715:34;;;17729:18;;:::i;:::-;-1:-1:-1;17766:9:1;;17656:125::o;20000:127::-;20061:10;20056:3;20052:20;20049:1;20042:31;20092:4;20089:1;20082:15;20116:4;20113:1;20106:15;20132:120;20172:1;20198;20188:35;;20203:18;;:::i;:::-;-1:-1:-1;20237:9:1;;20132:120::o;20257:112::-;20289:1;20315;20305:35;;20320:18;;:::i;:::-;-1:-1:-1;20354:9:1;;20257:112::o;21029:404::-;21231:2;21213:21;;;21270:2;21250:18;;;21243:30;21309:34;21304:2;21289:18;;21282:62;-1:-1:-1;;;21375:2:1;21360:18;;21353:38;21423:3;21408:19;;21029:404::o;21438:401::-;21640:2;21622:21;;;21679:2;21659:18;;;21652:30;21718:34;21713:2;21698:18;;21691:62;-1:-1:-1;;;21784:2:1;21769:18;;21762:35;21829:3;21814:19;;21438:401::o;21844:406::-;22046:2;22028:21;;;22085:2;22065:18;;;22058:30;22124:34;22119:2;22104:18;;22097:62;-1:-1:-1;;;22190:2:1;22175:18;;22168:40;22240:3;22225:19;;21844:406::o;22255:465::-;22512:2;22501:9;22494:21;22475:4;22538:56;22590:2;22579:9;22575:18;22567:6;22538:56;:::i;:::-;22642:9;22634:6;22630:22;22625:2;22614:9;22610:18;22603:50;22670:44;22707:6;22699;22670:44;:::i;22725:399::-;22927:2;22909:21;;;22966:2;22946:18;;;22939:30;23005:34;23000:2;22985:18;;22978:62;-1:-1:-1;;;23071:2:1;23056:18;;23049:33;23114:3;23099:19;;22725:399::o;23129:400::-;23331:2;23313:21;;;23370:2;23350:18;;;23343:30;23409:34;23404:2;23389:18;;23382:62;-1:-1:-1;;;23475:2:1;23460:18;;23453:34;23519:3;23504:19;;23129:400::o;23944:572::-;-1:-1:-1;;;;;24241:15:1;;;24223:34;;24293:15;;24288:2;24273:18;;24266:43;24340:2;24325:18;;24318:34;;;24383:2;24368:18;;24361:34;;;24203:3;24426;24411:19;;24404:32;;;24166:4;;24453:57;;24490:19;;24482:6;24453:57;:::i;:::-;24445:65;23944:572;-1:-1:-1;;;;;;;23944:572:1:o;24521:249::-;24590:6;24643:2;24631:9;24622:7;24618:23;24614:32;24611:52;;;24659:1;24656;24649:12;24611:52;24691:9;24685:16;24710:30;24734:5;24710:30;:::i;24775:179::-;24810:3;24852:1;24834:16;24831:23;24828:120;;;24898:1;24895;24892;24877:23;-1:-1:-1;24935:1:1;24929:8;24924:3;24920:18;24828:120;24775:179;:::o;24959:671::-;24998:3;25040:4;25022:16;25019:26;25016:39;;;24959:671;:::o;25016:39::-;25082:2;25076:9;-1:-1:-1;;25147:16:1;25143:25;;25140:1;25076:9;25119:50;25198:4;25192:11;25222:16;25257:18;25328:2;25321:4;25313:6;25309:17;25306:25;25301:2;25293:6;25290:14;25287:45;25284:58;;;25335:5;;;;;24959:671;:::o;25284:58::-;25372:6;25366:4;25362:17;25351:28;;25408:3;25402:10;25435:2;25427:6;25424:14;25421:27;;;25441:5;;;;;;24959:671;:::o;25421:27::-;25525:2;25506:16;25500:4;25496:27;25492:36;25485:4;25476:6;25471:3;25467:16;25463:27;25460:69;25457:82;;;25532:5;;;;;;24959:671;:::o;25457:82::-;25548:57;25599:4;25590:6;25582;25578:19;25574:30;25568:4;25548:57;:::i;:::-;-1:-1:-1;25621:3:1;;24959:671;-1:-1:-1;;;;;24959:671:1:o;26056:404::-;26258:2;26240:21;;;26297:2;26277:18;;;26270:30;26336:34;26331:2;26316:18;;26309:62;-1:-1:-1;;;26402:2:1;26387:18;;26380:38;26450:3;26435:19;;26056:404::o;26465:838::-;-1:-1:-1;;;;;26862:15:1;;;26844:34;;26914:15;;26909:2;26894:18;;26887:43;26824:3;26961:2;26946:18;;26939:31;;;26787:4;;26993:57;;27030:19;;27022:6;26993:57;:::i;:::-;27098:9;27090:6;27086:22;27081:2;27070:9;27066:18;27059:50;27132:44;27169:6;27161;27132:44;:::i;:::-;27118:58;;27225:9;27217:6;27213:22;27207:3;27196:9;27192:19;27185:51;27253:44;27290:6;27282;27253:44;:::i;:::-;27245:52;26465:838;-1:-1:-1;;;;;;;;26465:838:1:o

Swarm Source

ipfs://6832e44a6f68e988b4ea3bb9b5a517f34234758bce24cd54c0b6f183822ca931
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.