Mumbai Testnet

Token

CropBytes ()
ERC-1155

Overview

Max Total Supply

0

Holders

3,744

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
0x6ec064bfac03f82fa8d4f6649062c46eadc1b058
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
CropBytes

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at mumbai.polygonscan.com on 2023-04-24
*/

/**
 *Submitted for verification at polygonscan.com on 2023-03-14
*/

pragma solidity ^0.8.4;


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

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)
/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
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;
}

// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)
/**
 * @dev _Available since v3.1._
 */
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);
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)
/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
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);
}

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)
/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
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 id) public view virtual override returns (string memory) {
        return string(
            abi.encodePacked(
                _uri,
                Strings.toString(id),
                ".json"
            )
        );
    }

    /**
     * @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: address zero is not a valid owner");
        return _balanceOf(account, id);
    }

    function _balanceOf(address account, uint256 id) internal view virtual returns(uint256) {
        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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, 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);

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

        _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);

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

        _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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

        _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);

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

        _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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after 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 _afterTokenTransfer(
        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;
    }
}

// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)
/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleOwnerChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleOwner(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol)
/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 ownerRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant OWNER_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleOwner(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].ownerRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleOwner(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleOwner(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `ownerRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleOwner(bytes32 role, bytes32 ownerRole) internal virtual {
        bytes32 previousownerRole = getRoleOwner(role);
        _roles[role].ownerRole = ownerRole;
        emit RoleOwnerChanged(role, previousownerRole, ownerRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)
/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)
/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
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);
    }
}

// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)
/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
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) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)
/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Locking is ERC1155, AccessControl {

    mapping(address => bool) private _locks;

    mapping(address => bool) private _permanentLocks;

    bytes32 private constant ADMIN_ROLE = keccak256("ADMIN_ROLE");

    event Lock(address indexed account);
    event Unlock(address indexed account);
    event PermanentLock(address indexed account);
    event PermanentUnlock(address indexed account);

    function _lock(address account) internal virtual
    {
      _locks[account] = true;
      emit Lock(account);
    }

    function _unlock(address account) internal virtual
    {
      _locks[account] = false;
      emit Unlock(account);
    }

    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, AccessControl) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function _lockPermanent(address account) internal virtual
    {
      _permanentLocks[account] = true;
      emit PermanentLock(account);
    }

    function _unlockPermanent(address account) internal virtual
    {
      _permanentLocks[account] = false;
      emit PermanentUnlock(account);
    }

    function getLock(address account) external view returns(bool)
    {
      return _locks[account];
    }

    function _hasLock(address account) internal virtual view returns(bool)
    {
      return _locks[account];
    }

    function getPermanentLock(address account) external view returns(bool)
    {
      return _permanentLocks[account];
    }

    function _hasPermanentLock(address account) internal virtual view returns(bool)
    {
      return _permanentLocks[account];
    }

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

        require(_locks[from] == false || hasRole(ADMIN_ROLE, _msgSender()), "ERC1155: Account is Locked");
        require(_permanentLocks[from] == false, "ERC1155: Account is permanently Locked");
    }
}

contract CropBytes is ERC1155, AccessControl, Pausable, ERC1155Burnable, ERC1155Supply, ERC1155Locking {
    bytes32 private constant ADMIN_ROLE = keccak256("ADMIN_ROLE");
    bytes32 private constant MINTER_ROLE = keccak256("MINTER_ROLE");
    string public name = "CropBytes";
    string private _contractUri = "https://blockchain.ethernia.com/metadata/contract-metadata";

    constructor() ERC1155("https://testnet.ethernia.com/blockchain/") {
        _grantRole(OWNER_ROLE, msg.sender);
        _grantRole(ADMIN_ROLE, msg.sender);
        _grantRole(MINTER_ROLE, msg.sender);
    }

    function setURI(string memory newuri) public onlyRole(ADMIN_ROLE) {
        _setURI(newuri);
    }

    function pause() public onlyRole(OWNER_ROLE) {
        _pause();
    }

    function updateContractURI(string memory uri) public onlyRole(ADMIN_ROLE) {
        _contractUri = uri;
    }

    function contractURI() public view returns (string memory) {
        return _contractUri;
    }

    function unpause() public onlyRole(OWNER_ROLE) {
        _unpause();
    }

    //The function will mint assets
    //Once an asset is minted, it cannot be called again for the same asset
    function mint(address account, uint256 id, uint256 amount, bytes memory data)
        public
        onlyRole(MINTER_ROLE)
    {
        _mint(account, id, amount, data);
    }

    //The function will mint assets in batch
    //Once an asset is minted, it cannot be called again for the same asset
    function mintBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
        onlyRole(MINTER_ROLE)
    {
        _mintBatch(to, ids, amounts, data);
    }

    //Transfer directly from senders address to "to" address
    function transfer(address to, uint256 id, uint256 amount, bytes memory data)
        public
    {
        address owner = _msgSender();
        _safeTransferFrom(owner, to, id, amount, data);
    }

    //Batch transfer from sender address to "to" aoddress
    function transferBatch(address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
        public
    {
        address owner = _msgSender();
        _safeBatchTransferFrom(owner, to, ids, amounts, data);
    }

    //The function locks the user assets from preventing further transfer. Only admin role can call this function
    function permanentLock(address account)
        public
        onlyRole(ADMIN_ROLE)
    {
        _lockPermanent(account);
    }

    //The function unlocks the user assets.
    function permanentUnlock(address account)
        public
        onlyRole(ADMIN_ROLE)
    {
        _unlockPermanent(account);
    }

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

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC1155, AccessControl, ERC1155Locking)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
}

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":"account","type":"address"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PermanentLock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"PermanentUnlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleOwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"account","type":"address"}],"name":"getLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getPermanentLock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleOwner","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"permanentLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"permanentUnlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"transfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"transferBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"updateContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040526040518060400160405280600981526020017f43726f7042797465730000000000000000000000000000000000000000000000815250600890816200004a91906200053e565b506040518060600160405280603a815260200162005b5c603a9139600990816200007591906200053e565b503480156200008357600080fd5b5060405180606001604052806028815260200162005b3460289139620000af816200014a60201b60201c565b506000600460006101000a81548160ff021916908315150217905550620000e06000801b336200015f60201b60201c565b620001127fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775336200015f60201b60201c565b620001447f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200015f60201b60201c565b62000625565b80600290816200015b91906200053e565b5050565b6200017182826200025160201b60201c565b6200024d5760016003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001f2620002bc60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034657607f821691505b6020821081036200035c576200035b620002fe565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003c67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000387565b620003d2868362000387565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200041f620004196200041384620003ea565b620003f4565b620003ea565b9050919050565b6000819050919050565b6200043b83620003fe565b620004536200044a8262000426565b84845462000394565b825550505050565b600090565b6200046a6200045b565b6200047781848462000430565b505050565b5b818110156200049f576200049360008262000460565b6001810190506200047d565b5050565b601f821115620004ee57620004b88162000362565b620004c38462000377565b81016020851015620004d3578190505b620004eb620004e28562000377565b8301826200047c565b50505b505050565b600082821c905092915050565b60006200051360001984600802620004f3565b1980831691505092915050565b60006200052e838362000500565b9150826002028217905092915050565b6200054982620002c4565b67ffffffffffffffff811115620005655762000564620002cf565b5b6200057182546200032d565b6200057e828285620004a3565b600060209050601f831160018114620005b65760008415620005a1578287015190505b620005ad858262000520565b8655506200061d565b601f198416620005c68662000362565b60005b82811015620005f057848901518255600182019150602085019450602081019050620005c9565b868310156200061057848901516200060c601f89168262000500565b8355505b6001600288020188555050505b505050505050565b6154ff80620006356000396000f3fe608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636b9db4e61161011a578063d547741f116100ad578063e8a3d4851161007c578063e8a3d485146105a5578063e985e9c5146105c3578063eb1fe5a7146105f3578063f242432a14610623578063f5298aca1461063f576101fa565b8063d547741f1461051f578063dabd76e91461053b578063e386880d14610557578063e58378bb14610587576101fa565b806391d14854116100e957806391d1485414610487578063a22cb465146104b7578063a5f13076146104d3578063bd85b039146104ef576101fa565b80636b9db4e614610415578063731133e9146104455780637e5b1e24146104615780638456cb591461047d576101fa565b80632f2ff15d116101925780634f558e79116101615780634f558e791461038f5780635c975abb146103bf57806362bed1e5146103dd5780636b20c454146103f9576101fa565b80632f2ff15d1461031d57806336568abe146103395780633f4ba83a146103555780634e1273f41461035f576101fa565b80630e89341c116101ce5780630e89341c1461029957806317fefc03146102c95780631f7fdffa146102e55780632eb2c2d614610301576101fa565b8062fdd58e146101ff57806301ffc9a71461022f57806302fe53051461025f57806306fdde031461027b575b600080fd5b61021960048036038101906102149190613435565b61065b565b6040516102269190613484565b60405180910390f35b610249600480360381019061024491906134f7565b6106dd565b604051610256919061353f565b60405180910390f35b610279600480360381019061027491906136a0565b6106ef565b005b610283610726565b6040516102909190613768565b60405180910390f35b6102b360048036038101906102ae919061378a565b6107b4565b6040516102c09190613768565b60405180910390f35b6102e360048036038101906102de91906137b7565b6107e8565b005b6102ff60048036038101906102fa919061394d565b61081f565b005b61031b60048036038101906103169190613a08565b61085c565b005b61033760048036038101906103329190613b0d565b6108fd565b005b610353600480360381019061034e9190613b0d565b61091e565b005b61035d6109a1565b005b61037960048036038101906103749190613c10565b6109b9565b6040516103869190613d46565b60405180910390f35b6103a960048036038101906103a4919061378a565b610ad2565b6040516103b6919061353f565b60405180910390f35b6103c7610ae6565b6040516103d4919061353f565b60405180910390f35b6103f760048036038101906103f291906137b7565b610afd565b005b610413600480360381019061040e9190613d68565b610b34565b005b61042f600480360381019061042a91906137b7565b610bd1565b60405161043c919061353f565b60405180910390f35b61045f600480360381019061045a9190613df3565b610c27565b005b61047b600480360381019061047691906136a0565b610c64565b005b610485610ca2565b005b6104a1600480360381019061049c9190613b0d565b610cba565b6040516104ae919061353f565b60405180910390f35b6104d160048036038101906104cc9190613ea2565b610d25565b005b6104ed60048036038101906104e8919061394d565b610d3b565b005b6105096004803603810190610504919061378a565b610d5b565b6040516105169190613484565b60405180910390f35b61053960048036038101906105349190613b0d565b610d78565b005b61055560048036038101906105509190613df3565b610d99565b005b610571600480360381019061056c9190613ee2565b610db9565b60405161057e9190613f1e565b60405180910390f35b61058f610dd9565b60405161059c9190613f1e565b60405180910390f35b6105ad610de0565b6040516105ba9190613768565b60405180910390f35b6105dd60048036038101906105d89190613f39565b610e72565b6040516105ea919061353f565b60405180910390f35b61060d600480360381019061060891906137b7565b610f06565b60405161061a919061353f565b60405180910390f35b61063d60048036038101906106389190613f79565b610f5c565b005b61065960048036038101906106549190614010565b610ffd565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c2906140d5565b60405180910390fd5b6106d5838361109a565b905092915050565b60006106e8826110f4565b9050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561071981611106565b6107228261111a565b5050565b6008805461073390614124565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90614124565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b505050505081565b606060026107c18361112d565b6040516020016107d2929190614275565b6040516020818303038152906040529050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561081281611106565b61081b8261128d565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661084981611106565b6108558585858561132b565b5050505050565b610864611557565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806108aa57506108a9856108a4611557565b610e72565b5b6108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090614316565b60405180910390fd5b6108f6858585858561155f565b5050505050565b61090682610db9565b61090f81611106565b6109198383611880565b505050565b610926611557565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a906143a8565b60405180910390fd5b61099d8282611961565b5050565b6000801b6109ae81611106565b6109b6611a43565b50565b606081518351146109ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f69061443a565b60405180910390fd5b6000835167ffffffffffffffff811115610a1c57610a1b613575565b5b604051908082528060200260200182016040528015610a4a5781602001602082028036833780820191505090505b50905060005b8451811015610ac757610a97858281518110610a6f57610a6e61445a565b5b6020026020010151858381518110610a8a57610a8961445a565b5b602002602001015161065b565b828281518110610aaa57610aa961445a565b5b60200260200101818152505080610ac0906144b8565b9050610a50565b508091505092915050565b600080610ade83610d5b565b119050919050565b6000600460009054906101000a900460ff16905090565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610b2781611106565b610b3082611ae5565b5050565b610b3c611557565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610b825750610b8183610b7c611557565b610e72565b5b610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614572565b60405180910390fd5b610bcc838383611b83565b505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c5181611106565b610c5d85858585611e51565b5050505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610c8e81611106565b8160099081610c9d9190614729565b505050565b6000801b610caf81611106565b610cb7612001565b50565b60006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d37610d30611557565b83836120a4565b5050565b6000610d45611557565b9050610d54818686868661155f565b5050505050565b600060056000838152602001908152602001600020549050919050565b610d8182610db9565b610d8a81611106565b610d948383611961565b505050565b6000610da3611557565b9050610db28186868686612210565b5050505050565b600060036000838152602001908152602001600020600101549050919050565b6000801b81565b606060098054610def90614124565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1b90614124565b8015610e685780601f10610e3d57610100808354040283529160200191610e68565b820191906000526020600020905b815481529060010190602001808311610e4b57829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f64611557565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610faa5750610fa985610fa4611557565b610e72565b5b610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090614572565b60405180910390fd5b610ff68585858585612210565b5050505050565b611005611557565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061104b575061104a83611045611557565b610e72565b5b61108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190614572565b60405180910390fd5b6110958383836124ab565b505050565b600080600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006110ff826126f1565b9050919050565b61111781611112611557565b61276b565b50565b80600290816111299190614729565b5050565b606060008203611174576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611288565b600082905060005b600082146111a657808061118f906144b8565b915050600a8261119f919061482a565b915061117c565b60008167ffffffffffffffff8111156111c2576111c1613575565b5b6040519080825280601f01601f1916602001820160405280156111f45781602001600182028036833780820191505090505b5090505b600085146112815760018261120d919061485b565b9150600a8561121c919061488f565b603061122891906148c0565b60f81b81838151811061123e5761123d61445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561127a919061482a565b94506111f8565b8093505050505b919050565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f11442fe37fe2300ecf19dce69a0cf2a40cb10d15b1bb4dce3bb2f130ab1a7d5760405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614966565b60405180910390fd5b81518351146113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d5906149f8565b60405180910390fd5b60006113e8611557565b90506113f981600087878787612808565b60005b84518110156114b2578381815181106114185761141761445a565b5b60200260200101516000808784815181106114365761143561445a565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149891906148c0565b9250508190555080806114aa906144b8565b9150506113fc565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161152a929190614a18565b60405180910390a461154181600087878787612866565b6115508160008787878761286e565b5050505050565b600033905090565b81518351146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a906149f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990614ac1565b60405180910390fd5b600061161c611557565b905061162c818787878787612808565b60005b84518110156117dd57600085828151811061164d5761164c61445a565b5b60200260200101519050600085838151811061166c5761166b61445a565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490614b53565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c291906148c0565b92505081905550505050806117d6906144b8565b905061162f565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611854929190614a18565b60405180910390a461186a818787878787612866565b61187881878787878761286e565b505050505050565b61188a8282610cba565b61195d5760016003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611902611557565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61196b8282610cba565b15611a3f5760006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e4611557565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611a4b610ae6565b611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190614bbf565b60405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611ace611557565b604051611adb9190614bee565b60405180910390a1565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f3ac6ae1ab9191602a77d3ae545aafded61a6e883e7b6d4c65677152f3ddf56fe60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990614c7b565b60405180910390fd5b8051825114611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d906149f8565b60405180910390fd5b6000611c40611557565b9050611c6081856000868660405180602001604052806000815250612808565b60005b8351811015611dad576000848281518110611c8157611c8061445a565b5b602002602001015190506000848381518110611ca057611c9f61445a565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3890614d0d565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611da5906144b8565b915050611c63565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611e25929190614a18565b60405180910390a4611e4b81856000868660405180602001604052806000815250612866565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb790614966565b60405180910390fd5b6000611eca611557565b90506000611ed785612a45565b90506000611ee485612a45565b9050611ef583600089858589612808565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5491906148c0565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611fd2929190614d2d565b60405180910390a4611fe983600089858589612866565b611ff883600089898989612abf565b50505050505050565b612009610ae6565b15612049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204090614da2565b60405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861208d611557565b60405161209a9190614bee565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990614e34565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612203919061353f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361227f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227690614ac1565b60405180910390fd5b6000612289611557565b9050600061229685612a45565b905060006122a385612a45565b90506122b3838989858589612808565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614b53565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123ff91906148c0565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161247c929190614d2d565b60405180910390a4612492848a8a86868a612866565b6124a0848a8a8a8a8a612abf565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190614c7b565b60405180910390fd5b6000612524611557565b9050600061253184612a45565b9050600061253e84612a45565b905061255e83876000858560405180602001604052806000815250612808565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec90614d0d565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516126c2929190614d2d565b60405180910390a46126e884886000868660405180602001604052806000815250612866565b50505050505050565b60007fbe69cfa5000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612764575061276382612c96565b5b9050919050565b6127758282610cba565b6128045761279a8173ffffffffffffffffffffffffffffffffffffffff166014612d78565b6127a88360001c6020612d78565b6040516020016127b9929190614eec565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb9190613768565b60405180910390fd5b5050565b612810610ae6565b15612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790614da2565b60405180910390fd5b61285e868686868686612fb4565b505050505050565b505050505050565b61288d8473ffffffffffffffffffffffffffffffffffffffff16613128565b15612a3d578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016128d3959493929190614f7b565b6020604051808303816000875af192505050801561290f57506040513d601f19601f8201168201806040525081019061290c9190614ff8565b60015b6129b45761291b615032565b806308c379a003612977575061292f615054565b8061293a5750612979565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e9190613768565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ab90615156565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a32906151e8565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612a6457612a63613575565b5b604051908082528060200260200182016040528015612a925781602001602082028036833780820191505090505b5090508281600081518110612aaa57612aa961445a565b5b60200260200101818152505080915050919050565b612ade8473ffffffffffffffffffffffffffffffffffffffff16613128565b15612c8e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612b24959493929190615208565b6020604051808303816000875af1925050508015612b6057506040513d601f19601f82011682018060405250810190612b5d9190614ff8565b60015b612c0557612b6c615032565b806308c379a003612bc85750612b80615054565b80612b8b5750612bca565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf9190613768565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc90615156565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c83906151e8565b60405180910390fd5b505b505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d6157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d715750612d708261314b565b5b9050919050565b606060006002836002612d8b9190615262565b612d9591906148c0565b67ffffffffffffffff811115612dae57612dad613575565b5b6040519080825280601f01601f191660200182016040528015612de05781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e1857612e1761445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e7c57612e7b61445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612ebc9190615262565b612ec691906148c0565b90505b6001811115612f66577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f0857612f0761445a565b5b1a60f81b828281518110612f1f57612f1e61445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f5f906152a4565b9050612ec9565b5060008414612faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa190615319565b60405180910390fd5b8091505092915050565b612fc28686868686866131b5565b60001515600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148061304e575061304d7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775613048611557565b610cba565b5b61308d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308490615385565b60405180910390fd5b60001515600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514613120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311790615417565b60405180910390fd5b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131c3868686868686613385565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036132745760005b8351811015613272578281815181106132165761321561445a565b5b6020026020010151600560008684815181106132355761323461445a565b5b60200260200101518152602001908152602001600020600082825461325a91906148c0565b925050819055508061326b906144b8565b90506131fa565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361337d5760005b835181101561337b5760008482815181106132c9576132c861445a565b5b6020026020010151905060008483815181106132e8576132e761445a565b5b602002602001015190506000600560008481526020019081526020016000205490508181101561334d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613344906154a9565b60405180910390fd5b818103600560008581526020019081526020016000208190555050505080613374906144b8565b90506132ab565b505b505050505050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133cc826133a1565b9050919050565b6133dc816133c1565b81146133e757600080fd5b50565b6000813590506133f9816133d3565b92915050565b6000819050919050565b613412816133ff565b811461341d57600080fd5b50565b60008135905061342f81613409565b92915050565b6000806040838503121561344c5761344b613397565b5b600061345a858286016133ea565b925050602061346b85828601613420565b9150509250929050565b61347e816133ff565b82525050565b60006020820190506134996000830184613475565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134d48161349f565b81146134df57600080fd5b50565b6000813590506134f1816134cb565b92915050565b60006020828403121561350d5761350c613397565b5b600061351b848285016134e2565b91505092915050565b60008115159050919050565b61353981613524565b82525050565b60006020820190506135546000830184613530565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135ad82613564565b810181811067ffffffffffffffff821117156135cc576135cb613575565b5b80604052505050565b60006135df61338d565b90506135eb82826135a4565b919050565b600067ffffffffffffffff82111561360b5761360a613575565b5b61361482613564565b9050602081019050919050565b82818337600083830152505050565b600061364361363e846135f0565b6135d5565b90508281526020810184848401111561365f5761365e61355f565b5b61366a848285613621565b509392505050565b600082601f8301126136875761368661355a565b5b8135613697848260208601613630565b91505092915050565b6000602082840312156136b6576136b5613397565b5b600082013567ffffffffffffffff8111156136d4576136d361339c565b5b6136e084828501613672565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613723578082015181840152602081019050613708565b60008484015250505050565b600061373a826136e9565b61374481856136f4565b9350613754818560208601613705565b61375d81613564565b840191505092915050565b60006020820190508181036000830152613782818461372f565b905092915050565b6000602082840312156137a05761379f613397565b5b60006137ae84828501613420565b91505092915050565b6000602082840312156137cd576137cc613397565b5b60006137db848285016133ea565b91505092915050565b600067ffffffffffffffff8211156137ff576137fe613575565b5b602082029050602081019050919050565b600080fd5b6000613828613823846137e4565b6135d5565b9050808382526020820190506020840283018581111561384b5761384a613810565b5b835b8181101561387457806138608882613420565b84526020840193505060208101905061384d565b5050509392505050565b600082601f8301126138935761389261355a565b5b81356138a3848260208601613815565b91505092915050565b600067ffffffffffffffff8211156138c7576138c6613575565b5b6138d082613564565b9050602081019050919050565b60006138f06138eb846138ac565b6135d5565b90508281526020810184848401111561390c5761390b61355f565b5b613917848285613621565b509392505050565b600082601f8301126139345761393361355a565b5b81356139448482602086016138dd565b91505092915050565b6000806000806080858703121561396757613966613397565b5b6000613975878288016133ea565b945050602085013567ffffffffffffffff8111156139965761399561339c565b5b6139a28782880161387e565b935050604085013567ffffffffffffffff8111156139c3576139c261339c565b5b6139cf8782880161387e565b925050606085013567ffffffffffffffff8111156139f0576139ef61339c565b5b6139fc8782880161391f565b91505092959194509250565b600080600080600060a08688031215613a2457613a23613397565b5b6000613a32888289016133ea565b9550506020613a43888289016133ea565b945050604086013567ffffffffffffffff811115613a6457613a6361339c565b5b613a708882890161387e565b935050606086013567ffffffffffffffff811115613a9157613a9061339c565b5b613a9d8882890161387e565b925050608086013567ffffffffffffffff811115613abe57613abd61339c565b5b613aca8882890161391f565b9150509295509295909350565b6000819050919050565b613aea81613ad7565b8114613af557600080fd5b50565b600081359050613b0781613ae1565b92915050565b60008060408385031215613b2457613b23613397565b5b6000613b3285828601613af8565b9250506020613b43858286016133ea565b9150509250929050565b600067ffffffffffffffff821115613b6857613b67613575565b5b602082029050602081019050919050565b6000613b8c613b8784613b4d565b6135d5565b90508083825260208201905060208402830185811115613baf57613bae613810565b5b835b81811015613bd85780613bc488826133ea565b845260208401935050602081019050613bb1565b5050509392505050565b600082601f830112613bf757613bf661355a565b5b8135613c07848260208601613b79565b91505092915050565b60008060408385031215613c2757613c26613397565b5b600083013567ffffffffffffffff811115613c4557613c4461339c565b5b613c5185828601613be2565b925050602083013567ffffffffffffffff811115613c7257613c7161339c565b5b613c7e8582860161387e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613cbd816133ff565b82525050565b6000613ccf8383613cb4565b60208301905092915050565b6000602082019050919050565b6000613cf382613c88565b613cfd8185613c93565b9350613d0883613ca4565b8060005b83811015613d39578151613d208882613cc3565b9750613d2b83613cdb565b925050600181019050613d0c565b5085935050505092915050565b60006020820190508181036000830152613d608184613ce8565b905092915050565b600080600060608486031215613d8157613d80613397565b5b6000613d8f868287016133ea565b935050602084013567ffffffffffffffff811115613db057613daf61339c565b5b613dbc8682870161387e565b925050604084013567ffffffffffffffff811115613ddd57613ddc61339c565b5b613de98682870161387e565b9150509250925092565b60008060008060808587031215613e0d57613e0c613397565b5b6000613e1b878288016133ea565b9450506020613e2c87828801613420565b9350506040613e3d87828801613420565b925050606085013567ffffffffffffffff811115613e5e57613e5d61339c565b5b613e6a8782880161391f565b91505092959194509250565b613e7f81613524565b8114613e8a57600080fd5b50565b600081359050613e9c81613e76565b92915050565b60008060408385031215613eb957613eb8613397565b5b6000613ec7858286016133ea565b9250506020613ed885828601613e8d565b9150509250929050565b600060208284031215613ef857613ef7613397565b5b6000613f0684828501613af8565b91505092915050565b613f1881613ad7565b82525050565b6000602082019050613f336000830184613f0f565b92915050565b60008060408385031215613f5057613f4f613397565b5b6000613f5e858286016133ea565b9250506020613f6f858286016133ea565b9150509250929050565b600080600080600060a08688031215613f9557613f94613397565b5b6000613fa3888289016133ea565b9550506020613fb4888289016133ea565b9450506040613fc588828901613420565b9350506060613fd688828901613420565b925050608086013567ffffffffffffffff811115613ff757613ff661339c565b5b6140038882890161391f565b9150509295509295909350565b60008060006060848603121561402957614028613397565b5b6000614037868287016133ea565b935050602061404886828701613420565b925050604061405986828701613420565b9150509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006140bf602a836136f4565b91506140ca82614063565b604082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061413c57607f821691505b60208210810361414f5761414e6140f5565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461418281614124565b61418c8186614155565b945060018216600081146141a757600181146141bc576141ef565b60ff19831686528115158202860193506141ef565b6141c585614160565b60005b838110156141e7578154818901526001820191506020810190506141c8565b838801955050505b50505092915050565b6000614203826136e9565b61420d8185614155565b935061421d818560208601613705565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061425f600583614155565b915061426a82614229565b600582019050919050565b60006142818285614175565b915061428d82846141f8565b915061429882614252565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006143006032836136f4565b915061430b826142a4565b604082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614392602f836136f4565b915061439d82614336565b604082019050919050565b600060208201905081810360008301526143c181614385565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144246029836136f4565b915061442f826143c8565b604082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144c3826133ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144f5576144f4614489565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b600061455c6029836136f4565b915061456782614500565b604082019050919050565b6000602082019050818103600083015261458b8161454f565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145a2565b6145e986836145a2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061462661462161461c846133ff565b614601565b6133ff565b9050919050565b6000819050919050565b6146408361460b565b61465461464c8261462d565b8484546145af565b825550505050565b600090565b61466961465c565b614674818484614637565b505050565b5b818110156146985761468d600082614661565b60018101905061467a565b5050565b601f8211156146dd576146ae81614160565b6146b784614592565b810160208510156146c6578190505b6146da6146d285614592565b830182614679565b50505b505050565b600082821c905092915050565b6000614700600019846008026146e2565b1980831691505092915050565b600061471983836146ef565b9150826002028217905092915050565b614732826136e9565b67ffffffffffffffff81111561474b5761474a613575565b5b6147558254614124565b61476082828561469c565b600060209050601f8311600181146147935760008415614781578287015190505b61478b858261470d565b8655506147f3565b601f1984166147a186614160565b60005b828110156147c9578489015182556001820191506020850194506020810190506147a4565b868310156147e657848901516147e2601f8916826146ef565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614835826133ff565b9150614840836133ff565b9250826148505761484f6147fb565b5b828204905092915050565b6000614866826133ff565b9150614871836133ff565b925082820390508181111561488957614888614489565b5b92915050565b600061489a826133ff565b91506148a5836133ff565b9250826148b5576148b46147fb565b5b828206905092915050565b60006148cb826133ff565b91506148d6836133ff565b92508282019050808211156148ee576148ed614489565b5b92915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006149506021836136f4565b915061495b826148f4565b604082019050919050565b6000602082019050818103600083015261497f81614943565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006149e26028836136f4565b91506149ed82614986565b604082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b60006040820190508181036000830152614a328185613ce8565b90508181036020830152614a468184613ce8565b90509392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614aab6025836136f4565b9150614ab682614a4f565b604082019050919050565b60006020820190508181036000830152614ada81614a9e565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614b3d602a836136f4565b9150614b4882614ae1565b604082019050919050565b60006020820190508181036000830152614b6c81614b30565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614ba96014836136f4565b9150614bb482614b73565b602082019050919050565b60006020820190508181036000830152614bd881614b9c565b9050919050565b614be8816133c1565b82525050565b6000602082019050614c036000830184614bdf565b92915050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614c656023836136f4565b9150614c7082614c09565b604082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000614cf76024836136f4565b9150614d0282614c9b565b604082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b6000604082019050614d426000830185613475565b614d4f6020830184613475565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d8c6010836136f4565b9150614d9782614d56565b602082019050919050565b60006020820190508181036000830152614dbb81614d7f565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614e1e6029836136f4565b9150614e2982614dc2565b604082019050919050565b60006020820190508181036000830152614e4d81614e11565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614e8a601783614155565b9150614e9582614e54565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614ed6601183614155565b9150614ee182614ea0565b601182019050919050565b6000614ef782614e7d565b9150614f0382856141f8565b9150614f0e82614ec9565b9150614f1a82846141f8565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614f4d82614f26565b614f578185614f31565b9350614f67818560208601613705565b614f7081613564565b840191505092915050565b600060a082019050614f906000830188614bdf565b614f9d6020830187614bdf565b8181036040830152614faf8186613ce8565b90508181036060830152614fc38185613ce8565b90508181036080830152614fd78184614f42565b90509695505050505050565b600081519050614ff2816134cb565b92915050565b60006020828403121561500e5761500d613397565b5b600061501c84828501614fe3565b91505092915050565b60008160e01c9050919050565b600060033d11156150515760046000803e61504e600051615025565b90505b90565b600060443d106150e15761506661338d565b60043d036004823e80513d602482011167ffffffffffffffff8211171561508e5750506150e1565b808201805167ffffffffffffffff8111156150ac57505050506150e1565b80602083010160043d0385018111156150c95750505050506150e1565b6150d8826020018501866135a4565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006151406034836136f4565b915061514b826150e4565b604082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006151d26028836136f4565b91506151dd82615176565b604082019050919050565b60006020820190508181036000830152615201816151c5565b9050919050565b600060a08201905061521d6000830188614bdf565b61522a6020830187614bdf565b6152376040830186613475565b6152446060830185613475565b81810360808301526152568184614f42565b90509695505050505050565b600061526d826133ff565b9150615278836133ff565b9250828202615286816133ff565b9150828204841483151761529d5761529c614489565b5b5092915050565b60006152af826133ff565b9150600082036152c2576152c1614489565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006153036020836136f4565b915061530e826152cd565b602082019050919050565b60006020820190508181036000830152615332816152f6565b9050919050565b7f455243313135353a204163636f756e74206973204c6f636b6564000000000000600082015250565b600061536f601a836136f4565b915061537a82615339565b602082019050919050565b6000602082019050818103600083015261539e81615362565b9050919050565b7f455243313135353a204163636f756e74206973207065726d616e656e746c792060008201527f4c6f636b65640000000000000000000000000000000000000000000000000000602082015250565b60006154016026836136f4565b915061540c826153a5565b604082019050919050565b60006020820190508181036000830152615430816153f4565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b60006154936028836136f4565b915061549e82615437565b604082019050919050565b600060208201905081810360008301526154c281615486565b905091905056fea26469706673582212204aa54b93522ee7090ef2b6057c2a82a019afc2ea781ddaaf7b49b709c8b21e4764736f6c6343000812003368747470733a2f2f746573746e65742e65746865726e69612e636f6d2f626c6f636b636861696e2f68747470733a2f2f626c6f636b636861696e2e65746865726e69612e636f6d2f6d657461646174612f636f6e74726163742d6d65746164617461

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fa5760003560e01c80636b9db4e61161011a578063d547741f116100ad578063e8a3d4851161007c578063e8a3d485146105a5578063e985e9c5146105c3578063eb1fe5a7146105f3578063f242432a14610623578063f5298aca1461063f576101fa565b8063d547741f1461051f578063dabd76e91461053b578063e386880d14610557578063e58378bb14610587576101fa565b806391d14854116100e957806391d1485414610487578063a22cb465146104b7578063a5f13076146104d3578063bd85b039146104ef576101fa565b80636b9db4e614610415578063731133e9146104455780637e5b1e24146104615780638456cb591461047d576101fa565b80632f2ff15d116101925780634f558e79116101615780634f558e791461038f5780635c975abb146103bf57806362bed1e5146103dd5780636b20c454146103f9576101fa565b80632f2ff15d1461031d57806336568abe146103395780633f4ba83a146103555780634e1273f41461035f576101fa565b80630e89341c116101ce5780630e89341c1461029957806317fefc03146102c95780631f7fdffa146102e55780632eb2c2d614610301576101fa565b8062fdd58e146101ff57806301ffc9a71461022f57806302fe53051461025f57806306fdde031461027b575b600080fd5b61021960048036038101906102149190613435565b61065b565b6040516102269190613484565b60405180910390f35b610249600480360381019061024491906134f7565b6106dd565b604051610256919061353f565b60405180910390f35b610279600480360381019061027491906136a0565b6106ef565b005b610283610726565b6040516102909190613768565b60405180910390f35b6102b360048036038101906102ae919061378a565b6107b4565b6040516102c09190613768565b60405180910390f35b6102e360048036038101906102de91906137b7565b6107e8565b005b6102ff60048036038101906102fa919061394d565b61081f565b005b61031b60048036038101906103169190613a08565b61085c565b005b61033760048036038101906103329190613b0d565b6108fd565b005b610353600480360381019061034e9190613b0d565b61091e565b005b61035d6109a1565b005b61037960048036038101906103749190613c10565b6109b9565b6040516103869190613d46565b60405180910390f35b6103a960048036038101906103a4919061378a565b610ad2565b6040516103b6919061353f565b60405180910390f35b6103c7610ae6565b6040516103d4919061353f565b60405180910390f35b6103f760048036038101906103f291906137b7565b610afd565b005b610413600480360381019061040e9190613d68565b610b34565b005b61042f600480360381019061042a91906137b7565b610bd1565b60405161043c919061353f565b60405180910390f35b61045f600480360381019061045a9190613df3565b610c27565b005b61047b600480360381019061047691906136a0565b610c64565b005b610485610ca2565b005b6104a1600480360381019061049c9190613b0d565b610cba565b6040516104ae919061353f565b60405180910390f35b6104d160048036038101906104cc9190613ea2565b610d25565b005b6104ed60048036038101906104e8919061394d565b610d3b565b005b6105096004803603810190610504919061378a565b610d5b565b6040516105169190613484565b60405180910390f35b61053960048036038101906105349190613b0d565b610d78565b005b61055560048036038101906105509190613df3565b610d99565b005b610571600480360381019061056c9190613ee2565b610db9565b60405161057e9190613f1e565b60405180910390f35b61058f610dd9565b60405161059c9190613f1e565b60405180910390f35b6105ad610de0565b6040516105ba9190613768565b60405180910390f35b6105dd60048036038101906105d89190613f39565b610e72565b6040516105ea919061353f565b60405180910390f35b61060d600480360381019061060891906137b7565b610f06565b60405161061a919061353f565b60405180910390f35b61063d60048036038101906106389190613f79565b610f5c565b005b61065960048036038101906106549190614010565b610ffd565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106c2906140d5565b60405180910390fd5b6106d5838361109a565b905092915050565b60006106e8826110f4565b9050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561071981611106565b6107228261111a565b5050565b6008805461073390614124565b80601f016020809104026020016040519081016040528092919081815260200182805461075f90614124565b80156107ac5780601f10610781576101008083540402835291602001916107ac565b820191906000526020600020905b81548152906001019060200180831161078f57829003601f168201915b505050505081565b606060026107c18361112d565b6040516020016107d2929190614275565b6040516020818303038152906040529050919050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177561081281611106565b61081b8261128d565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661084981611106565b6108558585858561132b565b5050505050565b610864611557565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806108aa57506108a9856108a4611557565b610e72565b5b6108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090614316565b60405180910390fd5b6108f6858585858561155f565b5050505050565b61090682610db9565b61090f81611106565b6109198383611880565b505050565b610926611557565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098a906143a8565b60405180910390fd5b61099d8282611961565b5050565b6000801b6109ae81611106565b6109b6611a43565b50565b606081518351146109ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f69061443a565b60405180910390fd5b6000835167ffffffffffffffff811115610a1c57610a1b613575565b5b604051908082528060200260200182016040528015610a4a5781602001602082028036833780820191505090505b50905060005b8451811015610ac757610a97858281518110610a6f57610a6e61445a565b5b6020026020010151858381518110610a8a57610a8961445a565b5b602002602001015161065b565b828281518110610aaa57610aa961445a565b5b60200260200101818152505080610ac0906144b8565b9050610a50565b508091505092915050565b600080610ade83610d5b565b119050919050565b6000600460009054906101000a900460ff16905090565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610b2781611106565b610b3082611ae5565b5050565b610b3c611557565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480610b825750610b8183610b7c611557565b610e72565b5b610bc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb890614572565b60405180910390fd5b610bcc838383611b83565b505050565b6000600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610c5181611106565b610c5d85858585611e51565b5050505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610c8e81611106565b8160099081610c9d9190614729565b505050565b6000801b610caf81611106565b610cb7612001565b50565b60006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b610d37610d30611557565b83836120a4565b5050565b6000610d45611557565b9050610d54818686868661155f565b5050505050565b600060056000838152602001908152602001600020549050919050565b610d8182610db9565b610d8a81611106565b610d948383611961565b505050565b6000610da3611557565b9050610db28186868686612210565b5050505050565b600060036000838152602001908152602001600020600101549050919050565b6000801b81565b606060098054610def90614124565b80601f0160208091040260200160405190810160405280929190818152602001828054610e1b90614124565b8015610e685780601f10610e3d57610100808354040283529160200191610e68565b820191906000526020600020905b815481529060010190602001808311610e4b57829003601f168201915b5050505050905090565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610f64611557565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480610faa5750610fa985610fa4611557565b610e72565b5b610fe9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe090614572565b60405180910390fd5b610ff68585858585612210565b5050505050565b611005611557565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16148061104b575061104a83611045611557565b610e72565b5b61108a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108190614572565b60405180910390fd5b6110958383836124ab565b505050565b600080600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60006110ff826126f1565b9050919050565b61111781611112611557565b61276b565b50565b80600290816111299190614729565b5050565b606060008203611174576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611288565b600082905060005b600082146111a657808061118f906144b8565b915050600a8261119f919061482a565b915061117c565b60008167ffffffffffffffff8111156111c2576111c1613575565b5b6040519080825280601f01601f1916602001820160405280156111f45781602001600182028036833780820191505090505b5090505b600085146112815760018261120d919061485b565b9150600a8561121c919061488f565b603061122891906148c0565b60f81b81838151811061123e5761123d61445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561127a919061482a565b94506111f8565b8093505050505b919050565b6001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f11442fe37fe2300ecf19dce69a0cf2a40cb10d15b1bb4dce3bb2f130ab1a7d5760405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361139a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139190614966565b60405180910390fd5b81518351146113de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d5906149f8565b60405180910390fd5b60006113e8611557565b90506113f981600087878787612808565b60005b84518110156114b2578381815181106114185761141761445a565b5b60200260200101516000808784815181106114365761143561445a565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461149891906148c0565b9250508190555080806114aa906144b8565b9150506113fc565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb878760405161152a929190614a18565b60405180910390a461154181600087878787612866565b6115508160008787878761286e565b5050505050565b600033905090565b81518351146115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159a906149f8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611612576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160990614ac1565b60405180910390fd5b600061161c611557565b905061162c818787878787612808565b60005b84518110156117dd57600085828151811061164d5761164c61445a565b5b60200260200101519050600085838151811061166c5761166b61445a565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561170d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170490614b53565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c291906148c0565b92505081905550505050806117d6906144b8565b905061162f565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611854929190614a18565b60405180910390a461186a818787878787612866565b61187881878787878761286e565b505050505050565b61188a8282610cba565b61195d5760016003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611902611557565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61196b8282610cba565b15611a3f5760006003600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506119e4611557565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b611a4b610ae6565b611a8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8190614bbf565b60405180910390fd5b6000600460006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611ace611557565b604051611adb9190614bee565b60405180910390a1565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f3ac6ae1ab9191602a77d3ae545aafded61a6e883e7b6d4c65677152f3ddf56fe60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be990614c7b565b60405180910390fd5b8051825114611c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2d906149f8565b60405180910390fd5b6000611c40611557565b9050611c6081856000868660405180602001604052806000815250612808565b60005b8351811015611dad576000848281518110611c8157611c8061445a565b5b602002602001015190506000848381518110611ca057611c9f61445a565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611d41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3890614d0d565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050508080611da5906144b8565b915050611c63565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051611e25929190614a18565b60405180910390a4611e4b81856000868660405180602001604052806000815250612866565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eb790614966565b60405180910390fd5b6000611eca611557565b90506000611ed785612a45565b90506000611ee485612a45565b9050611ef583600089858589612808565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611f5491906148c0565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628989604051611fd2929190614d2d565b60405180910390a4611fe983600089858589612866565b611ff883600089898989612abf565b50505050505050565b612009610ae6565b15612049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204090614da2565b60405180910390fd5b6001600460006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861208d611557565b60405161209a9190614bee565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612112576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210990614e34565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612203919061353f565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361227f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227690614ac1565b60405180910390fd5b6000612289611557565b9050600061229685612a45565b905060006122a385612a45565b90506122b3838989858589612808565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508581101561234a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234190614b53565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123ff91906148c0565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161247c929190614d2d565b60405180910390a4612492848a8a86868a612866565b6124a0848a8a8a8a8a612abf565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361251a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161251190614c7b565b60405180910390fd5b6000612524611557565b9050600061253184612a45565b9050600061253e84612a45565b905061255e83876000858560405180602001604052806000815250612808565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050848110156125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec90614d0d565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516126c2929190614d2d565b60405180910390a46126e884886000868660405180602001604052806000815250612866565b50505050505050565b60007fbe69cfa5000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612764575061276382612c96565b5b9050919050565b6127758282610cba565b6128045761279a8173ffffffffffffffffffffffffffffffffffffffff166014612d78565b6127a88360001c6020612d78565b6040516020016127b9929190614eec565b6040516020818303038152906040526040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127fb9190613768565b60405180910390fd5b5050565b612810610ae6565b15612850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161284790614da2565b60405180910390fd5b61285e868686868686612fb4565b505050505050565b505050505050565b61288d8473ffffffffffffffffffffffffffffffffffffffff16613128565b15612a3d578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016128d3959493929190614f7b565b6020604051808303816000875af192505050801561290f57506040513d601f19601f8201168201806040525081019061290c9190614ff8565b60015b6129b45761291b615032565b806308c379a003612977575061292f615054565b8061293a5750612979565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296e9190613768565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129ab90615156565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a32906151e8565b60405180910390fd5b505b505050505050565b60606000600167ffffffffffffffff811115612a6457612a63613575565b5b604051908082528060200260200182016040528015612a925781602001602082028036833780820191505090505b5090508281600081518110612aaa57612aa961445a565b5b60200260200101818152505080915050919050565b612ade8473ffffffffffffffffffffffffffffffffffffffff16613128565b15612c8e578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401612b24959493929190615208565b6020604051808303816000875af1925050508015612b6057506040513d601f19601f82011682018060405250810190612b5d9190614ff8565b60015b612c0557612b6c615032565b806308c379a003612bc85750612b80615054565b80612b8b5750612bca565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bbf9190613768565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bfc90615156565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614612c8c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c83906151e8565b60405180910390fd5b505b505050505050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d6157507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612d715750612d708261314b565b5b9050919050565b606060006002836002612d8b9190615262565b612d9591906148c0565b67ffffffffffffffff811115612dae57612dad613575565b5b6040519080825280601f01601f191660200182016040528015612de05781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e1857612e1761445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612e7c57612e7b61445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612ebc9190615262565b612ec691906148c0565b90505b6001811115612f66577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f0857612f0761445a565b5b1a60f81b828281518110612f1f57612f1e61445a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f5f906152a4565b9050612ec9565b5060008414612faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fa190615319565b60405180910390fd5b8091505092915050565b612fc28686868686866131b5565b60001515600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515148061304e575061304d7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775613048611557565b610cba565b5b61308d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308490615385565b60405180910390fd5b60001515600760008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514613120576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161311790615417565b60405180910390fd5b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6131c3868686868686613385565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036132745760005b8351811015613272578281815181106132165761321561445a565b5b6020026020010151600560008684815181106132355761323461445a565b5b60200260200101518152602001908152602001600020600082825461325a91906148c0565b925050819055508061326b906144b8565b90506131fa565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361337d5760005b835181101561337b5760008482815181106132c9576132c861445a565b5b6020026020010151905060008483815181106132e8576132e761445a565b5b602002602001015190506000600560008481526020019081526020016000205490508181101561334d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613344906154a9565b60405180910390fd5b818103600560008581526020019081526020016000208190555050505080613374906144b8565b90506132ab565b505b505050505050565b505050505050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006133cc826133a1565b9050919050565b6133dc816133c1565b81146133e757600080fd5b50565b6000813590506133f9816133d3565b92915050565b6000819050919050565b613412816133ff565b811461341d57600080fd5b50565b60008135905061342f81613409565b92915050565b6000806040838503121561344c5761344b613397565b5b600061345a858286016133ea565b925050602061346b85828601613420565b9150509250929050565b61347e816133ff565b82525050565b60006020820190506134996000830184613475565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6134d48161349f565b81146134df57600080fd5b50565b6000813590506134f1816134cb565b92915050565b60006020828403121561350d5761350c613397565b5b600061351b848285016134e2565b91505092915050565b60008115159050919050565b61353981613524565b82525050565b60006020820190506135546000830184613530565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6135ad82613564565b810181811067ffffffffffffffff821117156135cc576135cb613575565b5b80604052505050565b60006135df61338d565b90506135eb82826135a4565b919050565b600067ffffffffffffffff82111561360b5761360a613575565b5b61361482613564565b9050602081019050919050565b82818337600083830152505050565b600061364361363e846135f0565b6135d5565b90508281526020810184848401111561365f5761365e61355f565b5b61366a848285613621565b509392505050565b600082601f8301126136875761368661355a565b5b8135613697848260208601613630565b91505092915050565b6000602082840312156136b6576136b5613397565b5b600082013567ffffffffffffffff8111156136d4576136d361339c565b5b6136e084828501613672565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613723578082015181840152602081019050613708565b60008484015250505050565b600061373a826136e9565b61374481856136f4565b9350613754818560208601613705565b61375d81613564565b840191505092915050565b60006020820190508181036000830152613782818461372f565b905092915050565b6000602082840312156137a05761379f613397565b5b60006137ae84828501613420565b91505092915050565b6000602082840312156137cd576137cc613397565b5b60006137db848285016133ea565b91505092915050565b600067ffffffffffffffff8211156137ff576137fe613575565b5b602082029050602081019050919050565b600080fd5b6000613828613823846137e4565b6135d5565b9050808382526020820190506020840283018581111561384b5761384a613810565b5b835b8181101561387457806138608882613420565b84526020840193505060208101905061384d565b5050509392505050565b600082601f8301126138935761389261355a565b5b81356138a3848260208601613815565b91505092915050565b600067ffffffffffffffff8211156138c7576138c6613575565b5b6138d082613564565b9050602081019050919050565b60006138f06138eb846138ac565b6135d5565b90508281526020810184848401111561390c5761390b61355f565b5b613917848285613621565b509392505050565b600082601f8301126139345761393361355a565b5b81356139448482602086016138dd565b91505092915050565b6000806000806080858703121561396757613966613397565b5b6000613975878288016133ea565b945050602085013567ffffffffffffffff8111156139965761399561339c565b5b6139a28782880161387e565b935050604085013567ffffffffffffffff8111156139c3576139c261339c565b5b6139cf8782880161387e565b925050606085013567ffffffffffffffff8111156139f0576139ef61339c565b5b6139fc8782880161391f565b91505092959194509250565b600080600080600060a08688031215613a2457613a23613397565b5b6000613a32888289016133ea565b9550506020613a43888289016133ea565b945050604086013567ffffffffffffffff811115613a6457613a6361339c565b5b613a708882890161387e565b935050606086013567ffffffffffffffff811115613a9157613a9061339c565b5b613a9d8882890161387e565b925050608086013567ffffffffffffffff811115613abe57613abd61339c565b5b613aca8882890161391f565b9150509295509295909350565b6000819050919050565b613aea81613ad7565b8114613af557600080fd5b50565b600081359050613b0781613ae1565b92915050565b60008060408385031215613b2457613b23613397565b5b6000613b3285828601613af8565b9250506020613b43858286016133ea565b9150509250929050565b600067ffffffffffffffff821115613b6857613b67613575565b5b602082029050602081019050919050565b6000613b8c613b8784613b4d565b6135d5565b90508083825260208201905060208402830185811115613baf57613bae613810565b5b835b81811015613bd85780613bc488826133ea565b845260208401935050602081019050613bb1565b5050509392505050565b600082601f830112613bf757613bf661355a565b5b8135613c07848260208601613b79565b91505092915050565b60008060408385031215613c2757613c26613397565b5b600083013567ffffffffffffffff811115613c4557613c4461339c565b5b613c5185828601613be2565b925050602083013567ffffffffffffffff811115613c7257613c7161339c565b5b613c7e8582860161387e565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613cbd816133ff565b82525050565b6000613ccf8383613cb4565b60208301905092915050565b6000602082019050919050565b6000613cf382613c88565b613cfd8185613c93565b9350613d0883613ca4565b8060005b83811015613d39578151613d208882613cc3565b9750613d2b83613cdb565b925050600181019050613d0c565b5085935050505092915050565b60006020820190508181036000830152613d608184613ce8565b905092915050565b600080600060608486031215613d8157613d80613397565b5b6000613d8f868287016133ea565b935050602084013567ffffffffffffffff811115613db057613daf61339c565b5b613dbc8682870161387e565b925050604084013567ffffffffffffffff811115613ddd57613ddc61339c565b5b613de98682870161387e565b9150509250925092565b60008060008060808587031215613e0d57613e0c613397565b5b6000613e1b878288016133ea565b9450506020613e2c87828801613420565b9350506040613e3d87828801613420565b925050606085013567ffffffffffffffff811115613e5e57613e5d61339c565b5b613e6a8782880161391f565b91505092959194509250565b613e7f81613524565b8114613e8a57600080fd5b50565b600081359050613e9c81613e76565b92915050565b60008060408385031215613eb957613eb8613397565b5b6000613ec7858286016133ea565b9250506020613ed885828601613e8d565b9150509250929050565b600060208284031215613ef857613ef7613397565b5b6000613f0684828501613af8565b91505092915050565b613f1881613ad7565b82525050565b6000602082019050613f336000830184613f0f565b92915050565b60008060408385031215613f5057613f4f613397565b5b6000613f5e858286016133ea565b9250506020613f6f858286016133ea565b9150509250929050565b600080600080600060a08688031215613f9557613f94613397565b5b6000613fa3888289016133ea565b9550506020613fb4888289016133ea565b9450506040613fc588828901613420565b9350506060613fd688828901613420565b925050608086013567ffffffffffffffff811115613ff757613ff661339c565b5b6140038882890161391f565b9150509295509295909350565b60008060006060848603121561402957614028613397565b5b6000614037868287016133ea565b935050602061404886828701613420565b925050604061405986828701613420565b9150509250925092565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b60006140bf602a836136f4565b91506140ca82614063565b604082019050919050565b600060208201905081810360008301526140ee816140b2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061413c57607f821691505b60208210810361414f5761414e6140f5565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461418281614124565b61418c8186614155565b945060018216600081146141a757600181146141bc576141ef565b60ff19831686528115158202860193506141ef565b6141c585614160565b60005b838110156141e7578154818901526001820191506020810190506141c8565b838801955050505b50505092915050565b6000614203826136e9565b61420d8185614155565b935061421d818560208601613705565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061425f600583614155565b915061426a82614229565b600582019050919050565b60006142818285614175565b915061428d82846141f8565b915061429882614252565b91508190509392505050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006143006032836136f4565b915061430b826142a4565b604082019050919050565b6000602082019050818103600083015261432f816142f3565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000614392602f836136f4565b915061439d82614336565b604082019050919050565b600060208201905081810360008301526143c181614385565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b60006144246029836136f4565b915061442f826143c8565b604082019050919050565b6000602082019050818103600083015261445381614417565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006144c3826133ff565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144f5576144f4614489565b5b600182019050919050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b600061455c6029836136f4565b915061456782614500565b604082019050919050565b6000602082019050818103600083015261458b8161454f565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026145df7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826145a2565b6145e986836145a2565b95508019841693508086168417925050509392505050565b6000819050919050565b600061462661462161461c846133ff565b614601565b6133ff565b9050919050565b6000819050919050565b6146408361460b565b61465461464c8261462d565b8484546145af565b825550505050565b600090565b61466961465c565b614674818484614637565b505050565b5b818110156146985761468d600082614661565b60018101905061467a565b5050565b601f8211156146dd576146ae81614160565b6146b784614592565b810160208510156146c6578190505b6146da6146d285614592565b830182614679565b50505b505050565b600082821c905092915050565b6000614700600019846008026146e2565b1980831691505092915050565b600061471983836146ef565b9150826002028217905092915050565b614732826136e9565b67ffffffffffffffff81111561474b5761474a613575565b5b6147558254614124565b61476082828561469c565b600060209050601f8311600181146147935760008415614781578287015190505b61478b858261470d565b8655506147f3565b601f1984166147a186614160565b60005b828110156147c9578489015182556001820191506020850194506020810190506147a4565b868310156147e657848901516147e2601f8916826146ef565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614835826133ff565b9150614840836133ff565b9250826148505761484f6147fb565b5b828204905092915050565b6000614866826133ff565b9150614871836133ff565b925082820390508181111561488957614888614489565b5b92915050565b600061489a826133ff565b91506148a5836133ff565b9250826148b5576148b46147fb565b5b828206905092915050565b60006148cb826133ff565b91506148d6836133ff565b92508282019050808211156148ee576148ed614489565b5b92915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006149506021836136f4565b915061495b826148f4565b604082019050919050565b6000602082019050818103600083015261497f81614943565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b60006149e26028836136f4565b91506149ed82614986565b604082019050919050565b60006020820190508181036000830152614a11816149d5565b9050919050565b60006040820190508181036000830152614a328185613ce8565b90508181036020830152614a468184613ce8565b90509392505050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000614aab6025836136f4565b9150614ab682614a4f565b604082019050919050565b60006020820190508181036000830152614ada81614a9e565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b6000614b3d602a836136f4565b9150614b4882614ae1565b604082019050919050565b60006020820190508181036000830152614b6c81614b30565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614ba96014836136f4565b9150614bb482614b73565b602082019050919050565b60006020820190508181036000830152614bd881614b9c565b9050919050565b614be8816133c1565b82525050565b6000602082019050614c036000830184614bdf565b92915050565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000614c656023836136f4565b9150614c7082614c09565b604082019050919050565b60006020820190508181036000830152614c9481614c58565b9050919050565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000614cf76024836136f4565b9150614d0282614c9b565b604082019050919050565b60006020820190508181036000830152614d2681614cea565b9050919050565b6000604082019050614d426000830185613475565b614d4f6020830184613475565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614d8c6010836136f4565b9150614d9782614d56565b602082019050919050565b60006020820190508181036000830152614dbb81614d7f565b9050919050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000614e1e6029836136f4565b9150614e2982614dc2565b604082019050919050565b60006020820190508181036000830152614e4d81614e11565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614e8a601783614155565b9150614e9582614e54565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614ed6601183614155565b9150614ee182614ea0565b601182019050919050565b6000614ef782614e7d565b9150614f0382856141f8565b9150614f0e82614ec9565b9150614f1a82846141f8565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b6000614f4d82614f26565b614f578185614f31565b9350614f67818560208601613705565b614f7081613564565b840191505092915050565b600060a082019050614f906000830188614bdf565b614f9d6020830187614bdf565b8181036040830152614faf8186613ce8565b90508181036060830152614fc38185613ce8565b90508181036080830152614fd78184614f42565b90509695505050505050565b600081519050614ff2816134cb565b92915050565b60006020828403121561500e5761500d613397565b5b600061501c84828501614fe3565b91505092915050565b60008160e01c9050919050565b600060033d11156150515760046000803e61504e600051615025565b90505b90565b600060443d106150e15761506661338d565b60043d036004823e80513d602482011167ffffffffffffffff8211171561508e5750506150e1565b808201805167ffffffffffffffff8111156150ac57505050506150e1565b80602083010160043d0385018111156150c95750505050506150e1565b6150d8826020018501866135a4565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b60006151406034836136f4565b915061514b826150e4565b604082019050919050565b6000602082019050818103600083015261516f81615133565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b60006151d26028836136f4565b91506151dd82615176565b604082019050919050565b60006020820190508181036000830152615201816151c5565b9050919050565b600060a08201905061521d6000830188614bdf565b61522a6020830187614bdf565b6152376040830186613475565b6152446060830185613475565b81810360808301526152568184614f42565b90509695505050505050565b600061526d826133ff565b9150615278836133ff565b9250828202615286816133ff565b9150828204841483151761529d5761529c614489565b5b5092915050565b60006152af826133ff565b9150600082036152c2576152c1614489565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006153036020836136f4565b915061530e826152cd565b602082019050919050565b60006020820190508181036000830152615332816152f6565b9050919050565b7f455243313135353a204163636f756e74206973204c6f636b6564000000000000600082015250565b600061536f601a836136f4565b915061537a82615339565b602082019050919050565b6000602082019050818103600083015261539e81615362565b9050919050565b7f455243313135353a204163636f756e74206973207065726d616e656e746c792060008201527f4c6f636b65640000000000000000000000000000000000000000000000000000602082015250565b60006154016026836136f4565b915061540c826153a5565b604082019050919050565b60006020820190508181036000830152615430816153f4565b9050919050565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b60006154936028836136f4565b915061549e82615437565b604082019050919050565b600060208201905081810360008301526154c281615486565b905091905056fea26469706673582212204aa54b93522ee7090ef2b6057c2a82a019afc2ea781ddaaf7b49b709c8b21e4764736f6c63430008120033

Deployed Bytecode Sourcemap

56442:3323:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22395:231;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59536:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57046:100;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56690:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21989:255;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58867:133;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57968:203;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24486:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45575:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46623:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57458:76;;;:::i;:::-;;22936:532;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52814:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49783:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59053:137;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51615:353;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55410:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57656:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57234:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57154:72;;;:::i;:::-;;43642:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23541:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58510:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52603:113;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45967:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58241:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45182:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42755:41;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57353:97;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23768:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55647:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24008:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51286:321;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22395:231;22481:7;22528:1;22509:21;;:7;:21;;;22501:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22595:23;22606:7;22615:2;22595:10;:23::i;:::-;22588:30;;22395:231;;;;:::o;59536:226::-;59689:4;59718:36;59742:11;59718:23;:36::i;:::-;59711:43;;59536:226;;;:::o;57046:100::-;56590:23;43238:16;43249:4;43238:10;:16::i;:::-;57123:15:::1;57131:6;57123:7;:15::i;:::-;57046:100:::0;;:::o;56690:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;21989:255::-;22052:13;22141:4;22164:20;22181:2;22164:16;:20::i;:::-;22106:119;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22078:158;;21989:255;;;:::o;58867:133::-;56590:23;43238:16;43249:4;43238:10;:16::i;:::-;58969:23:::1;58984:7;58969:14;:23::i;:::-;58867:133:::0;;:::o;57968:203::-;56659:24;43238:16;43249:4;43238:10;:16::i;:::-;58129:34:::1;58140:2;58144:3;58149:7;58158:4;58129:10;:34::i;:::-;57968:203:::0;;;;;:::o;24486:442::-;24727:12;:10;:12::i;:::-;24719:20;;:4;:20;;;:60;;;;24743:36;24760:4;24766:12;:10;:12::i;:::-;24743:16;:36::i;:::-;24719:60;24697:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;24868:52;24891:4;24897:2;24901:3;24906:7;24915:4;24868:22;:52::i;:::-;24486:442;;;;;:::o;45575:147::-;45658:18;45671:4;45658:12;:18::i;:::-;43238:16;43249:4;43238:10;:16::i;:::-;45689:25:::1;45700:4;45706:7;45689:10;:25::i;:::-;45575:147:::0;;;:::o;46623:218::-;46730:12;:10;:12::i;:::-;46719:23;;:7;:23;;;46711:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;46807:26;46819:4;46825:7;46807:11;:26::i;:::-;46623:218;;:::o;57458:76::-;42792:4;57493:10;;43238:16;43249:4;43238:10;:16::i;:::-;57516:10:::1;:8;:10::i;:::-;57458:76:::0;:::o;22936:532::-;23092:16;23153:3;:10;23134:8;:15;:29;23126:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;23230:30;23277:8;:15;23263:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23230:63;;23311:9;23306:122;23330:8;:15;23326:1;:19;23306:122;;;23386:30;23396:8;23405:1;23396:11;;;;;;;;:::i;:::-;;;;;;;;23409:3;23413:1;23409:6;;;;;;;;:::i;:::-;;;;;;;;23386:9;:30::i;:::-;23367:13;23381:1;23367:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;23347:3;;;;:::i;:::-;;;23306:122;;;;23447:13;23440:20;;;22936:532;;;;:::o;52814:122::-;52871:4;52927:1;52895:29;52921:2;52895:25;:29::i;:::-;:33;52888:40;;52814:122;;;:::o;49783:86::-;49830:4;49854:7;;;;;;;;;;;49847:14;;49783:86;:::o;59053:137::-;56590:23;43238:16;43249:4;43238:10;:16::i;:::-;59157:25:::1;59174:7;59157:16;:25::i;:::-;59053:137:::0;;:::o;51615:353::-;51791:12;:10;:12::i;:::-;51780:23;;:7;:23;;;:66;;;;51807:39;51824:7;51833:12;:10;:12::i;:::-;51807:16;:39::i;:::-;51780:66;51758:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;51928:32;51939:7;51948:3;51953:6;51928:10;:32::i;:::-;51615:353;;;:::o;55410:106::-;55466:4;55493:6;:15;55500:7;55493:15;;;;;;;;;;;;;;;;;;;;;;;;;55486:22;;55410:106;;;:::o;57656:181::-;56659:24;43238:16;43249:4;43238:10;:16::i;:::-;57797:32:::1;57803:7;57812:2;57816:6;57824:4;57797:5;:32::i;:::-;57656:181:::0;;;;;:::o;57234:111::-;56590:23;43238:16;43249:4;43238:10;:16::i;:::-;57334:3:::1;57319:12;:18;;;;;;:::i;:::-;;57234:111:::0;;:::o;57154:72::-;42792:4;57187:10;;43238:16;43249:4;43238:10;:16::i;:::-;57210:8:::1;:6;:8::i;:::-;57154:72:::0;:::o;43642:147::-;43728:4;43752:6;:12;43759:4;43752:12;;;;;;;;;;;:20;;:29;43773:7;43752:29;;;;;;;;;;;;;;;;;;;;;;;;;43745:36;;43642:147;;;;:::o;23541:155::-;23636:52;23655:12;:10;:12::i;:::-;23669:8;23679;23636:18;:52::i;:::-;23541:155;;:::o;58510:234::-;58644:13;58660:12;:10;:12::i;:::-;58644:28;;58683:53;58706:5;58713:2;58717:3;58722:7;58731:4;58683:22;:53::i;:::-;58633:111;58510:234;;;;:::o;52603:113::-;52665:7;52692:12;:16;52705:2;52692:16;;;;;;;;;;;;52685:23;;52603:113;;;:::o;45967:149::-;46051:18;46064:4;46051:12;:18::i;:::-;43238:16;43249:4;43238:10;:16::i;:::-;46082:26:::1;46094:4;46100:7;46082:11;:26::i;:::-;45967:149:::0;;;:::o;58241:202::-;58350:13;58366:12;:10;:12::i;:::-;58350:28;;58389:46;58407:5;58414:2;58418;58422:6;58430:4;58389:17;:46::i;:::-;58339:104;58241:202;;;;:::o;45182:131::-;45256:7;45283:6;:12;45290:4;45283:12;;;;;;;;;;;:22;;;45276:29;;45182:131;;;:::o;42755:41::-;42792:4;42755:41;;;:::o;57353:97::-;57397:13;57430:12;57423:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57353:97;:::o;23768:168::-;23867:4;23891:18;:27;23910:7;23891:27;;;;;;;;;;;;;;;:37;23919:8;23891:37;;;;;;;;;;;;;;;;;;;;;;;;;23884:44;;23768:168;;;;:::o;55647:124::-;55712:4;55739:15;:24;55755:7;55739:24;;;;;;;;;;;;;;;;;;;;;;;;;55732:31;;55647:124;;;:::o;24008:401::-;24224:12;:10;:12::i;:::-;24216:20;;:4;:20;;;:60;;;;24240:36;24257:4;24263:12;:10;:12::i;:::-;24240:16;:36::i;:::-;24216:60;24194:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;24356:45;24374:4;24380:2;24384;24388:6;24396:4;24356:17;:45::i;:::-;24008:401;;;;;:::o;51286:321::-;51437:12;:10;:12::i;:::-;51426:23;;:7;:23;;;:66;;;;51453:39;51470:7;51479:12;:10;:12::i;:::-;51453:16;:39::i;:::-;51426:66;51404:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;51574:25;51580:7;51589:2;51593:5;51574;:25::i;:::-;51286:321;;;:::o;22634:136::-;22713:7;22740:9;:13;22750:2;22740:13;;;;;;;;;;;:22;22754:7;22740:22;;;;;;;;;;;;;;;;22733:29;;22634:136;;;;:::o;54910:177::-;55019:4;55043:36;55067:11;55043:23;:36::i;:::-;55036:43;;54910:177;;;:::o;44093:105::-;44160:30;44171:4;44177:12;:10;:12::i;:::-;44160:10;:30::i;:::-;44093:105;:::o;28716:88::-;28790:6;28783:4;:13;;;;;;:::i;:::-;;28716:88;:::o;18522:723::-;18578:13;18808:1;18799:5;:10;18795:53;;18826:10;;;;;;;;;;;;;;;;;;;;;18795:53;18858:12;18873:5;18858:20;;18889:14;18914:78;18929:1;18921:4;:9;18914:78;;18947:8;;;;;:::i;:::-;;;;18978:2;18970:10;;;;;:::i;:::-;;;18914:78;;;19002:19;19034:6;19024:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19002:39;;19052:154;19068:1;19059:5;:10;19052:154;;19096:1;19086:11;;;;;:::i;:::-;;;19163:2;19155:5;:10;;;;:::i;:::-;19142:2;:24;;;;:::i;:::-;19129:39;;19112:6;19119;19112:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19192:2;19183:11;;;;;:::i;:::-;;;19052:154;;;19230:6;19216:21;;;;;18522:723;;;;:::o;55095:147::-;55194:4;55167:15;:24;55183:7;55167:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;55226:7;55212:22;;;;;;;;;;;;55095:147;:::o;30275:813::-;30467:1;30453:16;;:2;:16;;;30445:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30540:7;:14;30526:3;:10;:28;30518:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30612:16;30631:12;:10;:12::i;:::-;30612:31;;30656:66;30677:8;30695:1;30699:2;30703:3;30708:7;30717:4;30656:20;:66::i;:::-;30740:9;30735:103;30759:3;:10;30755:1;:14;30735:103;;;30816:7;30824:1;30816:10;;;;;;;;:::i;:::-;;;;;;;;30791:9;:17;30801:3;30805:1;30801:6;;;;;;;;:::i;:::-;;;;;;;;30791:17;;;;;;;;;;;:21;30809:2;30791:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;30771:3;;;;;:::i;:::-;;;;30735:103;;;;30891:2;30855:53;;30887:1;30855:53;;30869:8;30855:53;;;30895:3;30900:7;30855:53;;;;;;;:::i;:::-;;;;;;;;30921:65;30941:8;30959:1;30963:2;30967:3;30972:7;30981:4;30921:19;:65::i;:::-;30999:81;31035:8;31053:1;31057:2;31061:3;31066:7;31075:4;30999:35;:81::i;:::-;30434:654;30275:813;;;;:::o;17099:98::-;17152:7;17179:10;17172:17;;17099:98;:::o;26726:1146::-;26953:7;:14;26939:3;:10;:28;26931:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;27045:1;27031:16;;:2;:16;;;27023:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;27102:16;27121:12;:10;:12::i;:::-;27102:31;;27146:60;27167:8;27177:4;27183:2;27187:3;27192:7;27201:4;27146:20;:60::i;:::-;27224:9;27219:421;27243:3;:10;27239:1;:14;27219:421;;;27275:10;27288:3;27292:1;27288:6;;;;;;;;:::i;:::-;;;;;;;;27275:19;;27309:14;27326:7;27334:1;27326:10;;;;;;;;:::i;:::-;;;;;;;;27309:27;;27353:19;27375:9;:13;27385:2;27375:13;;;;;;;;;;;:19;27389:4;27375:19;;;;;;;;;;;;;;;;27353:41;;27432:6;27417:11;:21;;27409:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;27565:6;27551:11;:20;27529:9;:13;27539:2;27529:13;;;;;;;;;;;:19;27543:4;27529:19;;;;;;;;;;;;;;;:42;;;;27622:6;27601:9;:13;27611:2;27601:13;;;;;;;;;;;:17;27615:2;27601:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;27260:380;;;27255:3;;;;:::i;:::-;;;27219:421;;;;27687:2;27657:47;;27681:4;27657:47;;27671:8;27657:47;;;27691:3;27696:7;27657:47;;;;;;;:::i;:::-;;;;;;;;27717:59;27737:8;27747:4;27753:2;27757:3;27762:7;27771:4;27717:19;:59::i;:::-;27789:75;27825:8;27835:4;27841:2;27845:3;27850:7;27859:4;27789:35;:75::i;:::-;26920:952;26726:1146;;;;;:::o;48124:238::-;48208:22;48216:4;48222:7;48208;:22::i;:::-;48203:152;;48279:4;48247:6;:12;48254:4;48247:12;;;;;;;;;;;:20;;:29;48268:7;48247:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;48330:12;:10;:12::i;:::-;48303:40;;48321:7;48303:40;;48315:4;48303:40;;;;;;;;;;48203:152;48124:238;;:::o;48494:239::-;48578:22;48586:4;48592:7;48578;:22::i;:::-;48574:152;;;48649:5;48617:6;:12;48624:4;48617:12;;;;;;;;;;;:20;;:29;48638:7;48617:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;48701:12;:10;:12::i;:::-;48674:40;;48692:7;48674:40;;48686:4;48674:40;;;;;;;;;;48574:152;48494:239;;:::o;50842:120::-;50386:8;:6;:8::i;:::-;50378:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;50911:5:::1;50901:7;;:15;;;;;;;;;;;;;;;;;;50932:22;50941:12;:10;:12::i;:::-;50932:22;;;;;;:::i;:::-;;;;;;;;50842:120::o:0;55250:152::-;55351:5;55324:15;:24;55340:7;55324:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;55386:7;55370:24;;;;;;;;;;;;55250:152;:::o;32349:969::-;32517:1;32501:18;;:4;:18;;;32493:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;32592:7;:14;32578:3;:10;:28;32570:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;32664:16;32683:12;:10;:12::i;:::-;32664:31;;32708:66;32729:8;32739:4;32753:1;32757:3;32762:7;32708:66;;;;;;;;;;;;:20;:66::i;:::-;32792:9;32787:373;32811:3;:10;32807:1;:14;32787:373;;;32843:10;32856:3;32860:1;32856:6;;;;;;;;:::i;:::-;;;;;;;;32843:19;;32877:14;32894:7;32902:1;32894:10;;;;;;;;:::i;:::-;;;;;;;;32877:27;;32921:19;32943:9;:13;32953:2;32943:13;;;;;;;;;;;:19;32957:4;32943:19;;;;;;;;;;;;;;;;32921:41;;33000:6;32985:11;:21;;32977:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;33127:6;33113:11;:20;33091:9;:13;33101:2;33091:13;;;;;;;;;;;:19;33105:4;33091:19;;;;;;;;;;;;;;;:42;;;;32828:332;;;32823:3;;;;;:::i;:::-;;;;32787:373;;;;33215:1;33177:55;;33201:4;33177:55;;33191:8;33177:55;;;33219:3;33224:7;33177:55;;;;;;;:::i;:::-;;;;;;;;33245:65;33265:8;33275:4;33289:1;33293:3;33298:7;33245:65;;;;;;;;;;;;:19;:65::i;:::-;32482:836;32349:969;;;:::o;29190:729::-;29357:1;29343:16;;:2;:16;;;29335:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;29410:16;29429:12;:10;:12::i;:::-;29410:31;;29452:20;29475:21;29493:2;29475:17;:21::i;:::-;29452:44;;29507:24;29534:25;29552:6;29534:17;:25::i;:::-;29507:52;;29572:66;29593:8;29611:1;29615:2;29619:3;29624:7;29633:4;29572:20;:66::i;:::-;29672:6;29651:9;:13;29661:2;29651:13;;;;;;;;;;;:17;29665:2;29651:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;29731:2;29694:52;;29727:1;29694:52;;29709:8;29694:52;;;29735:2;29739:6;29694:52;;;;;;;:::i;:::-;;;;;;;;29759:65;29779:8;29797:1;29801:2;29805:3;29810:7;29819:4;29759:19;:65::i;:::-;29837:74;29868:8;29886:1;29890:2;29894;29898:6;29906:4;29837:30;:74::i;:::-;29324:595;;;29190:729;;;;:::o;50583:118::-;50109:8;:6;:8::i;:::-;50108:9;50100:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;50653:4:::1;50643:7;;:14;;;;;;;;;;;;;;;;;;50673:20;50680:12;:10;:12::i;:::-;50673:20;;;;;;:::i;:::-;;;;;;;;50583:118::o:0;33460:331::-;33615:8;33606:17;;:5;:17;;;33598:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33718:8;33680:18;:25;33699:5;33680:25;;;;;;;;;;;;;;;:35;33706:8;33680:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;33764:8;33742:41;;33757:5;33742:41;;;33774:8;33742:41;;;;;;:::i;:::-;;;;;;;;33460:331;;;:::o;25394:974::-;25596:1;25582:16;;:2;:16;;;25574:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;25653:16;25672:12;:10;:12::i;:::-;25653:31;;25695:20;25718:21;25736:2;25718:17;:21::i;:::-;25695:44;;25750:24;25777:25;25795:6;25777:17;:25::i;:::-;25750:52;;25815:60;25836:8;25846:4;25852:2;25856:3;25861:7;25870:4;25815:20;:60::i;:::-;25888:19;25910:9;:13;25920:2;25910:13;;;;;;;;;;;:19;25924:4;25910:19;;;;;;;;;;;;;;;;25888:41;;25963:6;25948:11;:21;;25940:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26088:6;26074:11;:20;26052:9;:13;26062:2;26052:13;;;;;;;;;;;:19;26066:4;26052:19;;;;;;;;;;;;;;;:42;;;;26137:6;26116:9;:13;26126:2;26116:13;;;;;;;;;;;:17;26130:2;26116:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;26192:2;26161:46;;26186:4;26161:46;;26176:8;26161:46;;;26196:2;26200:6;26161:46;;;;;;;:::i;:::-;;;;;;;;26220:59;26240:8;26250:4;26256:2;26260:3;26265:7;26274:4;26220:19;:59::i;:::-;26292:68;26323:8;26333:4;26339:2;26343;26347:6;26355:4;26292:30;:68::i;:::-;25563:805;;;;25394:974;;;;;:::o;31338:808::-;31481:1;31465:18;;:4;:18;;;31457:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;31536:16;31555:12;:10;:12::i;:::-;31536:31;;31578:20;31601:21;31619:2;31601:17;:21::i;:::-;31578:44;;31633:24;31660:25;31678:6;31660:17;:25::i;:::-;31633:52;;31698:66;31719:8;31729:4;31743:1;31747:3;31752:7;31698:66;;;;;;;;;;;;:20;:66::i;:::-;31777:19;31799:9;:13;31809:2;31799:13;;;;;;;;;;;:19;31813:4;31799:19;;;;;;;;;;;;;;;;31777:41;;31852:6;31837:11;:21;;31829:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;31971:6;31957:11;:20;31935:9;:13;31945:2;31935:13;;;;;;;;;;;:19;31949:4;31935:19;;;;;;;;;;;;;;;:42;;;;32045:1;32006:54;;32031:4;32006:54;;32021:8;32006:54;;;32049:2;32053:6;32006:54;;;;;;;:::i;:::-;;;;;;;;32073:65;32093:8;32103:4;32117:1;32121:3;32126:7;32073:65;;;;;;;;;;;;:19;:65::i;:::-;31446:700;;;;31338:808;;;:::o;43346:204::-;43431:4;43470:32;43455:47;;;:11;:47;;;;:87;;;;43506:36;43530:11;43506:23;:36::i;:::-;43455:87;43448:94;;43346:204;;;:::o;44488:505::-;44577:22;44585:4;44591:7;44577;:22::i;:::-;44572:414;;44765:41;44793:7;44765:41;;44803:2;44765:19;:41::i;:::-;44879:38;44907:4;44899:13;;44914:2;44879:19;:38::i;:::-;44670:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44616:358;;;;;;;;;;;:::i;:::-;;;;;;;;44572:414;44488:505;;:::o;59198:330::-;50109:8;:6;:8::i;:::-;50108:9;50100:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;59454:66:::1;59481:8;59491:4;59497:2;59501:3;59506:7;59515:4;59454:26;:66::i;:::-;59198:330:::0;;;;;;:::o;35923:220::-;;;;;;;:::o;36903:813::-;37143:15;:2;:13;;;:15::i;:::-;37139:570;;;37196:2;37179:43;;;37223:8;37233:4;37239:3;37244:7;37253:4;37179:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37175:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;37571:6;37564:14;;;;;;;;;;;:::i;:::-;;;;;;;;37175:523;;;37620:62;;;;;;;;;;:::i;:::-;;;;;;;;37175:523;37352:48;;;37340:60;;;:8;:60;;;;37336:159;;37425:50;;;;;;;;;;:::i;:::-;;;;;;;;37336:159;37259:251;37139:570;36903:813;;;;;;:::o;37724:198::-;37790:16;37819:22;37858:1;37844:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37819:41;;37882:7;37871:5;37877:1;37871:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;37909:5;37902:12;;;37724:198;;;:::o;36151:744::-;36366:15;:2;:13;;;:15::i;:::-;36362:526;;;36419:2;36402:38;;;36441:8;36451:4;36457:2;36461:6;36469:4;36402:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36398:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;36750:6;36743:14;;;;;;;;;;;:::i;:::-;;;;;;;;36398:479;;;36799:62;;;;;;;;;;:::i;:::-;;;;;;;;36398:479;36536:43;;;36524:55;;;:8;:55;;;;36520:154;;36604:50;;;;;;;;;;:::i;:::-;;;;;;;;36520:154;36475:214;36362:526;36151:744;;;;;;:::o;21268:310::-;21370:4;21422:26;21407:41;;;:11;:41;;;;:110;;;;21480:37;21465:52;;;:11;:52;;;;21407:110;:163;;;;21534:36;21558:11;21534:23;:36::i;:::-;21407:163;21387:183;;21268:310;;;:::o;19823:451::-;19898:13;19924:19;19969:1;19960:6;19956:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19946:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19924:47;;19982:15;:6;19989:1;19982:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;20008;:6;20015:1;20008:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;20039:9;20064:1;20055:6;20051:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;20039:26;;20034:135;20071:1;20067;:5;20034:135;;;20106:12;20127:3;20119:5;:11;20106:25;;;;;;;:::i;:::-;;;;;20094:6;20101:1;20094:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;20156:1;20146:11;;;;;20074:3;;;;:::i;:::-;;;20034:135;;;;20196:1;20187:5;:10;20179:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;20259:6;20245:21;;;19823:451;;;;:::o;55920:515::-;56159:66;56186:8;56196:4;56202:2;56206:3;56211:7;56220:4;56159:26;:66::i;:::-;56262:5;56246:21;;:6;:12;56253:4;56246:12;;;;;;;;;;;;;;;;;;;;;;;;;:21;;;:58;;;;56271:33;54425:23;56291:12;:10;:12::i;:::-;56271:7;:33::i;:::-;56246:58;56238:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;56379:5;56354:30;;:15;:21;56370:4;56354:21;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;56346:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;55920:515;;;;;;:::o;9235:326::-;9295:4;9552:1;9530:7;:19;;;:23;9523:30;;9235:326;;;:::o;18078:157::-;18163:4;18202:25;18187:40;;;:11;:40;;;;18180:47;;18078:157;;;:::o;53011:931::-;53250:66;53277:8;53287:4;53293:2;53297:3;53302:7;53311:4;53250:26;:66::i;:::-;53349:1;53333:18;;:4;:18;;;53329:160;;53373:9;53368:110;53392:3;:10;53388:1;:14;53368:110;;;53452:7;53460:1;53452:10;;;;;;;;:::i;:::-;;;;;;;;53428:12;:20;53441:3;53445:1;53441:6;;;;;;;;:::i;:::-;;;;;;;;53428:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;53404:3;;;;:::i;:::-;;;53368:110;;;;53329:160;53519:1;53505:16;;:2;:16;;;53501:434;;53543:9;53538:386;53562:3;:10;53558:1;:14;53538:386;;;53598:10;53611:3;53615:1;53611:6;;;;;;;;:::i;:::-;;;;;;;;53598:19;;53636:14;53653:7;53661:1;53653:10;;;;;;;;:::i;:::-;;;;;;;;53636:27;;53682:14;53699:12;:16;53712:2;53699:16;;;;;;;;;;;;53682:33;;53752:6;53742;:16;;53734:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;53883:6;53874;:15;53855:12;:16;53868:2;53855:16;;;;;;;;;;;:34;;;;53579:345;;;53574:3;;;;:::i;:::-;;;53538:386;;;;53501:434;53011:931;;;;;;:::o;34747:221::-;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:117::-;3322:1;3319;3312:12;3336:117;3445:1;3442;3435:12;3459:102;3500:6;3551:2;3547:7;3542:2;3535:5;3531:14;3527:28;3517:38;;3459:102;;;:::o;3567:180::-;3615:77;3612:1;3605:88;3712:4;3709:1;3702:15;3736:4;3733:1;3726:15;3753:281;3836:27;3858:4;3836:27;:::i;:::-;3828:6;3824:40;3966:6;3954:10;3951:22;3930:18;3918:10;3915:34;3912:62;3909:88;;;3977:18;;:::i;:::-;3909:88;4017:10;4013:2;4006:22;3796:238;3753:281;;:::o;4040:129::-;4074:6;4101:20;;:::i;:::-;4091:30;;4130:33;4158:4;4150:6;4130:33;:::i;:::-;4040:129;;;:::o;4175:308::-;4237:4;4327:18;4319:6;4316:30;4313:56;;;4349:18;;:::i;:::-;4313:56;4387:29;4409:6;4387:29;:::i;:::-;4379:37;;4471:4;4465;4461:15;4453:23;;4175:308;;;:::o;4489:146::-;4586:6;4581:3;4576;4563:30;4627:1;4618:6;4613:3;4609:16;4602:27;4489:146;;;:::o;4641:425::-;4719:5;4744:66;4760:49;4802:6;4760:49;:::i;:::-;4744:66;:::i;:::-;4735:75;;4833:6;4826:5;4819:21;4871:4;4864:5;4860:16;4909:3;4900:6;4895:3;4891:16;4888:25;4885:112;;;4916:79;;:::i;:::-;4885:112;5006:54;5053:6;5048:3;5043;5006:54;:::i;:::-;4725:341;4641:425;;;;;:::o;5086:340::-;5142:5;5191:3;5184:4;5176:6;5172:17;5168:27;5158:122;;5199:79;;:::i;:::-;5158:122;5316:6;5303:20;5341:79;5416:3;5408:6;5401:4;5393:6;5389:17;5341:79;:::i;:::-;5332:88;;5148:278;5086:340;;;;:::o;5432:509::-;5501:6;5550:2;5538:9;5529:7;5525:23;5521:32;5518:119;;;5556:79;;:::i;:::-;5518:119;5704:1;5693:9;5689:17;5676:31;5734:18;5726:6;5723:30;5720:117;;;5756:79;;:::i;:::-;5720:117;5861:63;5916:7;5907:6;5896:9;5892:22;5861:63;:::i;:::-;5851:73;;5647:287;5432:509;;;;:::o;5947:99::-;5999:6;6033:5;6027:12;6017:22;;5947:99;;;:::o;6052:169::-;6136:11;6170:6;6165:3;6158:19;6210:4;6205:3;6201:14;6186:29;;6052:169;;;;:::o;6227:246::-;6308:1;6318:113;6332:6;6329:1;6326:13;6318:113;;;6417:1;6412:3;6408:11;6402:18;6398:1;6393:3;6389:11;6382:39;6354:2;6351:1;6347:10;6342:15;;6318:113;;;6465:1;6456:6;6451:3;6447:16;6440:27;6289:184;6227:246;;;:::o;6479:377::-;6567:3;6595:39;6628:5;6595:39;:::i;:::-;6650:71;6714:6;6709:3;6650:71;:::i;:::-;6643:78;;6730:65;6788:6;6783:3;6776:4;6769:5;6765:16;6730:65;:::i;:::-;6820:29;6842:6;6820:29;:::i;:::-;6815:3;6811:39;6804:46;;6571:285;6479:377;;;;:::o;6862:313::-;6975:4;7013:2;7002:9;6998:18;6990:26;;7062:9;7056:4;7052:20;7048:1;7037:9;7033:17;7026:47;7090:78;7163:4;7154:6;7090:78;:::i;:::-;7082:86;;6862:313;;;;:::o;7181:329::-;7240:6;7289:2;7277:9;7268:7;7264:23;7260:32;7257:119;;;7295:79;;:::i;:::-;7257:119;7415:1;7440:53;7485:7;7476:6;7465:9;7461:22;7440:53;:::i;:::-;7430:63;;7386:117;7181:329;;;;:::o;7516:::-;7575:6;7624:2;7612:9;7603:7;7599:23;7595:32;7592:119;;;7630:79;;:::i;:::-;7592:119;7750:1;7775:53;7820:7;7811:6;7800:9;7796:22;7775:53;:::i;:::-;7765:63;;7721:117;7516:329;;;;:::o;7851:311::-;7928:4;8018:18;8010:6;8007:30;8004:56;;;8040:18;;:::i;:::-;8004:56;8090:4;8082:6;8078:17;8070:25;;8150:4;8144;8140:15;8132:23;;7851:311;;;:::o;8168:117::-;8277:1;8274;8267:12;8308:710;8404:5;8429:81;8445:64;8502:6;8445:64;:::i;:::-;8429:81;:::i;:::-;8420:90;;8530:5;8559:6;8552:5;8545:21;8593:4;8586:5;8582:16;8575:23;;8646:4;8638:6;8634:17;8626:6;8622:30;8675:3;8667:6;8664:15;8661:122;;;8694:79;;:::i;:::-;8661:122;8809:6;8792:220;8826:6;8821:3;8818:15;8792:220;;;8901:3;8930:37;8963:3;8951:10;8930:37;:::i;:::-;8925:3;8918:50;8997:4;8992:3;8988:14;8981:21;;8868:144;8852:4;8847:3;8843:14;8836:21;;8792:220;;;8796:21;8410:608;;8308:710;;;;;:::o;9041:370::-;9112:5;9161:3;9154:4;9146:6;9142:17;9138:27;9128:122;;9169:79;;:::i;:::-;9128:122;9286:6;9273:20;9311:94;9401:3;9393:6;9386:4;9378:6;9374:17;9311:94;:::i;:::-;9302:103;;9118:293;9041:370;;;;:::o;9417:307::-;9478:4;9568:18;9560:6;9557:30;9554:56;;;9590:18;;:::i;:::-;9554:56;9628:29;9650:6;9628:29;:::i;:::-;9620:37;;9712:4;9706;9702:15;9694:23;;9417:307;;;:::o;9730:423::-;9807:5;9832:65;9848:48;9889:6;9848:48;:::i;:::-;9832:65;:::i;:::-;9823:74;;9920:6;9913:5;9906:21;9958:4;9951:5;9947:16;9996:3;9987:6;9982:3;9978:16;9975:25;9972:112;;;10003:79;;:::i;:::-;9972:112;10093:54;10140:6;10135:3;10130;10093:54;:::i;:::-;9813:340;9730:423;;;;;:::o;10172:338::-;10227:5;10276:3;10269:4;10261:6;10257:17;10253:27;10243:122;;10284:79;;:::i;:::-;10243:122;10401:6;10388:20;10426:78;10500:3;10492:6;10485:4;10477:6;10473:17;10426:78;:::i;:::-;10417:87;;10233:277;10172:338;;;;:::o;10516:1363::-;10661:6;10669;10677;10685;10734:3;10722:9;10713:7;10709:23;10705:33;10702:120;;;10741:79;;:::i;:::-;10702:120;10861:1;10886:53;10931:7;10922:6;10911:9;10907:22;10886:53;:::i;:::-;10876:63;;10832:117;11016:2;11005:9;11001:18;10988:32;11047:18;11039:6;11036:30;11033:117;;;11069:79;;:::i;:::-;11033:117;11174:78;11244:7;11235:6;11224:9;11220:22;11174:78;:::i;:::-;11164:88;;10959:303;11329:2;11318:9;11314:18;11301:32;11360:18;11352:6;11349:30;11346:117;;;11382:79;;:::i;:::-;11346:117;11487:78;11557:7;11548:6;11537:9;11533:22;11487:78;:::i;:::-;11477:88;;11272:303;11642:2;11631:9;11627:18;11614:32;11673:18;11665:6;11662:30;11659:117;;;11695:79;;:::i;:::-;11659:117;11800:62;11854:7;11845:6;11834:9;11830:22;11800:62;:::i;:::-;11790:72;;11585:287;10516:1363;;;;;;;:::o;11885:1509::-;12039:6;12047;12055;12063;12071;12120:3;12108:9;12099:7;12095:23;12091:33;12088:120;;;12127:79;;:::i;:::-;12088:120;12247:1;12272:53;12317:7;12308:6;12297:9;12293:22;12272:53;:::i;:::-;12262:63;;12218:117;12374:2;12400:53;12445:7;12436:6;12425:9;12421:22;12400:53;:::i;:::-;12390:63;;12345:118;12530:2;12519:9;12515:18;12502:32;12561:18;12553:6;12550:30;12547:117;;;12583:79;;:::i;:::-;12547:117;12688:78;12758:7;12749:6;12738:9;12734:22;12688:78;:::i;:::-;12678:88;;12473:303;12843:2;12832:9;12828:18;12815:32;12874:18;12866:6;12863:30;12860:117;;;12896:79;;:::i;:::-;12860:117;13001:78;13071:7;13062:6;13051:9;13047:22;13001:78;:::i;:::-;12991:88;;12786:303;13156:3;13145:9;13141:19;13128:33;13188:18;13180:6;13177:30;13174:117;;;13210:79;;:::i;:::-;13174:117;13315:62;13369:7;13360:6;13349:9;13345:22;13315:62;:::i;:::-;13305:72;;13099:288;11885:1509;;;;;;;;:::o;13400:77::-;13437:7;13466:5;13455:16;;13400:77;;;:::o;13483:122::-;13556:24;13574:5;13556:24;:::i;:::-;13549:5;13546:35;13536:63;;13595:1;13592;13585:12;13536:63;13483:122;:::o;13611:139::-;13657:5;13695:6;13682:20;13673:29;;13711:33;13738:5;13711:33;:::i;:::-;13611:139;;;;:::o;13756:474::-;13824:6;13832;13881:2;13869:9;13860:7;13856:23;13852:32;13849:119;;;13887:79;;:::i;:::-;13849:119;14007:1;14032:53;14077:7;14068:6;14057:9;14053:22;14032:53;:::i;:::-;14022:63;;13978:117;14134:2;14160:53;14205:7;14196:6;14185:9;14181:22;14160:53;:::i;:::-;14150:63;;14105:118;13756:474;;;;;:::o;14236:311::-;14313:4;14403:18;14395:6;14392:30;14389:56;;;14425:18;;:::i;:::-;14389:56;14475:4;14467:6;14463:17;14455:25;;14535:4;14529;14525:15;14517:23;;14236:311;;;:::o;14570:710::-;14666:5;14691:81;14707:64;14764:6;14707:64;:::i;:::-;14691:81;:::i;:::-;14682:90;;14792:5;14821:6;14814:5;14807:21;14855:4;14848:5;14844:16;14837:23;;14908:4;14900:6;14896:17;14888:6;14884:30;14937:3;14929:6;14926:15;14923:122;;;14956:79;;:::i;:::-;14923:122;15071:6;15054:220;15088:6;15083:3;15080:15;15054:220;;;15163:3;15192:37;15225:3;15213:10;15192:37;:::i;:::-;15187:3;15180:50;15259:4;15254:3;15250:14;15243:21;;15130:144;15114:4;15109:3;15105:14;15098:21;;15054:220;;;15058:21;14672:608;;14570:710;;;;;:::o;15303:370::-;15374:5;15423:3;15416:4;15408:6;15404:17;15400:27;15390:122;;15431:79;;:::i;:::-;15390:122;15548:6;15535:20;15573:94;15663:3;15655:6;15648:4;15640:6;15636:17;15573:94;:::i;:::-;15564:103;;15380:293;15303:370;;;;:::o;15679:894::-;15797:6;15805;15854:2;15842:9;15833:7;15829:23;15825:32;15822:119;;;15860:79;;:::i;:::-;15822:119;16008:1;15997:9;15993:17;15980:31;16038:18;16030:6;16027:30;16024:117;;;16060:79;;:::i;:::-;16024:117;16165:78;16235:7;16226:6;16215:9;16211:22;16165:78;:::i;:::-;16155:88;;15951:302;16320:2;16309:9;16305:18;16292:32;16351:18;16343:6;16340:30;16337:117;;;16373:79;;:::i;:::-;16337:117;16478:78;16548:7;16539:6;16528:9;16524:22;16478:78;:::i;:::-;16468:88;;16263:303;15679:894;;;;;:::o;16579:114::-;16646:6;16680:5;16674:12;16664:22;;16579:114;;;:::o;16699:184::-;16798:11;16832:6;16827:3;16820:19;16872:4;16867:3;16863:14;16848:29;;16699:184;;;;:::o;16889:132::-;16956:4;16979:3;16971:11;;17009:4;17004:3;17000:14;16992:22;;16889:132;;;:::o;17027:108::-;17104:24;17122:5;17104:24;:::i;:::-;17099:3;17092:37;17027:108;;:::o;17141:179::-;17210:10;17231:46;17273:3;17265:6;17231:46;:::i;:::-;17309:4;17304:3;17300:14;17286:28;;17141:179;;;;:::o;17326:113::-;17396:4;17428;17423:3;17419:14;17411:22;;17326:113;;;:::o;17475:732::-;17594:3;17623:54;17671:5;17623:54;:::i;:::-;17693:86;17772:6;17767:3;17693:86;:::i;:::-;17686:93;;17803:56;17853:5;17803:56;:::i;:::-;17882:7;17913:1;17898:284;17923:6;17920:1;17917:13;17898:284;;;17999:6;17993:13;18026:63;18085:3;18070:13;18026:63;:::i;:::-;18019:70;;18112:60;18165:6;18112:60;:::i;:::-;18102:70;;17958:224;17945:1;17942;17938:9;17933:14;;17898:284;;;17902:14;18198:3;18191:10;;17599:608;;;17475:732;;;;:::o;18213:373::-;18356:4;18394:2;18383:9;18379:18;18371:26;;18443:9;18437:4;18433:20;18429:1;18418:9;18414:17;18407:47;18471:108;18574:4;18565:6;18471:108;:::i;:::-;18463:116;;18213:373;;;;:::o;18592:1039::-;18719:6;18727;18735;18784:2;18772:9;18763:7;18759:23;18755:32;18752:119;;;18790:79;;:::i;:::-;18752:119;18910:1;18935:53;18980:7;18971:6;18960:9;18956:22;18935:53;:::i;:::-;18925:63;;18881:117;19065:2;19054:9;19050:18;19037:32;19096:18;19088:6;19085:30;19082:117;;;19118:79;;:::i;:::-;19082:117;19223:78;19293:7;19284:6;19273:9;19269:22;19223:78;:::i;:::-;19213:88;;19008:303;19378:2;19367:9;19363:18;19350:32;19409:18;19401:6;19398:30;19395:117;;;19431:79;;:::i;:::-;19395:117;19536:78;19606:7;19597:6;19586:9;19582:22;19536:78;:::i;:::-;19526:88;;19321:303;18592:1039;;;;;:::o;19637:943::-;19732:6;19740;19748;19756;19805:3;19793:9;19784:7;19780:23;19776:33;19773:120;;;19812:79;;:::i;:::-;19773:120;19932:1;19957:53;20002:7;19993:6;19982:9;19978:22;19957:53;:::i;:::-;19947:63;;19903:117;20059:2;20085:53;20130:7;20121:6;20110:9;20106:22;20085:53;:::i;:::-;20075:63;;20030:118;20187:2;20213:53;20258:7;20249:6;20238:9;20234:22;20213:53;:::i;:::-;20203:63;;20158:118;20343:2;20332:9;20328:18;20315:32;20374:18;20366:6;20363:30;20360:117;;;20396:79;;:::i;:::-;20360:117;20501:62;20555:7;20546:6;20535:9;20531:22;20501:62;:::i;:::-;20491:72;;20286:287;19637:943;;;;;;;:::o;20586:116::-;20656:21;20671:5;20656:21;:::i;:::-;20649:5;20646:32;20636:60;;20692:1;20689;20682:12;20636:60;20586:116;:::o;20708:133::-;20751:5;20789:6;20776:20;20767:29;;20805:30;20829:5;20805:30;:::i;:::-;20708:133;;;;:::o;20847:468::-;20912:6;20920;20969:2;20957:9;20948:7;20944:23;20940:32;20937:119;;;20975:79;;:::i;:::-;20937:119;21095:1;21120:53;21165:7;21156:6;21145:9;21141:22;21120:53;:::i;:::-;21110:63;;21066:117;21222:2;21248:50;21290:7;21281:6;21270:9;21266:22;21248:50;:::i;:::-;21238:60;;21193:115;20847:468;;;;;:::o;21321:329::-;21380:6;21429:2;21417:9;21408:7;21404:23;21400:32;21397:119;;;21435:79;;:::i;:::-;21397:119;21555:1;21580:53;21625:7;21616:6;21605:9;21601:22;21580:53;:::i;:::-;21570:63;;21526:117;21321:329;;;;:::o;21656:118::-;21743:24;21761:5;21743:24;:::i;:::-;21738:3;21731:37;21656:118;;:::o;21780:222::-;21873:4;21911:2;21900:9;21896:18;21888:26;;21924:71;21992:1;21981:9;21977:17;21968:6;21924:71;:::i;:::-;21780:222;;;;:::o;22008:474::-;22076:6;22084;22133:2;22121:9;22112:7;22108:23;22104:32;22101:119;;;22139:79;;:::i;:::-;22101:119;22259:1;22284:53;22329:7;22320:6;22309:9;22305:22;22284:53;:::i;:::-;22274:63;;22230:117;22386:2;22412:53;22457:7;22448:6;22437:9;22433:22;22412:53;:::i;:::-;22402:63;;22357:118;22008:474;;;;;:::o;22488:1089::-;22592:6;22600;22608;22616;22624;22673:3;22661:9;22652:7;22648:23;22644:33;22641:120;;;22680:79;;:::i;:::-;22641:120;22800:1;22825:53;22870:7;22861:6;22850:9;22846:22;22825:53;:::i;:::-;22815:63;;22771:117;22927:2;22953:53;22998:7;22989:6;22978:9;22974:22;22953:53;:::i;:::-;22943:63;;22898:118;23055:2;23081:53;23126:7;23117:6;23106:9;23102:22;23081:53;:::i;:::-;23071:63;;23026:118;23183:2;23209:53;23254:7;23245:6;23234:9;23230:22;23209:53;:::i;:::-;23199:63;;23154:118;23339:3;23328:9;23324:19;23311:33;23371:18;23363:6;23360:30;23357:117;;;23393:79;;:::i;:::-;23357:117;23498:62;23552:7;23543:6;23532:9;23528:22;23498:62;:::i;:::-;23488:72;;23282:288;22488:1089;;;;;;;;:::o;23583:619::-;23660:6;23668;23676;23725:2;23713:9;23704:7;23700:23;23696:32;23693:119;;;23731:79;;:::i;:::-;23693:119;23851:1;23876:53;23921:7;23912:6;23901:9;23897:22;23876:53;:::i;:::-;23866:63;;23822:117;23978:2;24004:53;24049:7;24040:6;24029:9;24025:22;24004:53;:::i;:::-;23994:63;;23949:118;24106:2;24132:53;24177:7;24168:6;24157:9;24153:22;24132:53;:::i;:::-;24122:63;;24077:118;23583:619;;;;;:::o;24208:229::-;24348:34;24344:1;24336:6;24332:14;24325:58;24417:12;24412:2;24404:6;24400:15;24393:37;24208:229;:::o;24443:366::-;24585:3;24606:67;24670:2;24665:3;24606:67;:::i;:::-;24599:74;;24682:93;24771:3;24682:93;:::i;:::-;24800:2;24795:3;24791:12;24784:19;;24443:366;;;:::o;24815:419::-;24981:4;25019:2;25008:9;25004:18;24996:26;;25068:9;25062:4;25058:20;25054:1;25043:9;25039:17;25032:47;25096:131;25222:4;25096:131;:::i;:::-;25088:139;;24815:419;;;:::o;25240:180::-;25288:77;25285:1;25278:88;25385:4;25382:1;25375:15;25409:4;25406:1;25399:15;25426:320;25470:6;25507:1;25501:4;25497:12;25487:22;;25554:1;25548:4;25544:12;25575:18;25565:81;;25631:4;25623:6;25619:17;25609:27;;25565:81;25693:2;25685:6;25682:14;25662:18;25659:38;25656:84;;25712:18;;:::i;:::-;25656:84;25477:269;25426:320;;;:::o;25752:148::-;25854:11;25891:3;25876:18;;25752:148;;;;:::o;25906:141::-;25955:4;25978:3;25970:11;;26001:3;25998:1;25991:14;26035:4;26032:1;26022:18;26014:26;;25906:141;;;:::o;26077:874::-;26180:3;26217:5;26211:12;26246:36;26272:9;26246:36;:::i;:::-;26298:89;26380:6;26375:3;26298:89;:::i;:::-;26291:96;;26418:1;26407:9;26403:17;26434:1;26429:166;;;;26609:1;26604:341;;;;26396:549;;26429:166;26513:4;26509:9;26498;26494:25;26489:3;26482:38;26575:6;26568:14;26561:22;26553:6;26549:35;26544:3;26540:45;26533:52;;26429:166;;26604:341;26671:38;26703:5;26671:38;:::i;:::-;26731:1;26745:154;26759:6;26756:1;26753:13;26745:154;;;26833:7;26827:14;26823:1;26818:3;26814:11;26807:35;26883:1;26874:7;26870:15;26859:26;;26781:4;26778:1;26774:12;26769:17;;26745:154;;;26928:6;26923:3;26919:16;26912:23;;26611:334;;26396:549;;26184:767;;26077:874;;;;:::o;26957:390::-;27063:3;27091:39;27124:5;27091:39;:::i;:::-;27146:89;27228:6;27223:3;27146:89;:::i;:::-;27139:96;;27244:65;27302:6;27297:3;27290:4;27283:5;27279:16;27244:65;:::i;:::-;27334:6;27329:3;27325:16;27318:23;;27067:280;26957:390;;;;:::o;27353:155::-;27493:7;27489:1;27481:6;27477:14;27470:31;27353:155;:::o;27514:400::-;27674:3;27695:84;27777:1;27772:3;27695:84;:::i;:::-;27688:91;;27788:93;27877:3;27788:93;:::i;:::-;27906:1;27901:3;27897:11;27890:18;;27514:400;;;:::o;27920:695::-;28198:3;28220:92;28308:3;28299:6;28220:92;:::i;:::-;28213:99;;28329:95;28420:3;28411:6;28329:95;:::i;:::-;28322:102;;28441:148;28585:3;28441:148;:::i;:::-;28434:155;;28606:3;28599:10;;27920:695;;;;;:::o;28621:237::-;28761:34;28757:1;28749:6;28745:14;28738:58;28830:20;28825:2;28817:6;28813:15;28806:45;28621:237;:::o;28864:366::-;29006:3;29027:67;29091:2;29086:3;29027:67;:::i;:::-;29020:74;;29103:93;29192:3;29103:93;:::i;:::-;29221:2;29216:3;29212:12;29205:19;;28864:366;;;:::o;29236:419::-;29402:4;29440:2;29429:9;29425:18;29417:26;;29489:9;29483:4;29479:20;29475:1;29464:9;29460:17;29453:47;29517:131;29643:4;29517:131;:::i;:::-;29509:139;;29236:419;;;:::o;29661:234::-;29801:34;29797:1;29789:6;29785:14;29778:58;29870:17;29865:2;29857:6;29853:15;29846:42;29661:234;:::o;29901:366::-;30043:3;30064:67;30128:2;30123:3;30064:67;:::i;:::-;30057:74;;30140:93;30229:3;30140:93;:::i;:::-;30258:2;30253:3;30249:12;30242:19;;29901:366;;;:::o;30273:419::-;30439:4;30477:2;30466:9;30462:18;30454:26;;30526:9;30520:4;30516:20;30512:1;30501:9;30497:17;30490:47;30554:131;30680:4;30554:131;:::i;:::-;30546:139;;30273:419;;;:::o;30698:228::-;30838:34;30834:1;30826:6;30822:14;30815:58;30907:11;30902:2;30894:6;30890:15;30883:36;30698:228;:::o;30932:366::-;31074:3;31095:67;31159:2;31154:3;31095:67;:::i;:::-;31088:74;;31171:93;31260:3;31171:93;:::i;:::-;31289:2;31284:3;31280:12;31273:19;;30932:366;;;:::o;31304:419::-;31470:4;31508:2;31497:9;31493:18;31485:26;;31557:9;31551:4;31547:20;31543:1;31532:9;31528:17;31521:47;31585:131;31711:4;31585:131;:::i;:::-;31577:139;;31304:419;;;:::o;31729:180::-;31777:77;31774:1;31767:88;31874:4;31871:1;31864:15;31898:4;31895:1;31888:15;31915:180;31963:77;31960:1;31953:88;32060:4;32057:1;32050:15;32084:4;32081:1;32074:15;32101:233;32140:3;32163:24;32181:5;32163:24;:::i;:::-;32154:33;;32209:66;32202:5;32199:77;32196:103;;32279:18;;:::i;:::-;32196:103;32326:1;32319:5;32315:13;32308:20;;32101:233;;;:::o;32340:228::-;32480:34;32476:1;32468:6;32464:14;32457:58;32549:11;32544:2;32536:6;32532:15;32525:36;32340:228;:::o;32574:366::-;32716:3;32737:67;32801:2;32796:3;32737:67;:::i;:::-;32730:74;;32813:93;32902:3;32813:93;:::i;:::-;32931:2;32926:3;32922:12;32915:19;;32574:366;;;:::o;32946:419::-;33112:4;33150:2;33139:9;33135:18;33127:26;;33199:9;33193:4;33189:20;33185:1;33174:9;33170:17;33163:47;33227:131;33353:4;33227:131;:::i;:::-;33219:139;;32946:419;;;:::o;33371:93::-;33408:6;33455:2;33450;33443:5;33439:14;33435:23;33425:33;;33371:93;;;:::o;33470:107::-;33514:8;33564:5;33558:4;33554:16;33533:37;;33470:107;;;;:::o;33583:393::-;33652:6;33702:1;33690:10;33686:18;33725:97;33755:66;33744:9;33725:97;:::i;:::-;33843:39;33873:8;33862:9;33843:39;:::i;:::-;33831:51;;33915:4;33911:9;33904:5;33900:21;33891:30;;33964:4;33954:8;33950:19;33943:5;33940:30;33930:40;;33659:317;;33583:393;;;;;:::o;33982:60::-;34010:3;34031:5;34024:12;;33982:60;;;:::o;34048:142::-;34098:9;34131:53;34149:34;34158:24;34176:5;34158:24;:::i;:::-;34149:34;:::i;:::-;34131:53;:::i;:::-;34118:66;;34048:142;;;:::o;34196:75::-;34239:3;34260:5;34253:12;;34196:75;;;:::o;34277:269::-;34387:39;34418:7;34387:39;:::i;:::-;34448:91;34497:41;34521:16;34497:41;:::i;:::-;34489:6;34482:4;34476:11;34448:91;:::i;:::-;34442:4;34435:105;34353:193;34277:269;;;:::o;34552:73::-;34597:3;34552:73;:::o;34631:189::-;34708:32;;:::i;:::-;34749:65;34807:6;34799;34793:4;34749:65;:::i;:::-;34684:136;34631:189;;:::o;34826:186::-;34886:120;34903:3;34896:5;34893:14;34886:120;;;34957:39;34994:1;34987:5;34957:39;:::i;:::-;34930:1;34923:5;34919:13;34910:22;;34886:120;;;34826:186;;:::o;35018:543::-;35119:2;35114:3;35111:11;35108:446;;;35153:38;35185:5;35153:38;:::i;:::-;35237:29;35255:10;35237:29;:::i;:::-;35227:8;35223:44;35420:2;35408:10;35405:18;35402:49;;;35441:8;35426:23;;35402:49;35464:80;35520:22;35538:3;35520:22;:::i;:::-;35510:8;35506:37;35493:11;35464:80;:::i;:::-;35123:431;;35108:446;35018:543;;;:::o;35567:117::-;35621:8;35671:5;35665:4;35661:16;35640:37;;35567:117;;;;:::o;35690:169::-;35734:6;35767:51;35815:1;35811:6;35803:5;35800:1;35796:13;35767:51;:::i;:::-;35763:56;35848:4;35842;35838:15;35828:25;;35741:118;35690:169;;;;:::o;35864:295::-;35940:4;36086:29;36111:3;36105:4;36086:29;:::i;:::-;36078:37;;36148:3;36145:1;36141:11;36135:4;36132:21;36124:29;;35864:295;;;;:::o;36164:1395::-;36281:37;36314:3;36281:37;:::i;:::-;36383:18;36375:6;36372:30;36369:56;;;36405:18;;:::i;:::-;36369:56;36449:38;36481:4;36475:11;36449:38;:::i;:::-;36534:67;36594:6;36586;36580:4;36534:67;:::i;:::-;36628:1;36652:4;36639:17;;36684:2;36676:6;36673:14;36701:1;36696:618;;;;37358:1;37375:6;37372:77;;;37424:9;37419:3;37415:19;37409:26;37400:35;;37372:77;37475:67;37535:6;37528:5;37475:67;:::i;:::-;37469:4;37462:81;37331:222;36666:887;;36696:618;36748:4;36744:9;36736:6;36732:22;36782:37;36814:4;36782:37;:::i;:::-;36841:1;36855:208;36869:7;36866:1;36863:14;36855:208;;;36948:9;36943:3;36939:19;36933:26;36925:6;36918:42;36999:1;36991:6;36987:14;36977:24;;37046:2;37035:9;37031:18;37018:31;;36892:4;36889:1;36885:12;36880:17;;36855:208;;;37091:6;37082:7;37079:19;37076:179;;;37149:9;37144:3;37140:19;37134:26;37192:48;37234:4;37226:6;37222:17;37211:9;37192:48;:::i;:::-;37184:6;37177:64;37099:156;37076:179;37301:1;37297;37289:6;37285:14;37281:22;37275:4;37268:36;36703:611;;;36666:887;;36256:1303;;;36164:1395;;:::o;37565:180::-;37613:77;37610:1;37603:88;37710:4;37707:1;37700:15;37734:4;37731:1;37724:15;37751:185;37791:1;37808:20;37826:1;37808:20;:::i;:::-;37803:25;;37842:20;37860:1;37842:20;:::i;:::-;37837:25;;37881:1;37871:35;;37886:18;;:::i;:::-;37871:35;37928:1;37925;37921:9;37916:14;;37751:185;;;;:::o;37942:194::-;37982:4;38002:20;38020:1;38002:20;:::i;:::-;37997:25;;38036:20;38054:1;38036:20;:::i;:::-;38031:25;;38080:1;38077;38073:9;38065:17;;38104:1;38098:4;38095:11;38092:37;;;38109:18;;:::i;:::-;38092:37;37942:194;;;;:::o;38142:176::-;38174:1;38191:20;38209:1;38191:20;:::i;:::-;38186:25;;38225:20;38243:1;38225:20;:::i;:::-;38220:25;;38264:1;38254:35;;38269:18;;:::i;:::-;38254:35;38310:1;38307;38303:9;38298:14;;38142:176;;;;:::o;38324:191::-;38364:3;38383:20;38401:1;38383:20;:::i;:::-;38378:25;;38417:20;38435:1;38417:20;:::i;:::-;38412:25;;38460:1;38457;38453:9;38446:16;;38481:3;38478:1;38475:10;38472:36;;;38488:18;;:::i;:::-;38472:36;38324:191;;;;:::o;38521:220::-;38661:34;38657:1;38649:6;38645:14;38638:58;38730:3;38725:2;38717:6;38713:15;38706:28;38521:220;:::o;38747:366::-;38889:3;38910:67;38974:2;38969:3;38910:67;:::i;:::-;38903:74;;38986:93;39075:3;38986:93;:::i;:::-;39104:2;39099:3;39095:12;39088:19;;38747:366;;;:::o;39119:419::-;39285:4;39323:2;39312:9;39308:18;39300:26;;39372:9;39366:4;39362:20;39358:1;39347:9;39343:17;39336:47;39400:131;39526:4;39400:131;:::i;:::-;39392:139;;39119:419;;;:::o;39544:227::-;39684:34;39680:1;39672:6;39668:14;39661:58;39753:10;39748:2;39740:6;39736:15;39729:35;39544:227;:::o;39777:366::-;39919:3;39940:67;40004:2;39999:3;39940:67;:::i;:::-;39933:74;;40016:93;40105:3;40016:93;:::i;:::-;40134:2;40129:3;40125:12;40118:19;;39777:366;;;:::o;40149:419::-;40315:4;40353:2;40342:9;40338:18;40330:26;;40402:9;40396:4;40392:20;40388:1;40377:9;40373:17;40366:47;40430:131;40556:4;40430:131;:::i;:::-;40422:139;;40149:419;;;:::o;40574:634::-;40795:4;40833:2;40822:9;40818:18;40810:26;;40882:9;40876:4;40872:20;40868:1;40857:9;40853:17;40846:47;40910:108;41013:4;41004:6;40910:108;:::i;:::-;40902:116;;41065:9;41059:4;41055:20;41050:2;41039:9;41035:18;41028:48;41093:108;41196:4;41187:6;41093:108;:::i;:::-;41085:116;;40574:634;;;;;:::o;41214:224::-;41354:34;41350:1;41342:6;41338:14;41331:58;41423:7;41418:2;41410:6;41406:15;41399:32;41214:224;:::o;41444:366::-;41586:3;41607:67;41671:2;41666:3;41607:67;:::i;:::-;41600:74;;41683:93;41772:3;41683:93;:::i;:::-;41801:2;41796:3;41792:12;41785:19;;41444:366;;;:::o;41816:419::-;41982:4;42020:2;42009:9;42005:18;41997:26;;42069:9;42063:4;42059:20;42055:1;42044:9;42040:17;42033:47;42097:131;42223:4;42097:131;:::i;:::-;42089:139;;41816:419;;;:::o;42241:229::-;42381:34;42377:1;42369:6;42365:14;42358:58;42450:12;42445:2;42437:6;42433:15;42426:37;42241:229;:::o;42476:366::-;42618:3;42639:67;42703:2;42698:3;42639:67;:::i;:::-;42632:74;;42715:93;42804:3;42715:93;:::i;:::-;42833:2;42828:3;42824:12;42817:19;;42476:366;;;:::o;42848:419::-;43014:4;43052:2;43041:9;43037:18;43029:26;;43101:9;43095:4;43091:20;43087:1;43076:9;43072:17;43065:47;43129:131;43255:4;43129:131;:::i;:::-;43121:139;;42848:419;;;:::o;43273:170::-;43413:22;43409:1;43401:6;43397:14;43390:46;43273:170;:::o;43449:366::-;43591:3;43612:67;43676:2;43671:3;43612:67;:::i;:::-;43605:74;;43688:93;43777:3;43688:93;:::i;:::-;43806:2;43801:3;43797:12;43790:19;;43449:366;;;:::o;43821:419::-;43987:4;44025:2;44014:9;44010:18;44002:26;;44074:9;44068:4;44064:20;44060:1;44049:9;44045:17;44038:47;44102:131;44228:4;44102:131;:::i;:::-;44094:139;;43821:419;;;:::o;44246:118::-;44333:24;44351:5;44333:24;:::i;:::-;44328:3;44321:37;44246:118;;:::o;44370:222::-;44463:4;44501:2;44490:9;44486:18;44478:26;;44514:71;44582:1;44571:9;44567:17;44558:6;44514:71;:::i;:::-;44370:222;;;;:::o;44598:::-;44738:34;44734:1;44726:6;44722:14;44715:58;44807:5;44802:2;44794:6;44790:15;44783:30;44598:222;:::o;44826:366::-;44968:3;44989:67;45053:2;45048:3;44989:67;:::i;:::-;44982:74;;45065:93;45154:3;45065:93;:::i;:::-;45183:2;45178:3;45174:12;45167:19;;44826:366;;;:::o;45198:419::-;45364:4;45402:2;45391:9;45387:18;45379:26;;45451:9;45445:4;45441:20;45437:1;45426:9;45422:17;45415:47;45479:131;45605:4;45479:131;:::i;:::-;45471:139;;45198:419;;;:::o;45623:223::-;45763:34;45759:1;45751:6;45747:14;45740:58;45832:6;45827:2;45819:6;45815:15;45808:31;45623:223;:::o;45852:366::-;45994:3;46015:67;46079:2;46074:3;46015:67;:::i;:::-;46008:74;;46091:93;46180:3;46091:93;:::i;:::-;46209:2;46204:3;46200:12;46193:19;;45852:366;;;:::o;46224:419::-;46390:4;46428:2;46417:9;46413:18;46405:26;;46477:9;46471:4;46467:20;46463:1;46452:9;46448:17;46441:47;46505:131;46631:4;46505:131;:::i;:::-;46497:139;;46224:419;;;:::o;46649:332::-;46770:4;46808:2;46797:9;46793:18;46785:26;;46821:71;46889:1;46878:9;46874:17;46865:6;46821:71;:::i;:::-;46902:72;46970:2;46959:9;46955:18;46946:6;46902:72;:::i;:::-;46649:332;;;;;:::o;46987:166::-;47127:18;47123:1;47115:6;47111:14;47104:42;46987:166;:::o;47159:366::-;47301:3;47322:67;47386:2;47381:3;47322:67;:::i;:::-;47315:74;;47398:93;47487:3;47398:93;:::i;:::-;47516:2;47511:3;47507:12;47500:19;;47159:366;;;:::o;47531:419::-;47697:4;47735:2;47724:9;47720:18;47712:26;;47784:9;47778:4;47774:20;47770:1;47759:9;47755:17;47748:47;47812:131;47938:4;47812:131;:::i;:::-;47804:139;;47531:419;;;:::o;47956:228::-;48096:34;48092:1;48084:6;48080:14;48073:58;48165:11;48160:2;48152:6;48148:15;48141:36;47956:228;:::o;48190:366::-;48332:3;48353:67;48417:2;48412:3;48353:67;:::i;:::-;48346:74;;48429:93;48518:3;48429:93;:::i;:::-;48547:2;48542:3;48538:12;48531:19;;48190:366;;;:::o;48562:419::-;48728:4;48766:2;48755:9;48751:18;48743:26;;48815:9;48809:4;48805:20;48801:1;48790:9;48786:17;48779:47;48843:131;48969:4;48843:131;:::i;:::-;48835:139;;48562:419;;;:::o;48987:173::-;49127:25;49123:1;49115:6;49111:14;49104:49;48987:173;:::o;49166:402::-;49326:3;49347:85;49429:2;49424:3;49347:85;:::i;:::-;49340:92;;49441:93;49530:3;49441:93;:::i;:::-;49559:2;49554:3;49550:12;49543:19;;49166:402;;;:::o;49574:167::-;49714:19;49710:1;49702:6;49698:14;49691:43;49574:167;:::o;49747:402::-;49907:3;49928:85;50010:2;50005:3;49928:85;:::i;:::-;49921:92;;50022:93;50111:3;50022:93;:::i;:::-;50140:2;50135:3;50131:12;50124:19;;49747:402;;;:::o;50155:967::-;50537:3;50559:148;50703:3;50559:148;:::i;:::-;50552:155;;50724:95;50815:3;50806:6;50724:95;:::i;:::-;50717:102;;50836:148;50980:3;50836:148;:::i;:::-;50829:155;;51001:95;51092:3;51083:6;51001:95;:::i;:::-;50994:102;;51113:3;51106:10;;50155:967;;;;;:::o;51128:98::-;51179:6;51213:5;51207:12;51197:22;;51128:98;;;:::o;51232:168::-;51315:11;51349:6;51344:3;51337:19;51389:4;51384:3;51380:14;51365:29;;51232:168;;;;:::o;51406:373::-;51492:3;51520:38;51552:5;51520:38;:::i;:::-;51574:70;51637:6;51632:3;51574:70;:::i;:::-;51567:77;;51653:65;51711:6;51706:3;51699:4;51692:5;51688:16;51653:65;:::i;:::-;51743:29;51765:6;51743:29;:::i;:::-;51738:3;51734:39;51727:46;;51496:283;51406:373;;;;:::o;51785:1053::-;52108:4;52146:3;52135:9;52131:19;52123:27;;52160:71;52228:1;52217:9;52213:17;52204:6;52160:71;:::i;:::-;52241:72;52309:2;52298:9;52294:18;52285:6;52241:72;:::i;:::-;52360:9;52354:4;52350:20;52345:2;52334:9;52330:18;52323:48;52388:108;52491:4;52482:6;52388:108;:::i;:::-;52380:116;;52543:9;52537:4;52533:20;52528:2;52517:9;52513:18;52506:48;52571:108;52674:4;52665:6;52571:108;:::i;:::-;52563:116;;52727:9;52721:4;52717:20;52711:3;52700:9;52696:19;52689:49;52755:76;52826:4;52817:6;52755:76;:::i;:::-;52747:84;;51785:1053;;;;;;;;:::o;52844:141::-;52900:5;52931:6;52925:13;52916:22;;52947:32;52973:5;52947:32;:::i;:::-;52844:141;;;;:::o;52991:349::-;53060:6;53109:2;53097:9;53088:7;53084:23;53080:32;53077:119;;;53115:79;;:::i;:::-;53077:119;53235:1;53260:63;53315:7;53306:6;53295:9;53291:22;53260:63;:::i;:::-;53250:73;;53206:127;52991:349;;;;:::o;53346:106::-;53390:8;53439:5;53434:3;53430:15;53409:36;;53346:106;;;:::o;53458:183::-;53493:3;53531:1;53513:16;53510:23;53507:128;;;53569:1;53566;53563;53548:23;53591:34;53622:1;53616:8;53591:34;:::i;:::-;53584:41;;53507:128;53458:183;:::o;53647:711::-;53686:3;53724:4;53706:16;53703:26;53732:5;53700:39;53761:20;;:::i;:::-;53836:1;53818:16;53814:24;53811:1;53805:4;53790:49;53869:4;53863:11;53968:16;53961:4;53953:6;53949:17;53946:39;53913:18;53905:6;53902:30;53886:113;53883:146;;;54014:5;;;;53883:146;54060:6;54054:4;54050:17;54096:3;54090:10;54123:18;54115:6;54112:30;54109:43;;;54145:5;;;;;;54109:43;54193:6;54186:4;54181:3;54177:14;54173:27;54252:1;54234:16;54230:24;54224:4;54220:35;54215:3;54212:44;54209:57;;;54259:5;;;;;;;54209:57;54276;54324:6;54318:4;54314:17;54306:6;54302:30;54296:4;54276:57;:::i;:::-;54349:3;54342:10;;53690:668;;;;;53647:711;;:::o;54364:239::-;54504:34;54500:1;54492:6;54488:14;54481:58;54573:22;54568:2;54560:6;54556:15;54549:47;54364:239;:::o;54609:366::-;54751:3;54772:67;54836:2;54831:3;54772:67;:::i;:::-;54765:74;;54848:93;54937:3;54848:93;:::i;:::-;54966:2;54961:3;54957:12;54950:19;;54609:366;;;:::o;54981:419::-;55147:4;55185:2;55174:9;55170:18;55162:26;;55234:9;55228:4;55224:20;55220:1;55209:9;55205:17;55198:47;55262:131;55388:4;55262:131;:::i;:::-;55254:139;;54981:419;;;:::o;55406:227::-;55546:34;55542:1;55534:6;55530:14;55523:58;55615:10;55610:2;55602:6;55598:15;55591:35;55406:227;:::o;55639:366::-;55781:3;55802:67;55866:2;55861:3;55802:67;:::i;:::-;55795:74;;55878:93;55967:3;55878:93;:::i;:::-;55996:2;55991:3;55987:12;55980:19;;55639:366;;;:::o;56011:419::-;56177:4;56215:2;56204:9;56200:18;56192:26;;56264:9;56258:4;56254:20;56250:1;56239:9;56235:17;56228:47;56292:131;56418:4;56292:131;:::i;:::-;56284:139;;56011:419;;;:::o;56436:751::-;56659:4;56697:3;56686:9;56682:19;56674:27;;56711:71;56779:1;56768:9;56764:17;56755:6;56711:71;:::i;:::-;56792:72;56860:2;56849:9;56845:18;56836:6;56792:72;:::i;:::-;56874;56942:2;56931:9;56927:18;56918:6;56874:72;:::i;:::-;56956;57024:2;57013:9;57009:18;57000:6;56956:72;:::i;:::-;57076:9;57070:4;57066:20;57060:3;57049:9;57045:19;57038:49;57104:76;57175:4;57166:6;57104:76;:::i;:::-;57096:84;;56436:751;;;;;;;;:::o;57193:410::-;57233:7;57256:20;57274:1;57256:20;:::i;:::-;57251:25;;57290:20;57308:1;57290:20;:::i;:::-;57285:25;;57345:1;57342;57338:9;57367:30;57385:11;57367:30;:::i;:::-;57356:41;;57546:1;57537:7;57533:15;57530:1;57527:22;57507:1;57500:9;57480:83;57457:139;;57576:18;;:::i;:::-;57457:139;57241:362;57193:410;;;;:::o;57609:171::-;57648:3;57671:24;57689:5;57671:24;:::i;:::-;57662:33;;57717:4;57710:5;57707:15;57704:41;;57725:18;;:::i;:::-;57704:41;57772:1;57765:5;57761:13;57754:20;;57609:171;;;:::o;57786:182::-;57926:34;57922:1;57914:6;57910:14;57903:58;57786:182;:::o;57974:366::-;58116:3;58137:67;58201:2;58196:3;58137:67;:::i;:::-;58130:74;;58213:93;58302:3;58213:93;:::i;:::-;58331:2;58326:3;58322:12;58315:19;;57974:366;;;:::o;58346:419::-;58512:4;58550:2;58539:9;58535:18;58527:26;;58599:9;58593:4;58589:20;58585:1;58574:9;58570:17;58563:47;58627:131;58753:4;58627:131;:::i;:::-;58619:139;;58346:419;;;:::o;58771:176::-;58911:28;58907:1;58899:6;58895:14;58888:52;58771:176;:::o;58953:366::-;59095:3;59116:67;59180:2;59175:3;59116:67;:::i;:::-;59109:74;;59192:93;59281:3;59192:93;:::i;:::-;59310:2;59305:3;59301:12;59294:19;;58953:366;;;:::o;59325:419::-;59491:4;59529:2;59518:9;59514:18;59506:26;;59578:9;59572:4;59568:20;59564:1;59553:9;59549:17;59542:47;59606:131;59732:4;59606:131;:::i;:::-;59598:139;;59325:419;;;:::o;59750:225::-;59890:34;59886:1;59878:6;59874:14;59867:58;59959:8;59954:2;59946:6;59942:15;59935:33;59750:225;:::o;59981:366::-;60123:3;60144:67;60208:2;60203:3;60144:67;:::i;:::-;60137:74;;60220:93;60309:3;60220:93;:::i;:::-;60338:2;60333:3;60329:12;60322:19;;59981:366;;;:::o;60353:419::-;60519:4;60557:2;60546:9;60542:18;60534:26;;60606:9;60600:4;60596:20;60592:1;60581:9;60577:17;60570:47;60634:131;60760:4;60634:131;:::i;:::-;60626:139;;60353:419;;;:::o;60778:227::-;60918:34;60914:1;60906:6;60902:14;60895:58;60987:10;60982:2;60974:6;60970:15;60963:35;60778:227;:::o;61011:366::-;61153:3;61174:67;61238:2;61233:3;61174:67;:::i;:::-;61167:74;;61250:93;61339:3;61250:93;:::i;:::-;61368:2;61363:3;61359:12;61352:19;;61011:366;;;:::o;61383:419::-;61549:4;61587:2;61576:9;61572:18;61564:26;;61636:9;61630:4;61626:20;61622:1;61611:9;61607:17;61600:47;61664:131;61790:4;61664:131;:::i;:::-;61656:139;;61383:419;;;:::o

Swarm Source

ipfs://4aa54b93522ee7090ef2b6057c2a82a019afc2ea781ddaaf7b49b709c8b21e47
[ 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.