ETH Price: $3,416.06 (+3.64%)

Contract

0xA7a05e655cbeD5356d2fA851e96f7f68E4A6f954
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Set Approval For...212379012024-11-21 18:29:2343 hrs ago1732213763IN
0xA7a05e65...8E4A6f954
0 ETH0.0010777823.38491143
Set Approval For...211536202024-11-10 0:15:4713 days ago1731197747IN
0xA7a05e65...8E4A6f954
0 ETH0.000589712.79496977
Set Approval For...210976072024-11-02 4:35:1121 days ago1730522111IN
0xA7a05e65...8E4A6f954
0 ETH0.000184694
Set Approval For...207158682024-09-09 21:53:5974 days ago1725918839IN
0xA7a05e65...8E4A6f954
0 ETH0.000127422.76037834
Set Approval For...205612602024-08-19 7:43:5996 days ago1724053439IN
0xA7a05e65...8E4A6f954
0 ETH0.00006491.40819096
Set Approval For...205491462024-08-17 15:09:1197 days ago1723907351IN
0xA7a05e65...8E4A6f954
0 ETH0.000067852.79677891
Mint203898102024-07-26 9:24:23120 days ago1721985863IN
0xA7a05e65...8E4A6f954
0 ETH0.000532174.4046227
Set Approval For...203633722024-07-22 16:50:23123 days ago1721667023IN
0xA7a05e65...8E4A6f954
0 ETH0.000457839.93373753
Set Approval For...202937842024-07-12 23:43:11133 days ago1720827791IN
0xA7a05e65...8E4A6f954
0 ETH0.000149013.2280918
Set Approval For...201714062024-06-25 21:33:11150 days ago1719351191IN
0xA7a05e65...8E4A6f954
0 ETH0.000287786.24411941
Set Approval For...199281742024-05-22 21:42:11184 days ago1716414131IN
0xA7a05e65...8E4A6f954
0 ETH0.0005031110.91619785
Set Approval For...198545252024-05-12 14:26:23194 days ago1715523983IN
0xA7a05e65...8E4A6f954
0 ETH0.0003056.61766837
Set Approval For...198483162024-05-11 17:35:47195 days ago1715448947IN
0xA7a05e65...8E4A6f954
0 ETH0.00020974.54993641
Set Approval For...198483102024-05-11 17:34:35195 days ago1715448875IN
0xA7a05e65...8E4A6f954
0 ETH0.000208924.52487774
Set Approval For...198358232024-05-09 23:39:59197 days ago1715297999IN
0xA7a05e65...8E4A6f954
0 ETH0.00008843.6437862
Set Approval For...190981952024-01-27 13:24:35301 days ago1706361875IN
0xA7a05e65...8E4A6f954
0 ETH0.0002886111.89643218
Set Approval For...190915572024-01-26 15:04:47301 days ago1706281487IN
0xA7a05e65...8E4A6f954
0 ETH0.0005546822.86321723
Set Approval For...190740832024-01-24 4:20:35304 days ago1706070035IN
0xA7a05e65...8E4A6f954
0 ETH0.000218679.01361427
Set Approval For...190659392024-01-23 0:54:23305 days ago1705971263IN
0xA7a05e65...8E4A6f954
0 ETH0.0002476210.24198189
Set Approval For...189884612024-01-12 4:33:47316 days ago1705034027IN
0xA7a05e65...8E4A6f954
0 ETH0.0007337615.92062705
Safe Transfer Fr...189883882024-01-12 4:18:47316 days ago1705033127IN
0xA7a05e65...8E4A6f954
0 ETH0.0008927916.63648438
Safe Transfer Fr...189682402024-01-09 8:32:59319 days ago1704789179IN
0xA7a05e65...8E4A6f954
0 ETH0.0017505132.57320384
Set Approval For...182959172023-10-07 3:26:59413 days ago1696649219IN
0xA7a05e65...8E4A6f954
0 ETH0.000330047.14797541
Set Approval For...180809322023-09-07 0:19:35443 days ago1694045975IN
0xA7a05e65...8E4A6f954
0 ETH0.0004608910
Safe Transfer Fr...180808972023-09-07 0:12:35443 days ago1694045555IN
0xA7a05e65...8E4A6f954
0 ETH0.0005904411
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
REVVInventory

Compiler Version
v0.6.8+commit.0bbfe453

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-02-09
*/

// Sources flattened with hardhat v2.0.8 https://hardhat.org

// File @openzeppelin/contracts/utils/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.6.2 <0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC721/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC721 Non-Fungible Token Standard, basic interface
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 * Note: The ERC-165 identifier for this interface is 0x80ac58cd.
 */
interface IERC721 {
    event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);

    event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    /**
     * Gets the balance of the specified address
     * @param owner address to query the balance of
     * @return balance uint256 representing the amount owned by the passed address
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * Gets the owner of the specified ID
     * @param tokenId uint256 ID to query the owner of
     * @return owner address currently marked as the owner of the given ID
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * Approves another address to transfer the given token ID
     * @dev The zero address indicates there is no approved address.
     * @dev There can only be one approved address per token at a given time.
     * @dev Can only be called by the token owner or an approved operator.
     * @param to address to be approved for the given token ID
     * @param tokenId uint256 ID of the token to be approved
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * Gets the approved address for a token ID, or zero if no address set
     * @dev Reverts if the token ID does not exist.
     * @param tokenId uint256 ID of the token to query the approval of
     * @return operator address currently approved for the given token ID
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * Sets or unsets the approval of a given operator
     * @dev An operator is allowed to transfer all tokens of the sender on their behalf
     * @param operator operator address to set the approval
     * @param approved representing the status of the approval to be set
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * Tells whether an operator is approved by a given owner
     * @param owner owner address which you want to query the approval of
     * @param operator operator address which you want to query the approval of
     * @return bool whether the given operator is approved by the given owner
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * Transfers the ownership of a given token ID to another address
     * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * Safely transfers the ownership of a given token ID to another address
     *
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * Safely transfers the ownership of a given token ID to another address
     *
     * If the target address is a contract, it must implement `onERC721Received`,
     * which is called upon a safe transfer, and return the magic value
     * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise,
     * the transfer is reverted.
     *
     * @dev Requires the msg sender to be the owner, approved, or operator
     * @param from current owner of the token
     * @param to address to receive the ownership of the given token ID
     * @param tokenId uint256 ID of the token to be transferred
     * @param data bytes data to send along with a safe transfer check
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC721/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 * Note: The ERC-165 identifier for this interface is 0x5b5e139f.
 */
interface IERC721Metadata {
    /**
     * @dev Gets the token name
     * @return string representing the token name
     */
    function name() external view returns (string memory);

    /**
     * @dev Gets the token symbol
     * @return string representing the token symbol
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns an URI for a given token ID
     * Throws if the token ID does not exist. May return an empty string.
     * @param tokenId uint256 ID of the token to query
     * @return string URI of given token ID
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC721/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC721 Non-Fungible Token Standard, optional unsafe batchTransfer interface
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 * Note: The ERC-165 identifier for this interface is.
 */
interface IERC721BatchTransfer {
    /**
     * Unsafely transfers a batch of tokens.
     * @dev Usage of this method is discouraged, use `safeTransferFrom` whenever possible
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `tokenIds` is not owned by `from`.
     * @dev Resets the token approval for each of `tokenIds`.
     * @dev Emits an {IERC721-Transfer} event for each of `tokenIds`.
     * @param from Current tokens owner.
     * @param to Address of the new token owner.
     * @param tokenIds Identifiers of the tokens to transfer.
     */
    function batchTransferFrom(
        address from,
        address to,
        uint256[] calldata tokenIds
    ) external;
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC721/[email protected]

pragma solidity 0.6.8;

/**
    @title ERC721 Non-Fungible Token Standard, token receiver
    @dev See https://eips.ethereum.org/EIPS/eip-721
    Interface for any contract that wants to support safeTransfers from ERC721 asset contracts.
    Note: The ERC-165 identifier for this interface is 0x150b7a02.
 */
interface IERC721Receiver {
    /**
        @notice Handle the receipt of an NFT
        @dev The ERC721 smart contract calls this function on the recipient
        after a {IERC721-safeTransferFrom}. This function MUST return the function selector,
        otherwise the caller will revert the transaction. The selector to be
        returned can be obtained as `this.onERC721Received.selector`. This
        function MAY throw to revert and reject the transfer.
        Note: the ERC721 contract address is always the message sender.
        @param operator The address which called `safeTransferFrom` function
        @param from The address which previously owned the token
        @param tokenId The NFT identifier which is being transferred
        @param data Additional data with no specified format
        @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/GSN/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/*
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with GSN 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 payable) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes memory) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


// File @openzeppelin/contracts/introspection/[email protected]

pragma solidity >=0.6.0 <0.8.0;

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


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC-1155 Multi Token Standard, basic interface
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value);

    event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values);

    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    event URI(string _value, uint256 indexed _id);

    /**
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits a `TransferSingle` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance for any of `ids`.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits a `TransferBatch` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;

    /**
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return The balance of `id` owned by account `owner`.
     */
    function balanceOf(address owner, uint256 id) external view returns (uint256);

    /**
     * Retrieves the balances of `ids` owned by accounts `owners`. For each pair:
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The addresses of the token holders
     * @param ids The identifiers to retrieve the balance of.
     * @return The balances of `ids` owned by accounts `owners`.
     */
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * Enables or disables an operator's approval.
     * @dev Emits an `ApprovalForAll` event.
     * @param operator Address of the operator.
     * @param approved True to approve the operator, false to revoke an approval.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * Retrieves the approval status of an operator for a given owner.
     * @param owner Address of the authorisation giver.
     * @param operator Address of the operator.
     * @return True if the operator is approved, false if not.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC-1155 Multi Token Standard, optional metadata URI extension
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * Note: The ERC-165 identifier for this interface is 0x0e89341c.
 */
interface IERC1155MetadataURI {
    /**
     * @notice A distinct Uniform Resource Identifier (URI) for a given token.
     * @dev URIs are defined in RFC 3986.
     * @dev The URI MUST point to a JSON file that conforms to the "ERC-1155 Metadata URI JSON Schema".
     * @dev The uri function SHOULD be used to retrieve values if no event was emitted.
     * @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.
     * @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for
     *  an implementation to return a valid string even if the token does not exist.
     * @return URI string
     */
    function uri(uint256 id) external view returns (string memory);
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC-1155 Multi Token Standard, optional Inventory extension
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * Interface for fungible/non-fungible tokens management on a 1155-compliant contract.
 *
 * This interface rationalizes the co-existence of fungible and non-fungible tokens
 * within the same contract. As several kinds of fungible tokens can be managed under
 * the Multi-Token standard, we consider that non-fungible tokens can be classified
 * under their own specific type. We introduce the concept of non-fungible collection
 * and consider the usage of 3 types of identifiers:
 * (a) Fungible Token identifiers, each representing a set of Fungible Tokens,
 * (b) Non-Fungible Collection identifiers, each representing a set of Non-Fungible Tokens (this is not a token),
 * (c) Non-Fungible Token identifiers. 

 * Identifiers nature
 * |       Type                | isFungible  | isCollection | isToken |
 * |  Fungible Token           |   true      |     true     |  true   |
 * |  Non-Fungible Collection  |   false     |     true     |  false  |
 * |  Non-Fungible Token       |   false     |     false    |  true   |
 *
 * Identifiers compatibilities
 * |       Type                |  transfer  |   balance    |   supply    |  owner  |
 * |  Fungible Token           |    OK      |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Collection  |    NOK     |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Token       |    OK      |   0 or 1     |   0 or 1    |   OK    |
 *
 * Note: The ERC-165 identifier for this interface is 0x469bd23f.
 */
interface IERC1155Inventory {
    /**
     * Optional event emitted when a collection (Fungible Token or Non-Fungible Collection) is created.
     *  This event can be used by a client application to determine which identifiers are meaningful
     *  to track through the functions `balanceOf`, `balanceOfBatch` and `totalSupply`.
     * @dev This event MUST NOT be emitted twice for the same `collectionId`.
     */
    event CollectionCreated(uint256 indexed collectionId, bool indexed fungible);

    /**
     * Retrieves the owner of a non-fungible token (ERC721-compatible).
     * @dev Reverts if `nftId` is owned by the zero address.
     * @param nftId Identifier of the token to query.
     * @return Address of the current owner of the token.
     */
    function ownerOf(uint256 nftId) external view returns (address);

    /**
     * Introspects whether or not `id` represents a fungible token.
     *  This function MUST return true even for a fungible token which is not-yet created.
     * @param id The identifier to query.
     * @return bool True if `id` represents afungible token, false otherwise.
     */
    function isFungible(uint256 id) external pure returns (bool);

    /**
     * Introspects the non-fungible collection to which `nftId` belongs.
     * @dev This function MUST return a value representing a non-fungible collection.
     * @dev This function MUST return a value for a non-existing token, and SHOULD NOT be used to check the existence of a non-fungible token.
     * @dev Reverts if `nftId` does not represent a non-fungible token.
     * @param nftId The token identifier to query the collection of.
     * @return The non-fungible collection identifier to which `nftId` belongs.
     */
    function collectionOf(uint256 nftId) external pure returns (uint256);

    /**
     * Retrieves the total supply of `id`.
     * @param id The identifier for which to retrieve the supply of.
     * @return
     *  If `id` represents a collection (fungible token or non-fungible collection), the total supply for this collection.
     *  If `id` represents a non-fungible token, 1 if the token exists, else 0.
     */
    function totalSupply(uint256 id) external view returns (uint256);

    /**
     * @notice this documentation overrides {IERC1155-balanceOf(address,uint256)}.
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return
     *  If `id` represents a collection (fungible token or non-fungible collection), the balance for this collection.
     *  If `id` represents a non-fungible token, 1 if the token is owned by `owner`, else 0.
     */
    // function balanceOf(address owner, uint256 id) external view returns (uint256);

    /**
     * @notice this documentation overrides {IERC1155-balanceOfBatch(address[],uint256[])}.
     * Retrieves the balances of `ids` owned by accounts `owners`.
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The accounts to retrieve the balances of.
     * @param ids The identifiers to retrieve the balances of.
     * @return An array of elements such as for each pair `id`/`owner`:
     *  If `id` represents a collection (fungible token or non-fungible collection), the balance for this collection.
     *  If `id` represents a non-fungible token, 1 if the token is owned by `owner`, else 0.
     */
    // function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * @notice this documentation overrides its {IERC1155-safeTransferFrom(address,address,uint256,uint256,bytes)}.
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a non-fungible token and `value` is not 1.
     * @dev Reverts if `id` represents a non-fungible token and is not owned by `from`.
     * @dev Reverts if `id` represents a fungible token and `value` is 0.
     * @dev Reverts if `id` represents a fungible token and `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    // function safeTransferFrom(
    //     address from,
    //     address to,
    //     uint256 id,
    //     uint256 value,
    //     bytes calldata data
    // ) external;

    /**
     * @notice this documentation overrides its {IERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a non-fungible token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a non-fungible token and is not owned by `from`.
     * @dev Reverts if one of `ids` represents a fungible token and `value` is 0.
     * @dev Reverts if one of `ids` represents a fungible token and `from` has an insufficient balance.
     * @dev Reverts if one of `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param from Current tokens owner.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    // function safeBatchTransferFrom(
    //     address from,
    //     address to,
    //     uint256[] calldata ids,
    //     uint256[] calldata values,
    //     bytes calldata data
    // ) external;
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC-1155 Multi Token Standard, token receiver
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * Interface for any contract that wants to support transfers from ERC1155 asset contracts.
 * Note: The ERC-165 identifier for this interface is 0x4e2312e0.
 */
interface IERC1155TokenReceiver {
    /**
     * @notice Handle the receipt of a single ERC1155 token type.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.
     * This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     *  (i.e. 0xf23a6e61) to accept the transfer.
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @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   `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @notice Handle the receipt of multiple ERC1155 token types.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.
     * This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     *  (i.e. 0xbc197c81) if to accept the transfer(s).
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @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)"))`
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;






/**
 * @title ERC1155InventoryIdentifiersLib, a library to introspect inventory identifiers.
 * @dev With N=32, representing the Non-Fungible Collection mask length, identifiers are represented as follow:
 * (a) a Fungible Token:
 *     - most significant bit == 0
 * (b) a Non-Fungible Collection:
 *     - most significant bit == 1
 *     - (256-N) least significant bits == 0
 * (c) a Non-Fungible Token:
 *     - most significant bit == 1
 *     - (256-N) least significant bits != 0
 */
library ERC1155InventoryIdentifiersLib {
    // Non-fungible bit. If an id has this bit set, it is a non-fungible (either collection or token)
    uint256 internal constant _NF_BIT = 1 << 255;

    // Mask for non-fungible collection (including the nf bit)
    uint256 internal constant _NF_COLLECTION_MASK = uint256(type(uint32).max) << 224;
    uint256 internal constant _NF_TOKEN_MASK = ~_NF_COLLECTION_MASK;

    function isFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT == 0;
    }

    function isNonFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT != 0 && id & _NF_TOKEN_MASK != 0;
    }

    function getNonFungibleCollection(uint256 nftId) internal pure returns (uint256) {
        return nftId & _NF_COLLECTION_MASK;
    }
}

abstract contract ERC1155InventoryBase is IERC1155, IERC1155MetadataURI, IERC1155Inventory, IERC165, Context {
    using ERC1155InventoryIdentifiersLib for uint256;

    bytes4 private constant _ERC165_INTERFACE_ID = type(IERC165).interfaceId;
    bytes4 private constant _ERC1155_INTERFACE_ID = type(IERC1155).interfaceId;
    bytes4 private constant _ERC1155_METADATA_URI_INTERFACE_ID = type(IERC1155MetadataURI).interfaceId;
    bytes4 private constant _ERC1155_INVENTORY_INTERFACE_ID = type(IERC1155Inventory).interfaceId;

    // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant _ERC1155_RECEIVED = 0xf23a6e61;

    // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
    bytes4 internal constant _ERC1155_BATCH_RECEIVED = 0xbc197c81;

    // Burnt non-fungible token owner's magic value
    uint256 internal constant _BURNT_NFT_OWNER = 0xdead000000000000000000000000000000000000000000000000000000000000;

    /* owner => operator => approved */
    mapping(address => mapping(address => bool)) internal _operators;

    /* collection ID => owner => balance */
    mapping(uint256 => mapping(address => uint256)) internal _balances;

    /* collection ID => supply */
    mapping(uint256 => uint256) internal _supplies;

    /* NFT ID => owner */
    mapping(uint256 => uint256) internal _owners;

    /* collection ID => creator */
    mapping(uint256 => address) internal _creators;

    /// @dev See {IERC165-supportsInterface}.
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == _ERC165_INTERFACE_ID ||
            interfaceId == _ERC1155_INTERFACE_ID ||
            interfaceId == _ERC1155_METADATA_URI_INTERFACE_ID ||
            interfaceId == _ERC1155_INVENTORY_INTERFACE_ID;
    }

    //================================== ERC1155 =======================================/

    /// @dev See {IERC1155-balanceOf(address,uint256)}.
    function balanceOf(address owner, uint256 id) public view virtual override returns (uint256) {
        require(owner != address(0), "Inventory: zero address");

        if (id.isNonFungibleToken()) {
            return address(_owners[id]) == owner ? 1 : 0;
        }

        return _balances[id][owner];
    }

    /// @dev See {IERC1155-balanceOfBatch(address[],uint256[])}.
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual override returns (uint256[] memory) {
        require(owners.length == ids.length, "Inventory: inconsistent arrays");

        uint256[] memory balances = new uint256[](owners.length);

        for (uint256 i = 0; i != owners.length; ++i) {
            balances[i] = balanceOf(owners[i], ids[i]);
        }

        return balances;
    }

    /// @dev See {IERC1155-setApprovalForAll(address,bool)}.
    function setApprovalForAll(address operator, bool approved) public virtual override {
        address sender = _msgSender();
        require(operator != sender, "Inventory: self-approval");
        _operators[sender][operator] = approved;
        emit ApprovalForAll(sender, operator, approved);
    }

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

    //================================== ERC1155Inventory =======================================/

    /// @dev See {IERC1155Inventory-isFungible(uint256)}.
    function isFungible(uint256 id) external pure virtual override returns (bool) {
        return id.isFungibleToken();
    }

    /// @dev See {IERC1155Inventory-collectionOf(uint256)}.
    function collectionOf(uint256 nftId) external pure virtual override returns (uint256) {
        require(nftId.isNonFungibleToken(), "Inventory: not an NFT");
        return nftId.getNonFungibleCollection();
    }

    /// @dev See {IERC1155Inventory-ownerOf(uint256)}.
    function ownerOf(uint256 nftId) public view virtual override returns (address) {
        address owner = address(_owners[nftId]);
        require(owner != address(0), "Inventory: non-existing NFT");
        return owner;
    }

    /// @dev See {IERC1155Inventory-totalSupply(uint256)}.
    function totalSupply(uint256 id) external view virtual override returns (uint256) {
        if (id.isNonFungibleToken()) {
            return address(_owners[id]) == address(0) ? 0 : 1;
        } else {
            return _supplies[id];
        }
    }

    //================================== ABI-level Internal Functions =======================================/

    /**
     * Creates a collection (optional).
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function _createCollection(uint256 collectionId) internal virtual {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        require(_creators[collectionId] == address(0), "Inventory: existing collection");
        _creators[collectionId] = _msgSender();
        emit CollectionCreated(collectionId, collectionId.isFungibleToken());
    }

    /// @dev See {IERC1155InventoryCreator-creator(uint256)}.
    function _creator(uint256 collectionId) internal view virtual returns (address) {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        return _creators[collectionId];
    }

    //================================== Internal Helper Functions =======================================/

    /**
     * Returns whether `sender` is authorised to make a transfer on behalf of `from`.
     * @param from The address to check operatibility upon.
     * @param sender The sender address.
     * @return True if sender is `from` or an operator for `from`, false otherwise.
     */
    function _isOperatable(address from, address sender) internal view virtual returns (bool) {
        return (from == sender) || _operators[from][sender];
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous token owner.
     * @param to New token owner.
     * @param id Identifier of the token transferred.
     * @param value Amount of token transferred.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155Received(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal {
        require(IERC1155TokenReceiver(to).onERC1155Received(_msgSender(), from, id, value, data) == _ERC1155_RECEIVED, "Inventory: transfer refused");
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155batchReceived} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous tokens owner.
     * @param to New tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155BatchReceived(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(
            IERC1155TokenReceiver(to).onERC1155BatchReceived(_msgSender(), from, ids, values, data) == _ERC1155_BATCH_RECEIVED,
            "Inventory: transfer refused"
        );
    }
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155721/[email protected]

pragma solidity 0.6.8;






/**
 * @title ERC1155721Inventory, an ERC1155Inventory with additional support for ERC721.
 */
abstract contract ERC1155721Inventory is IERC721, IERC721Metadata, IERC721BatchTransfer, ERC1155InventoryBase {
    using Address for address;

    bytes4 private constant _ERC165_INTERFACE_ID = type(IERC165).interfaceId;
    bytes4 private constant _ERC1155_TOKEN_RECEIVER_INTERFACE_ID = type(IERC1155TokenReceiver).interfaceId;
    bytes4 private constant _ERC721_INTERFACE_ID = type(IERC721).interfaceId;
    bytes4 private constant _ERC721_METADATA_INTERFACE_ID = type(IERC721Metadata).interfaceId;

    bytes4 internal constant _ERC721_RECEIVED = type(IERC721Receiver).interfaceId;

    uint256 internal constant _APPROVAL_BIT_TOKEN_OWNER_ = 1 << 160;

    /* owner => NFT balance */
    mapping(address => uint256) internal _nftBalances;

    /* NFT ID => operator */
    mapping(uint256 => address) internal _nftApprovals;

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

    //===================================== ERC721 ==========================================/

    /// @dev See {IERC721-balanceOf(address)}.
    function balanceOf(address tokenOwner) external view virtual override returns (uint256) {
        require(tokenOwner != address(0), "Inventory: zero address");
        return _nftBalances[tokenOwner];
    }

    /// @dev See {IERC721-ownerOf(uint256)} and {IERC1155Inventory-ownerOf(uint256)}.
    function ownerOf(uint256 nftId) public view virtual override(IERC721, ERC1155InventoryBase) returns (address) {
        return ERC1155InventoryBase.ownerOf(nftId);
    }

    /// @dev See {IERC721-approve(address,uint256)}.
    function approve(address to, uint256 nftId) external virtual override {
        address tokenOwner = ownerOf(nftId);
        require(to != tokenOwner, "Inventory: self-approval");
        require(_isOperatable(tokenOwner, _msgSender()), "Inventory: non-approved sender");
        _owners[nftId] = uint256(tokenOwner) | _APPROVAL_BIT_TOKEN_OWNER_;
        _nftApprovals[nftId] = to;
        emit Approval(tokenOwner, to, nftId);
    }

    /// @dev See {IERC721-getApproved(uint256)}.
    function getApproved(uint256 nftId) external view virtual override returns (address) {
        uint256 tokenOwner = _owners[nftId];
        require(address(tokenOwner) != address(0), "Inventory: non-existing NFT");
        if (tokenOwner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) {
            return _nftApprovals[nftId];
        } else {
            return address(0);
        }
    }

    /// @dev See {IERC721-isApprovedForAll(address,address)} and {IERC1155-isApprovedForAll(address,address)}
    function isApprovedForAll(address tokenOwner, address operator) public view virtual override(IERC721, ERC1155InventoryBase) returns (bool) {
        return ERC1155InventoryBase.isApprovedForAll(tokenOwner, operator);
    }

    /// @dev See {IERC721-isApprovedForAll(address,address)} and {IERC1155-isApprovedForAll(address,address)}
    function setApprovalForAll(address operator, bool approved) public virtual override(IERC721, ERC1155InventoryBase) {
        return ERC1155InventoryBase.setApprovalForAll(operator, approved);
    }

    /**
     * Unsafely transfers a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721Inventory-transferFrom(address,address,uint256)}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        _transferFrom(
            from,
            to,
            nftId,
            "",
            /* safe */
            false
        );
    }

    /**
     * Safely transfers a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256)}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        _transferFrom(
            from,
            to,
            nftId,
            "",
            /* safe */
            true
        );
    }

    /**
     * Safely transfers a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256,bytes)}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId,
        bytes memory data
    ) public virtual override {
        _transferFrom(
            from,
            to,
            nftId,
            data,
            /* safe */
            true
        );
    }

    /**
     * Unsafely transfers a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev See {IERC1155721BatchTransfer-batchTransferFrom(address,address,uint256[])}.
     */
    function batchTransferFrom(
        address from,
        address to,
        uint256[] memory nftIds
    ) public virtual override {
        require(to != address(0), "Inventory: transfer to zero");
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        uint256 length = nftIds.length;
        uint256[] memory values = new uint256[](length);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 nftId = nftIds[i];
            values[i] = 1;
            _transferNFT(from, to, nftId, 1, operatable, true);
            emit Transfer(from, to, nftId);
            uint256 nextCollectionId = nftId.getNonFungibleCollection();
            if (nfCollectionId == 0) {
                nfCollectionId = nextCollectionId;
                nfCollectionCount = 1;
            } else {
                if (nextCollectionId != nfCollectionId) {
                    _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    ++nfCollectionCount;
                }
            }
        }

        if (nfCollectionId != 0) {
            _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
            _transferNFTUpdateBalances(from, to, length);
        }

        emit TransferBatch(_msgSender(), from, to, nftIds, values);
        if (to.isContract() && _isERC1155TokenReceiver(to)) {
            _callOnERC1155BatchReceived(from, to, nftIds, values, "");
        }
    }

    /// @dev See {IERC721Metadata-tokenURI(uint256)}.
    function tokenURI(uint256 nftId) external view virtual override returns (string memory) {
        require(address(_owners[nftId]) != address(0), "Inventory: non-existing NFT");
        return uri(nftId);
    }

    //================================== ERC1155 =======================================/

    /**
     * Safely transfers some token (ERC1155-compatible).
     * @dev See {IERC1155721Inventory-safeTransferFrom(address,address,uint256,uint256,bytes)}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        address sender = _msgSender();
        require(to != address(0), "Inventory: transfer to zero");
        bool operatable = _isOperatable(from, sender);

        if (id.isFungibleToken()) {
            _transferFungible(from, to, id, value, operatable);
        } else if (id.isNonFungibleToken()) {
            _transferNFT(from, to, id, value, operatable, false);
            emit Transfer(from, to, id);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(from, to, id, value, data);
        }
    }

    /**
     * Safely transfers a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721Inventory-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        // internal function to avoid stack too deep error
        _safeBatchTransferFrom(from, to, ids, values, data);
    }

    //================================== ERC1155MetadataURI =======================================/

    /// @dev See {IERC1155MetadataURI-uri(uint256)}.
    function uri(uint256) public view virtual override returns (string memory);

    //================================== ABI-level Internal Functions =======================================/

    /**
     * Safely or unsafely transfers some token (ERC721-compatible).
     * @dev For `safe` transfer, see {IERC1155721Inventory-transferFrom(address,address,uint256)}.
     * @dev For un`safe` transfer, see {IERC1155721Inventory-safeTransferFrom(address,address,uint256,bytes)}.
     */
    function _transferFrom(
        address from,
        address to,
        uint256 nftId,
        bytes memory data,
        bool safe
    ) internal {
        require(to != address(0), "Inventory: transfer to zero");
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        _transferNFT(from, to, nftId, 1, operatable, false);

        emit Transfer(from, to, nftId);
        emit TransferSingle(sender, from, to, nftId, 1);
        if (to.isContract()) {
            if (_isERC1155TokenReceiver(to)) {
                _callOnERC1155Received(from, to, nftId, 1, data);
            } else if (safe) {
                _callOnERC721Received(from, to, nftId, data);
            }
        }
    }

    /**
     * Safely transfers a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721Inventory-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(to != address(0), "Inventory: transfer to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        uint256 nftsCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            if (id.isFungibleToken()) {
                _transferFungible(from, to, id, values[i], operatable);
            } else if (id.isNonFungibleToken()) {
                _transferNFT(from, to, id, values[i], operatable, true);
                emit Transfer(from, to, id);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
                        nfCollectionId = nextCollectionId;
                        nftsCount += nfCollectionCount;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
            nftsCount += nfCollectionCount;
            _transferNFTUpdateBalances(from, to, nftsCount);
        }

        emit TransferBatch(_msgSender(), from, to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(from, to, ids, values, data);
        }
    }

    /**
     * Safely or unsafely mints some token (ERC721-compatible).
     * @dev For `safe` mint, see {IERC1155721InventoryMintable-mint(address,uint256)}.
     * @dev For un`safe` mint, see {IERC1155721InventoryMintable-safeMint(address,uint256,bytes)}.
     */
    function _mint(
        address to,
        uint256 nftId,
        bytes memory data,
        bool safe
    ) internal {
        require(to != address(0), "Inventory: transfer to zero");
        require(nftId.isNonFungibleToken(), "Inventory: not an NFT");

        _mintNFT(to, nftId, 1, false);

        emit Transfer(address(0), to, nftId);
        emit TransferSingle(_msgSender(), address(0), to, nftId, 1);
        if (to.isContract()) {
            if (_isERC1155TokenReceiver(to)) {
                _callOnERC1155Received(address(0), to, nftId, 1, data);
            } else if (safe) {
                _callOnERC721Received(address(0), to, nftId, data);
            }
        }
    }

    /**
     * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256[])}.
     */
    function _batchMint(address to, uint256[] memory nftIds) internal {
        require(to != address(0), "Inventory: transfer to zero");

        uint256 length = nftIds.length;
        uint256[] memory values = new uint256[](length);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 nftId = nftIds[i];
            require(nftId.isNonFungibleToken(), "Inventory: not an NFT");
            values[i] = 1;
            _mintNFT(to, nftId, 1, true);
            emit Transfer(address(0), to, nftId);
            uint256 nextCollectionId = nftId.getNonFungibleCollection();
            if (nfCollectionId == 0) {
                nfCollectionId = nextCollectionId;
                nfCollectionCount = 1;
            } else {
                if (nextCollectionId != nfCollectionId) {
                    _balances[nfCollectionId][to] += nfCollectionCount;
                    _supplies[nfCollectionId] += nfCollectionCount;
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    ++nfCollectionCount;
                }
            }
        }

        _balances[nfCollectionId][to] += nfCollectionCount;
        _supplies[nfCollectionId] += nfCollectionCount;
        _nftBalances[to] += length;

        emit TransferBatch(_msgSender(), address(0), to, nftIds, values);
        if (to.isContract() && _isERC1155TokenReceiver(to)) {
            _callOnERC1155BatchReceived(address(0), to, nftIds, values, "");
        }
    }

    /**
     * Safely mints some token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,uint256,bytes)}.
     */
    function _safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "Inventory: transfer to zero");
        address sender = _msgSender();
        if (id.isFungibleToken()) {
            _mintFungible(to, id, value);
        } else if (id.isNonFungibleToken()) {
            _mintNFT(to, id, value, false);
            emit Transfer(address(0), to, id);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, address(0), to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(address(0), to, id, value, data);
        }
    }

    /**
     * Safely mints a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeBatchMint(address,uint256[],uint256[],bytes)}.
     */
    function _safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "Inventory: transfer to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        uint256 nftsCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _mintFungible(to, id, value);
            } else if (id.isNonFungibleToken()) {
                _mintNFT(to, id, value, true);
                emit Transfer(address(0), to, id);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][to] += nfCollectionCount;
                        _supplies[nfCollectionId] += nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nftsCount += nfCollectionCount;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _balances[nfCollectionId][to] += nfCollectionCount;
            _supplies[nfCollectionId] += nfCollectionCount;
            nftsCount += nfCollectionCount;
            _nftBalances[to] += nftsCount;
        }

        emit TransferBatch(_msgSender(), address(0), to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(address(0), to, ids, values, data);
        }
    }

    //============================== Internal Helper Functions =======================================/

    function _mintFungible(
        address to,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 supply = _supplies[id];
        uint256 newSupply = supply + value;
        require(newSupply > supply, "Inventory: supply overflow");
        _supplies[id] = newSupply;
        // cannot overflow as supply cannot overflow
        _balances[id][to] += value;
    }

    function _mintNFT(
        address to,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(_owners[id] == 0, "Inventory: existing/burnt NFT");

        _owners[id] = uint256(to);

        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // it is virtually impossible that a non-fungible collection supply
            // overflows due to the cost of minting individual tokens
            ++_supplies[collectionId];
            ++_balances[collectionId][to];
            ++_nftBalances[to];
        }
    }

    function _transferFungible(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bool operatable
    ) internal {
        require(operatable, "Inventory: non-approved sender");
        require(value != 0, "Inventory: zero value");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        if (from != to) {
            _balances[id][from] = balance - value;
            // cannot overflow as supply cannot overflow
            _balances[id][to] += value;
        }
    }

    function _transferNFT(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bool operatable,
        bool isBatch
    ) internal virtual {
        require(value == 1, "Inventory: wrong NFT value");
        uint256 owner = _owners[id];
        require(from == address(owner), "Inventory: non-owned NFT");
        if (!operatable) {
            require((owner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) && _msgSender() == _nftApprovals[id], "Inventory: non-approved sender");
        }
        _owners[id] = uint256(to);
        if (!isBatch) {
            _transferNFTUpdateBalances(from, to, 1);
            _transferNFTUpdateCollection(from, to, id.getNonFungibleCollection(), 1);
        }
    }

    function _transferNFTUpdateBalances(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        if (from != to) {
            // cannot underflow as balance is verified through ownership
            _nftBalances[from] -= amount;
            //  cannot overflow as supply cannot overflow
            _nftBalances[to] += amount;
        }
    }

    function _transferNFTUpdateCollection(
        address from,
        address to,
        uint256 collectionId,
        uint256 amount
    ) internal virtual {
        if (from != to) {
            // cannot underflow as balance is verified through ownership
            _balances[collectionId][from] -= amount;
            // cannot overflow as supply cannot overflow
            _balances[collectionId][to] += amount;
        }
    }

    ///////////////////////////////////// Receiver Calls Internal /////////////////////////////////////

    /**
     * Queries whether a contract implements ERC1155TokenReceiver.
     * @param _contract address of the contract.
     * @return wheter the given contract implements ERC1155TokenReceiver.
     */
    function _isERC1155TokenReceiver(address _contract) internal view returns (bool) {
        bool success;
        bool result;
        bytes memory staticCallData = abi.encodeWithSelector(_ERC165_INTERFACE_ID, _ERC1155_TOKEN_RECEIVER_INTERFACE_ID);
        assembly {
            let call_ptr := add(0x20, staticCallData)
            let call_size := mload(staticCallData)
            let output := mload(0x40) // Find empty storage location using "free memory pointer"
            mstore(output, 0x0)
            success := staticcall(10000, _contract, call_ptr, call_size, output, 0x20) // 32 bytes
            result := mload(output)
        }
        // (10000 / 63) "not enough for supportsInterface(...)" // consume all gas, so caller can potentially know that there was not enough gas
        assert(gasleft() > 158);
        return success && result;
    }

    /**
     * Calls {IERC721Receiver-onERC721Received} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous token owner.
     * @param to New token owner.
     * @param nftId Identifier of the token transferred.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC721Received(
        address from,
        address to,
        uint256 nftId,
        bytes memory data
    ) internal {
        require(IERC721Receiver(to).onERC721Received(_msgSender(), from, nftId, data) == _ERC721_RECEIVED, "Inventory: transfer refused");
    }
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155721/[email protected]

pragma solidity 0.6.8;

/**
 * @title IERC1155721InventoryBurnable interface.
 * The function {IERC721Burnable-burnFrom(address,uint256)} is not provided as
 *  {IERC1155Burnable-burnFrom(address,uint256,uint256)} can be used instead.
 */
interface IERC1155721InventoryBurnable {
    /**
     * Burns some token (ERC1155-compatible).
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a fungible token and `value` is 0.
     * @dev Reverts if `id` represents a fungible token and `value` is higher than `from`'s balance.
     * @dev Reverts if `id` represents a non-fungible token and `value` is not 1.
     * @dev Reverts if `id` represents a non-fungible token which is not owned by `from`.
     * @dev Emits an {IERC721-Transfer} event to the zero address if `id` represents a non-fungible token.
     * @dev Emits an {IERC1155-TransferSingle} event to the zero address.
     * @param from Address of the current token owner.
     * @param id Identifier of the token to burn.
     * @param value Amount of token to burn.
     */
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) external;

    /**
     * Burns multiple tokens (ERC1155-compatible).
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a fungible token and `value` is 0.
     * @dev Reverts if one of `ids` represents a fungible token and `value` is higher than `from`'s balance.
     * @dev Reverts if one of `ids` represents a non-fungible token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a non-fungible token which is not owned by `from`.
     * @dev Emits an {IERC721-Transfer} event to the zero address for each burnt non-fungible token.
     * @dev Emits an {IERC1155-TransferBatch} event to the zero address.
     * @param from Address of the current tokens owner.
     * @param ids Identifiers of the tokens to burn.
     * @param values Amounts of tokens to burn.
     */
    function batchBurnFrom(
        address from,
        uint256[] calldata ids,
        uint256[] calldata values
    ) external;

    /**
     * Burns a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `nftIds` does not represent a non-fungible token.
     * @dev Reverts if one of `nftIds` is not owned by `from`.
     * @dev Emits an {IERC721-Transfer} event to the zero address for each of `nftIds`.
     * @dev Emits an {IERC1155-TransferBatch} event to the zero address.
     * @param from Current token owner.
     * @param nftIds Identifiers of the tokens to transfer.
     */
    function batchBurnFrom(address from, uint256[] calldata nftIds) external;
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155721/[email protected]

pragma solidity 0.6.8;


/**
 * @title ERC1155721InventoryBurnable, a burnable ERC1155721Inventory.
 */
abstract contract ERC1155721InventoryBurnable is IERC1155721InventoryBurnable, ERC1155721Inventory {
    //============================== ERC1155721InventoryBurnable =======================================/

    /**
     * Burns some token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryBurnable-burnFrom(address,uint256,uint256)}.
     */
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) public virtual override {
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        if (id.isFungibleToken()) {
            _burnFungible(from, id, value, operatable);
        } else if (id.isNonFungibleToken()) {
            _burnNFT(from, id, value, operatable, false);
            emit Transfer(from, address(0), id);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, address(0), id, value);
    }

    /**
     * Burns a batch of token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryBurnable-batchBurnFrom(address,uint256[],uint256[])}.
     */
    function batchBurnFrom(
        address from,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual override {
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        uint256 nftsCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            if (id.isFungibleToken()) {
                _burnFungible(from, id, values[i], operatable);
            } else if (id.isNonFungibleToken()) {
                _burnNFT(from, id, values[i], operatable, true);
                emit Transfer(from, address(0), id);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount);
                        nfCollectionId = nextCollectionId;
                        nftsCount += nfCollectionCount;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount);
            nftsCount += nfCollectionCount;
            // cannot underflow as balance is verified through ownership
            _nftBalances[from] -= nftsCount;
        }

        emit TransferBatch(sender, from, address(0), ids, values);
    }

    /**
     * Burns a batch of token (ERC721-compatible).
     * @dev See {IERC1155721InventoryBurnable-batchBurnFrom(address,uint256[])}.
     */
    function batchBurnFrom(address from, uint256[] memory nftIds) public virtual override {
        address sender = _msgSender();
        bool operatable = _isOperatable(from, sender);

        uint256 length = nftIds.length;
        uint256[] memory values = new uint256[](length);

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 nftId = nftIds[i];
            values[i] = 1;
            _burnNFT(from, nftId, values[i], operatable, true);
            emit Transfer(from, address(0), nftId);
            uint256 nextCollectionId = nftId.getNonFungibleCollection();
            if (nfCollectionId == 0) {
                nfCollectionId = nextCollectionId;
                nfCollectionCount = 1;
            } else {
                if (nextCollectionId != nfCollectionId) {
                    _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount);
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    ++nfCollectionCount;
                }
            }
        }

        if (nfCollectionId != 0) {
            _burnNFTUpdateCollection(from, nfCollectionId, nfCollectionCount);
            _nftBalances[from] -= length;
        }

        emit TransferBatch(sender, from, address(0), nftIds, values);
    }

    //============================== Internal Helper Functions =======================================/

    function _burnFungible(
        address from,
        uint256 id,
        uint256 value,
        bool operatable
    ) internal {
        require(value != 0, "Inventory: zero value");
        require(operatable, "Inventory: non-approved sender");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        _balances[id][from] = balance - value;
        // Cannot underflow
        _supplies[id] -= value;
    }

    function _burnNFT(
        address from,
        uint256 id,
        uint256 value,
        bool operatable,
        bool isBatch
    ) internal virtual {
        require(value == 1, "Inventory: wrong NFT value");
        uint256 owner = _owners[id];
        require(from == address(owner), "Inventory: non-owned NFT");
        if (!operatable) {
            require((owner & _APPROVAL_BIT_TOKEN_OWNER_ != 0) && _msgSender() == _nftApprovals[id], "Inventory: non-approved sender");
        }
        _owners[id] = _BURNT_NFT_OWNER;

        if (!isBatch) {
            _burnNFTUpdateCollection(from, id.getNonFungibleCollection(), 1);

            // cannot underflow as balance is verified through NFT ownership
            --_nftBalances[from];
        }
    }

    function _burnNFTUpdateCollection(
        address from,
        uint256 collectionId,
        uint256 amount
    ) internal virtual {
        // cannot underflow as balance is verified through NFT ownership
        _balances[collectionId][from] -= amount;
        _supplies[collectionId] -= amount;
    }
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155721/[email protected]

pragma solidity 0.6.8;

/**
 * @title IERC1155721InventoryMintable interface.
 * The function {IERC721Mintable-safeMint(address,uint256,bytes)} is not provided as
 *  {IERC1155Mintable-safeMint(address,uint256,uint256,bytes)} can be used instead.
 */
interface IERC1155721InventoryMintable {
    /**
     * Safely mints some token (ERC1155-compatible).
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `id` is not a token.
     * @dev Reverts if `id` represents a non-fungible token and `value` is not 1.
     * @dev Reverts if `id` represents a non-fungible token which has already been minted.
     * @dev Reverts if `id` represents a fungible token and `value` is 0.
     * @dev Reverts if `id` represents a fungible token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused.
     * @dev Emits an {IERC721-Transfer} event from the zero address if `id` represents a non-fungible token.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to mint.
     * @param value Amount of token to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely mints a batch of tokens (ERC1155-compatible).
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if one of `ids` is not a token.
     * @dev Reverts if one of `ids` represents a non-fungible token and its paired value is not 1.
     * @dev Reverts if one of `ids` represents a non-fungible token which has already been minted.
     * @dev Reverts if one of `ids` represents a fungible token and its paired value is 0.
     * @dev Reverts if one of `ids` represents a fungible token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC721-Transfer} event from the zero address for each non-fungible token minted.
     * @dev Emits an {IERC1155-TransferBatch} event from the zero address.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to mint.
     * @param values Amounts of tokens to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchMint(
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;

    /**
     * Unsafely mints a Non-Fungible Token (ERC721-compatible).
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `nftId` does not represent a non-fungible token.
     * @dev Reverts if `nftId` has already been minted.
     * @dev Emits an {IERC721-Transfer} event from the zero address.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @dev If `to` is a contract and supports ERC1155TokenReceiver, calls {IERC1155TokenReceiver-onERC1155Received} with empty data.
     * @param to Address of the new token owner.
     * @param nftId Identifier of the token to mint.
     */
    function mint(address to, uint256 nftId) external;

    /**
     * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if one of `nftIds` does not represent a non-fungible token.
     * @dev Reverts if one of `nftIds` has already been minted.
     * @dev Emits an {IERC721-Transfer} event from the zero address for each of `nftIds`.
     * @dev Emits an {IERC1155-TransferBatch} event from the zero address.
     * @dev If `to` is a contract and supports ERC1155TokenReceiver, calls {IERC1155TokenReceiver-onERC1155BatchReceived} with empty data.
     * @param to Address of the new token owner.
     * @param nftIds Identifiers of the tokens to mint.
     */
    function batchMint(address to, uint256[] calldata nftIds) external;

    /**
     * Safely mints a token (ERC721-compatible).
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `tokenId` has already ben minted.
     * @dev Reverts if `to` is a contract which does not implement IERC721Receiver or IERC1155TokenReceiver.
     * @dev Reverts if `to` is an IERC1155TokenReceiver or IERC721TokenReceiver contract which refuses the transfer.
     * @dev Emits an {IERC721-Transfer} event from the zero address.
     * @dev Emits an {IERC1155-TransferSingle} event from the zero address.
     * @param to Address of the new token owner.
     * @param nftId Identifier of the token to mint.
     * @param data Optional data to pass along to the receiver call.
     */
    function safeMint(
        address to,
        uint256 nftId,
        bytes calldata data
    ) external;
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/token/ERC1155/[email protected]

pragma solidity 0.6.8;

/**
 * @title ERC-1155 Inventory, additional creator interface
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 */
interface IERC1155InventoryCreator {
    /**
     * Returns the creator of a collection, or the zero address if the collection has not been created.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @param collectionId Identifier of the collection.
     * @return The creator of a collection, or the zero address if the collection has not been created.
     */
    function creator(uint256 collectionId) external view returns (address);
}


// File @openzeppelin/contracts/access/[email protected]

pragma solidity >=0.6.0 <0.8.0;

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () internal {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

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

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

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


// File @animoca/ethereum-contracts-core_library/contracts/utils/types/[email protected]

pragma solidity 0.6.8;

library UInt256ToDecimalString {
    function toDecimalString(uint256 value) internal pure returns (string memory) {
        // Inspired by OpenZeppelin's String.toString() implementation - MIT licence
        // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b10cb38d8fedf34f2d89b0ed604f2dceb76d6a9/contracts/utils/Strings.sol
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        uint256 index = digits - 1;
        temp = value;
        while (temp != 0) {
            buffer[index--] = bytes1(uint8(48 + (temp % 10)));
            temp /= 10;
        }
        return string(buffer);
    }
}


// File @animoca/ethereum-contracts-assets_inventory/contracts/metadata/[email protected]

pragma solidity 0.6.8;


contract BaseMetadataURI is Ownable {
    using UInt256ToDecimalString for uint256;

    event BaseMetadataURISet(string baseMetadataURI);

    string public baseMetadataURI;

    function setBaseMetadataURI(string calldata baseMetadataURI_) external onlyOwner {
        baseMetadataURI = baseMetadataURI_;
        emit BaseMetadataURISet(baseMetadataURI_);
    }

    function _uri(uint256 id) internal view virtual returns (string memory) {
        return string(abi.encodePacked(baseMetadataURI, id.toDecimalString()));
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;

        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) { // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            bytes32 lastvalue = set._values[lastIndex];

            // Move the last value to the index where the value to delete is
            set._values[toDeleteIndex] = lastvalue;
            // Update the index for the moved value
            set._indexes[lastvalue] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(value)));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint256(_at(set._inner, index)));
    }


    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

   /**
    * @dev Returns the value stored at position `index` in the set. O(1).
    *
    * Note that there are no guarantees on the ordering of values inside the
    * array, and it may change when more values are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }
}


// File @openzeppelin/contracts/access/[email protected]

pragma solidity >=0.6.0 <0.8.0;



/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms.
 *
 * 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 {
    using EnumerableSet for EnumerableSet.AddressSet;
    using Address for address;

    struct RoleData {
        EnumerableSet.AddressSet members;
        bytes32 adminRole;
    }

    mapping (bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @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 RoleAdminChanged(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 {_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) public view returns (bool) {
        return _roles[role].members.contains(account);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view returns (uint256) {
        return _roles[role].members.length();
    }

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view returns (address) {
        return _roles[role].members.at(index);
    }

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

    /**
     * @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 {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to grant");

        _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 {
        require(hasRole(_roles[role].adminRole, _msgSender()), "AccessControl: sender must be an admin to revoke");

        _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 granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual {
        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}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

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

    function _grantRole(bytes32 role, address account) private {
        if (_roles[role].members.add(account)) {
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (_roles[role].members.remove(account)) {
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @animoca/ethereum-contracts-core_library/contracts/access/[email protected]

pragma solidity 0.6.8;

/**
 * Contract module which allows derived contracts access control over token
 * minting operations.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyMinter`, which can be applied to the minting functions of your contract.
 * Those functions will only be accessible to accounts with the minter role
 * once the modifer is put in place.
 */
contract MinterRole is AccessControl {
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    /**
     * Modifier to make a function callable only by accounts with the minter role.
     */
    modifier onlyMinter() {
        require(isMinter(_msgSender()), "MinterRole: not a Minter");
        _;
    }

    /**
     * Constructor.
     */
    constructor() internal {
        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());
        emit MinterAdded(_msgSender());
    }

    /**
     * Validates whether or not the given account has been granted the minter role.
     * @param account The account to validate.
     * @return True if the account has been granted the minter role, false otherwise.
     */
    function isMinter(address account) public view returns (bool) {
        return hasRole(DEFAULT_ADMIN_ROLE, account);
    }

    /**
     * Grants the minter role to a non-minter.
     * @param account The account to grant the minter role to.
     */
    function addMinter(address account) public onlyMinter {
        require(!isMinter(account), "MinterRole: already Minter");
        grantRole(DEFAULT_ADMIN_ROLE, account);
        emit MinterAdded(account);
    }

    /**
     * Renounces the granted minter role.
     */
    function renounceMinter() public onlyMinter {
        renounceRole(DEFAULT_ADMIN_ROLE, _msgSender());
        emit MinterRemoved(_msgSender());
    }
}


// File @openzeppelin/contracts/utils/[email protected]

pragma solidity >=0.6.0 <0.8.0;

/**
 * @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 () internal {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view 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());
    }
}


// File contracts/solc-0.6/token/ERC1155721/REVVInventory.sol

pragma solidity ^0.6.8;







contract REVVInventory is
    Ownable,
    Pausable,
    ERC1155721InventoryBurnable,
    IERC1155721InventoryMintable,
    IERC1155InventoryCreator,
    BaseMetadataURI,
    MinterRole
{
    // solhint-disable-next-line const-name-snakecase
    string public constant override name = "REVV Inventory";
    // solhint-disable-next-line const-name-snakecase
    string public constant override symbol = "REVV-I";

    //================================== ERC1155MetadataURI =======================================/

    /// @dev See {IERC1155MetadataURI-uri(uint256)}.
    function uri(uint256 id) public view virtual override returns (string memory) {
        return _uri(id);
    }

    //================================== ERC1155InventoryCreator =======================================/

    /// @dev See {IERC1155InventoryCreator-creator(uint256)}.
    function creator(uint256 collectionId) external view override returns (address) {
        return _creator(collectionId);
    }

    // ===================================================================================================
    //                               Admin Public Functions
    // ===================================================================================================

    //================================== Pausable =======================================/

    function pause() external virtual {
        require(owner() == _msgSender(), "Inventory: not the owner");
        _pause();
    }

    function unpause() external virtual {
        require(owner() == _msgSender(), "Inventory: not the owner");
        _unpause();
    }

    //================================== ERC1155Inventory =======================================/

    /**
     * Creates a collection.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function createCollection(uint256 collectionId) external onlyOwner {
        _createCollection(collectionId);
    }

    //================================== ERC1155721InventoryMintable =======================================/

    /**
     * Unsafely mints a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256)}.
     */
    function mint(address to, uint256 nftId) public virtual override {
        require(isMinter(_msgSender()), "Inventory: not a minter");
        _mint(to, nftId, "", false);
    }

    /**
     * Unsafely mints a batch of Non-Fungible Tokens (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-batchMint(address,uint256[])}.
     */
    function batchMint(address to, uint256[] memory nftIds) public virtual override {
        require(isMinter(_msgSender()), "Inventory: not a minter");
        _batchMint(to, nftIds);
    }

    /**
     * Safely mints a Non-Fungible Token (ERC721-compatible).
     * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,bytes)}.
     */
    function safeMint(
        address to,
        uint256 nftId,
        bytes memory data
    ) public virtual override {
        require(isMinter(_msgSender()), "Inventory: not a minter");
        _mint(to, nftId, data, true);
    }

    /**
     * Safely mints some token (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeMint(address,uint256,uint256,bytes)}.
     */
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        require(isMinter(_msgSender()), "Inventory: not a minter");
        _safeMint(to, id, value, data);
    }

    /**
     * Safely mints a batch of tokens (ERC1155-compatible).
     * @dev See {IERC1155721InventoryMintable-safeBatchMint(address,uint256[],uint256[],bytes)}.
     */
    function safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        require(isMinter(_msgSender()), "Inventory: not a minter");
        _safeBatchMint(to, ids, values, data);
    }

    //================================== ERC721 =======================================/

    function transferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.transferFrom(from, to, nftId);
    }

    function batchTransferFrom(
        address from,
        address to,
        uint256[] memory nftIds
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.batchTransferFrom(from, to, nftIds);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.safeTransferFrom(from, to, nftId);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 nftId,
        bytes memory data
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.safeTransferFrom(from, to, nftId, data);
    }

    function batchBurnFrom(address from, uint256[] memory nftIds) public virtual override {
        require(!paused(), "Inventory: paused");
        super.batchBurnFrom(from, nftIds);
    }

    //================================== ERC1155 =======================================/

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.safeTransferFrom(from, to, id, value, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.safeBatchTransferFrom(from, to, ids, values, data);
    }

    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.burnFrom(from, id, value);
    }

    function batchBurnFrom(
        address from,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual override {
        require(!paused(), "Inventory: paused");
        super.batchBurnFrom(from, ids, values);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseMetadataURI","type":"string"}],"name":"BaseMetadataURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"collectionId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"fungible","type":"bool"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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":"RoleAdminChanged","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":"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":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"Transfer","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"nftIds","type":"uint256[]"}],"name":"batchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"collectionOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","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":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","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":"value","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":"baseMetadataURI_","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b506000620000276001600160e01b03620000f316565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506000805460ff60a01b19168155620000a590620000966001600160e01b03620000f316565b6001600160e01b03620000f716565b620000b86001600160e01b03620000f316565b6001600160a01b03167f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f660405160405180910390a26200022d565b3390565b6200010c82826001600160e01b036200011016565b5050565b6000828152600960209081526040909120620001379183906200281562000194821b17901c565b156200010c57620001506001600160e01b03620000f316565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000620001b4836001600160a01b0384166001600160e01b03620001bd16565b90505b92915050565b6000620001d483836001600160e01b036200021516565b6200020c57508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155620001b7565b506000620001b7565b60009081526001919091016020526040902054151590565b615ca6806200023d6000396000f3fe608060405234801561001057600080fd5b50600436106103405760003560e01c80637e518ec8116101bd578063adebf6f2116100f9578063d0011d9d116100a2578063f242432a1161007c578063f242432a146111ab578063f247296514611276578063f2fde38b14611329578063f3993d111461134f57610340565b8063d0011d9d14611134578063d547741f14611151578063e985e9c51461117d57610340565b8063c7778baa116100d3578063c7778baa146110dd578063c87b56dd146110fa578063ca15c8731461111757610340565b8063adebf6f214610fdd578063b88d4fde14610ffa578063bd85b039146110c057610340565b806391d148541161016657806398650275116101405780639865027514610f79578063a217fddf14610f81578063a22cb46514610f89578063aa271e1a14610fb757610340565b806391d1485414610f1f57806395d89b4114610f4b578063983b2d5614610f5357610340565b80638832e6e3116101975780638832e6e314610e395780638da5cb5b14610ef45780639010d07c14610efc57610340565b80637e518ec814610c8a5780638053493414610cfa5780638456cb5914610e3157610340565b806336568abe1161028c578063510b5158116102355780635cfa92971161020f5780635cfa929714610b7d5780636352211e14610c3f57806370a0823114610c5c578063715018a614610c8257610340565b8063510b515814610b505780635b2bd79e14610b6d5780635c975abb14610b7557610340565b806342842e0e1161026657806342842e0e146109555780634684d7e91461098b5780634e1273f414610a3e57610340565b806336568abe146108f55780633f4ba83a1461092157806340c10f191461092957610340565b80630e89341c116102ee578063248a9ca3116102c8578063248a9ca3146106e55780632eb2c2d6146107025780632f2ff15d146108c957610340565b80630e89341c14610660578063124d91e51461067d57806323b872dd146106af57610340565b8063081812fc1161031f578063081812fc1461043b578063095ea7b3146104745780630d6a5bbb146104a257610340565b8062fdd58e1461034557806301ffc9a71461038357806306fdde03146103be575b600080fd5b6103716004803603604081101561035b57600080fd5b506001600160a01b03813516906020013561140b565b60408051918252519081900360200190f35b6103aa6004803603602081101561039957600080fd5b50356001600160e01b0319166114d6565b604080519115158252519081900360200190f35b6103c6611551565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104005781810151838201526020016103e8565b50505050905090810190601f16801561042d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104586004803603602081101561045157600080fd5b503561158a565b604080516001600160a01b039092168252519081900360200190f35b6104a06004803603604081101561048a57600080fd5b506001600160a01b038135169060200135611629565b005b6104a0600480360360808110156104b857600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156104e357600080fd5b8201836020820111156104f557600080fd5b8035906020019184602083028401116401000000008311171561051757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561056757600080fd5b82018360208201111561057957600080fd5b8035906020019184602083028401116401000000008311171561059b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105eb57600080fd5b8201836020820111156105fd57600080fd5b8035906020019184600183028401116401000000008311171561061f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061177b945050505050565b6103c66004803603602081101561067657600080fd5b50356117ee565b6104a06004803603606081101561069357600080fd5b506001600160a01b0381351690602081013590604001356117f9565b6104a0600480360360608110156106c557600080fd5b506001600160a01b03813581169160208101359091169060400135611857565b610371600480360360208110156106fb57600080fd5b50356118b0565b6104a0600480360360a081101561071857600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561074c57600080fd5b82018360208201111561075e57600080fd5b8035906020019184602083028401116401000000008311171561078057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156107d057600080fd5b8201836020820111156107e257600080fd5b8035906020019184602083028401116401000000008311171561080457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561085457600080fd5b82018360208201111561086657600080fd5b8035906020019184600183028401116401000000008311171561088857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118c5945050505050565b6104a0600480360360408110156108df57600080fd5b50803590602001356001600160a01b0316611927565b6104a06004803603604081101561090b57600080fd5b50803590602001356001600160a01b0316611993565b6104a06119f4565b6104a06004803603604081101561093f57600080fd5b506001600160a01b038135169060200135611a72565b6104a06004803603606081101561096b57600080fd5b506001600160a01b03813581169160208101359091169060400135611aea565b6104a0600480360360408110156109a157600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156109cc57600080fd5b8201836020820111156109de57600080fd5b80359060200191846020830284011164010000000083111715610a0057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611b43945050505050565b610b0060048036036040811015610a5457600080fd5b810190602081018135640100000000811115610a6f57600080fd5b820183602082011115610a8157600080fd5b80359060200191846020830284011164010000000083111715610aa357600080fd5b919390929091602081019035640100000000811115610ac157600080fd5b820183602082011115610ad357600080fd5b80359060200191846020830284011164010000000083111715610af557600080fd5b509092509050611ba9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b3c578181015183820152602001610b24565b505050509050019250505060405180910390f35b61045860048036036020811015610b6657600080fd5b5035611caf565b6103c6611cba565b6103aa611d48565b6104a060048036036080811015610b9357600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135640100000000811115610bca57600080fd5b820183602082011115610bdc57600080fd5b80359060200191846001830284011164010000000083111715610bfe57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d59945050505050565b61045860048036036020811015610c5557600080fd5b5035611dc1565b61037160048036036020811015610c7257600080fd5b50356001600160a01b0316611dcc565b6104a0611e45565b6104a060048036036020811015610ca057600080fd5b810190602081018135640100000000811115610cbb57600080fd5b820183602082011115610ccd57600080fd5b80359060200191846001830284011164010000000083111715610cef57600080fd5b509092509050611f06565b6104a060048036036060811015610d1057600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610d3b57600080fd5b820183602082011115610d4d57600080fd5b80359060200191846020830284011164010000000083111715610d6f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610dbf57600080fd5b820183602082011115610dd157600080fd5b80359060200191846020830284011164010000000083111715610df357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611fe1945050505050565b6104a061203a565b6104a060048036036060811015610e4f57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610e7f57600080fd5b820183602082011115610e9157600080fd5b80359060200191846001830284011164010000000083111715610eb357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120b6945050505050565b61045861211f565b61045860048036036040811015610f1257600080fd5b508035906020013561212e565b6103aa60048036036040811015610f3557600080fd5b50803590602001356001600160a01b0316612153565b6103c6612171565b6104a060048036036020811015610f6957600080fd5b50356001600160a01b03166121aa565b6104a06122a3565b610371612350565b6104a060048036036040811015610f9f57600080fd5b506001600160a01b0381351690602001351515612355565b6103aa60048036036020811015610fcd57600080fd5b50356001600160a01b031661235f565b6103aa60048036036020811015610ff357600080fd5b503561236b565b6104a06004803603608081101561101057600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561104b57600080fd5b82018360208201111561105d57600080fd5b8035906020019184600183028401116401000000008311171561107f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612376945050505050565b610371600480360360208110156110d657600080fd5b50356123d0565b610371600480360360208110156110f357600080fd5b5035612426565b6103c66004803603602081101561111057600080fd5b503561248b565b6103716004803603602081101561112d57600080fd5b5035612500565b6104a06004803603602081101561114a57600080fd5b5035612517565b6104a06004803603604081101561116757600080fd5b50803590602001356001600160a01b031661258d565b6103aa6004803603604081101561119357600080fd5b506001600160a01b03813581169160200135166125e6565b6104a0600480360360a08110156111c157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561120157600080fd5b82018360208201111561121357600080fd5b8035906020019184600183028401116401000000008311171561123557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125f2945050505050565b6104a06004803603604081101561128c57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156112b757600080fd5b8201836020820111156112c957600080fd5b803590602001918460208302840111640100000000831117156112eb57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061264d945050505050565b6104a06004803603602081101561133f57600080fd5b50356001600160a01b03166126a5565b6104a06004803603606081101561136557600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561139957600080fd5b8201836020820111156113ab57600080fd5b803590602001918460208302840111640100000000831117156113cd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506127bc945050505050565b60006001600160a01b038316611468576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b6114718261282a565b156114ab576000828152600460205260409020546001600160a01b0384811691161461149e5760006114a1565b60015b60ff1690506114d0565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006114e18261287c565b8061151557506001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061154957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b90505b919050565b6040518060400160405280600e81526020017f5245565620496e76656e746f727900000000000000000000000000000000000081525081565b6000818152600460205260408120546001600160a01b0381166115f4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b600160a01b81161561161f5750506000818152600760205260409020546001600160a01b031661154c565b600091505061154c565b600061163482611dc1565b9050806001600160a01b0316836001600160a01b0316141561169d576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6116ae816116a9612949565b61294d565b6116ff576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008281526004602090815260408083206001600160a01b03808616600160a01b81179092556007909352818420805493881673ffffffffffffffffffffffffffffffffffffffff1990941684179055905185937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61178b611786612949565b61235f565b6117dc576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b6117e884848484612999565b50505050565b606061154982612d55565b611801611d48565b15611847576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383612e28565b505050565b61185f611d48565b156118a5576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383612f1b565b60009081526009602052604090206002015490565b6118cd611d48565b15611913576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b6119208585858585612f38565b5050505050565b60008281526009602052604090206002015461194a90611945612949565b612153565b6119855760405162461bcd60e51b815260040180806020018281038252602f815260200180615bbd602f913960400191505060405180910390fd5b61198f8282612f45565b5050565b61199b612949565b6001600160a01b0316816001600160a01b0316146119ea5760405162461bcd60e51b815260040180806020018281038252602f815260200180615c42602f913960400191505060405180910390fd5b61198f8282612fb4565b6119fc612949565b6001600160a01b0316611a0d61211f565b6001600160a01b031614611a68576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f7420746865206f776e65720000000000000000604482015290519081900360640190fd5b611a70613023565b565b611a7d611786612949565b611ace576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b61198f82826040518060200160405280600081525060006130ef565b611af2611d48565b15611b38576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383613293565b611b4e611786612949565b611b9f576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b61198f82826132b0565b6060838214611bff576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60608467ffffffffffffffff81118015611c1857600080fd5b50604051908082528060200260200182016040528015611c42578160200160208202803683370190505b50905060005b808614611ca557611c86878783818110611c5e57fe5b905060200201356001600160a01b0316868684818110611c7a57fe5b9050602002013561140b565b828281518110611c9257fe5b6020908102919091010152600101611c48565b5095945050505050565b60006115498261360f565b6008805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d405780601f10611d1557610100808354040283529160200191611d40565b820191906000526020600020905b815481529060010190602001808311611d2357829003601f168201915b505050505081565b600054600160a01b900460ff165b90565b611d64611786612949565b611db5576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b6117e884848484613688565b6000611549826137d3565b60006001600160a01b038216611e29576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b506001600160a01b031660009081526006602052604090205490565b611e4d612949565b6000546001600160a01b03908116911614611eaf576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b611f0e612949565b6000546001600160a01b03908116911614611f70576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611f7c60088383615b02565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b611fe9611d48565b1561202f576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b61185283838361383d565b612042612949565b6001600160a01b031661205361211f565b6001600160a01b0316146120ae576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f7420746865206f776e65720000000000000000604482015290519081900360640190fd5b611a70613ada565b6120c1611786612949565b612112576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b61185283838360016130ef565b6000546001600160a01b031690565b600082815260096020526040812061214c908363ffffffff613b9016565b9392505050565b600082815260096020526040812061214c908363ffffffff613b9c16565b6040518060400160405280600681526020017f524556562d49000000000000000000000000000000000000000000000000000081525081565b6121b5611786612949565b612206576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b61220f8161235f565b15612261576040805162461bcd60e51b815260206004820152601a60248201527f4d696e746572526f6c653a20616c7265616479204d696e746572000000000000604482015290519081900360640190fd5b61226c600082611927565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6122ae611786612949565b6122ff576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b612311600061230c612949565b611993565b612319612949565b6001600160a01b03167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a2565b600081565b61198f8282613bb1565b60006115498183612153565b600061154982613c92565b61237e611d48565b156123c4576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b6117e884848484613cb8565b60006123db8261282a565b15612411576000828152600460205260409020546001600160a01b031615612404576001612407565b60005b60ff16905061154c565b5060008181526003602052604090205461154c565b60006124318261282a565b612482576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b61154982613cc6565b6000818152600460205260409020546060906001600160a01b03166124f7576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b611549826117ee565b600081815260096020526040812061154990613cd3565b61251f612949565b6000546001600160a01b03908116911614612581576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61258a81613cde565b50565b6000828152600960205260409020600201546125ab90611945612949565b6119ea5760405162461bcd60e51b8152600401808060200182810382526030815260200180615c126030913960400191505060405180910390fd5b600061214c8383613e1f565b6125fa611d48565b15612640576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b6119208585858585613e4d565b612655611d48565b1561269b576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b61198f8282613fcb565b6126ad612949565b6000546001600160a01b0390811691161461270f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166127545760405162461bcd60e51b8152600401808060200182810382526026815260200180615bec6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6127c4611d48565b1561280a576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383614229565b600061214c836001600160a01b038416614511565b60007f80000000000000000000000000000000000000000000000000000000000000008216158015906115495750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f01ffc9a70000000000000000000000000000000000000000000000000000000014806128df57506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061291357506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806115495750506001600160e01b0319167fb44bec7f000000000000000000000000000000000000000000000000000000001490565b3390565b6000816001600160a01b0316836001600160a01b0316148061214c5750506001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166129f4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114612a4b576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000806000805b848114612bf9576000888281518110612a6757fe5b602002602001015190506000888381518110612a7f57fe5b60200260200101519050612a9282613c92565b15612aa757612aa28b838361455b565b612bef565b612ab08261282a565b15612ba257612ac28b8383600161464d565b60405182906001600160a01b038d16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46000612b0583613cc6565b905086612b185780965060019550612b9c565b868114612b9557856002600089815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008282540192505081905550856003600089815260200190815260200160002060008282540192505081905550809650858501945060019550612b9c565b8560010195505b50612bef565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b5050600101612a52565b508215612c4e5760008381526002602090815260408083206001600160a01b038c1680855290835281842080548701905586845260038352818420805487019055835260069091529020805491830191820190555b6001600160a01b0388166000612c62612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612cd2578181015183820152602001612cba565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612d11578181015183820152602001612cf9565b5050505090500194505050505060405180910390a4612d38886001600160a01b031661477c565b15612d4b57612d4b600089898989614782565b5050505050505050565b60606008612d628361499a565b6040516020018083805460018160011615610100020316600290048015612dc05780601f10612d9e576101008083540402835291820191612dc0565b820191906000526020600020905b815481529060010190602001808311612dac575b5050825160208401908083835b60208310612dec5780518252601f199092019160209182019101612dcd565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000612e32612949565b90506000612e40858361294d565b9050612e4b84613c92565b15612e6157612e5c85858584614aa9565b612eb6565b612e6a8461282a565b15612ba257612e7d858585846000614c05565b60405184906000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b60006001600160a01b0316856001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a45050505050565b611852838383604051806020016040528060008152506000614dcc565b6119208585858585614f3a565b6000828152600960205260409020612f63908263ffffffff61281516565b1561198f57612f70612949565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152600960205260409020612fd2908263ffffffff61525416565b1561198f57612fdf612949565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600054600160a01b900460ff16613081576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130d2612949565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b03841661314a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6131538361282a565b6131a4576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b6131b284846001600061464d565b60405183906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600160a01b03841660006131fe612949565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62866001604051808381526020018281526020019250505060405180910390a4613259846001600160a01b031661477c565b156117e85761326784615269565b156132805761327b60008585600186615331565b6117e8565b80156117e8576117e86000858585615445565b611852838383604051806020016040528060008152506001614dcc565b6001600160a01b03821661330b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b805160608167ffffffffffffffff8111801561332657600080fd5b50604051908082528060200260200182016040528015613350578160200160208202803683370190505b50905060008060005b8481146134ab57600086828151811061336e57fe5b602002602001015190506133818161282a565b6133d2576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b60018583815181106133e057fe5b6020026020010181815250506133f9888260018061464d565b60405181906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061343c82613cc6565b90508461344f57809450600193506134a1565b84811461349a5760008581526002602090815260408083206001600160a01b038d168452825280832080548801905596825260039052949094208054909301909255600191836134a1565b8360010193505b5050600101613359565b5060008281526002602090815260408083206001600160a01b038a168085529083528184208054860190558584526003835281842080548601905580845260069092528220805487019055906134ff612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8887604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561356f578181015183820152602001613557565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156135ae578181015183820152602001613596565b5050505090500194505050505060405180910390a46135d5866001600160a01b031661477c565b80156135e557506135e586615269565b1561360757613607600087878660405180602001604052806000815250614782565b505050505050565b600061361a8261282a565b1561366c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166136e3576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b60006136ed612949565b90506136f884613c92565b1561370d5761370885858561455b565b613761565b6137168461282a565b15612ba257613728858585600061464d565b60405184906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45b604080518581526020810185905281516001600160a01b0380891693600093918616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a46137c0856001600160a01b031661477c565b1561192057611920600086868686615331565b6000818152600460205260408120546001600160a01b038116611549576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b815181518114613894576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061389e612949565b905060006138ac868361294d565b90506000806000805b8681146139bf5760008982815181106138ca57fe5b602002602001015190506138dd81613c92565b15613906576139018b828b85815181106138f357fe5b602002602001015189614aa9565b6139b6565b61390f8161282a565b15612ba2576139358b828b858151811061392557fe5b6020026020010151896001614c05565b60405181906000906001600160a01b038e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600061397882613cc6565b90508561398b57809550600194506139b4565b8581146139ad5761399d8c87876155d9565b94506001939290920191846139b4565b8460010194505b505b506001016138b5565b5082156139f5576139d18984846155d9565b6001600160a01b038916600090815260066020526040902080549183019182900390555b60006001600160a01b0316896001600160a01b0316866001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015613a7b578181015183820152602001613a63565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015613aba578181015183820152602001613aa2565b5050505090500194505050505060405180910390a4505050505050505050565b600054600160a01b900460ff1615613b39576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130d2612949565b600061214c8383615619565b600061214c836001600160a01b03841661567d565b6000613bbb612949565b9050806001600160a01b0316836001600160a01b03161415613c24576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b6117e8848484846001614dcc565b6001600160e01b03191690565b600061154982615695565b613ce78161282a565b15613d39576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615613da3576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b613dab612949565b6000828152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055613ded81613c92565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000613e57612949565b90506001600160a01b038516613eb4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000613ec0878361294d565b9050613ecb85613c92565b15613ee257613edd8787878785615699565b613f41565b613eeb8561282a565b15612ba257613eff8787878785600061580c565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051808381526020018281526020019250505060405180910390a4613fb0866001600160a01b031661477c565b15613fc257613fc28787878787615331565b50505050505050565b6000613fd5612949565b90506000613fe3848361294d565b835190915060608167ffffffffffffffff8111801561400157600080fd5b5060405190808252806020026020018201604052801561402b578160200160208202803683370190505b50905060008060005b84811461411357600088828151811061404957fe5b60200260200101519050600185838151811061406157fe5b60200260200101818152505061408e8a8287858151811061407e57fe5b60200260200101518a6001614c05565b60405181906000906001600160a01b038d16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a460006140d182613cc6565b9050846140e45780945060019350614109565b848114614102576140f68b86866155d9565b80945060019350614109565b8360010193505b5050600101614034565b508115614145576141258883836155d9565b6001600160a01b0388166000908152600660205260409020805485900390555b60006001600160a01b0316886001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156141cb5781810151838201526020016141b3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561420a5781810151838201526020016141f2565b5050505090500194505050505060405180910390a45050505050505050565b6001600160a01b038216614284576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b600061428e612949565b9050600061429c858361294d565b835190915060608167ffffffffffffffff811180156142ba57600080fd5b506040519080825280602002602001820160405280156142e4578160200160208202803683370190505b50905060008060005b8481146143c557600088828151811061430257fe5b60200260200101519050600185838151811061431a57fe5b6020026020010181815250506143368b8b8360018b600161580c565b808a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600061438282613cc6565b90508461439557809450600193506143bb565b8481146143b4576143a88c8c878761599d565b809450600193506143bb565b8360010193505b50506001016142ed565b5081156143e3576143d88989848461599d565b6143e38989866159f1565b876001600160a01b0316896001600160a01b03166143ff612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561446f578181015183820152602001614457565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156144ae578181015183820152602001614496565b5050505090500194505050505060405180910390a46144d5886001600160a01b031661477c565b80156144e557506144e588615269565b15614506576145068989898660405180602001604052806000815250614782565b505050505050505050565b600061451d838361567d565b614553575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556114d0565b5060006114d0565b806145ad576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b600082815260036020526040902054818101818111614613576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b816001146146a2576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b60008381526004602052604090205415614703576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b0385169055806117e857600061472d84613cc6565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a16855283528184208054820190556006909252909120805490910190555050505050565b3b151590565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816147ba612949565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561484557818101518382015260200161482d565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561488457818101518382015260200161486c565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156148c05781810151838201526020016148a8565b50505050905090810190601f1680156148ed5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561491257600080fd5b505af1158015614926573d6000803e3d6000fd5b505050506040513d602081101561493c57600080fd5b50516001600160e01b03191614611920576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b6060816149db575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261154c565b8160005b81156149f357600101600a820491506149df565b60608167ffffffffffffffff81118015614a0c57600080fd5b506040519080825280601f01601f191660200182016040528015614a37576020820181803683370190505b50859350905060001982015b8315614aa057600a840660300160f81b82828060019003935081518110614a6657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350614a43565b50949350505050565b81614afb576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b80614b4d576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b038816845290915290205482811015614bc5576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008481526002602090815260408083206001600160a01b0390981683529681528682209285900390925593845260039052509190208054919091039055565b82600114614c5a576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600460205260409020546001600160a01b0386811690821614614cc9576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b82614d5a57600160a01b811615801590614d0957506000858152600760205260409020546001600160a01b0316614cfe612949565b6001600160a01b0316145b614d5a576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526004602052604090207fdead00000000000000000000000000000000000000000000000000000000000090558161360757614da486614d9d87613cc6565b60016155d9565b6001600160a01b03861660009081526006602052604090208054600019019055505050505050565b6001600160a01b038416614e27576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614e31612949565b90506000614e3f878361294d565b9050614e51878787600185600061580c565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051808381526020018281526020019250505060405180910390a4614f02866001600160a01b031661477c565b15613fc257614f1086615269565b15614f2857614f23878787600188615331565b613fc2565b8215613fc257613fc287878787615445565b6001600160a01b038416614f95576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114614fec576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000614ff6612949565b90506000615004888361294d565b90506000806000805b8681146151235760008a828151811061502257fe5b6020026020010151905061503581613c92565b1561505f5761505a8d8d838d868151811061504c57fe5b60200260200101518a615699565b61511a565b6150688161282a565b15612ba25761508f8d8d838d868151811061507f57fe5b60200260200101518a600161580c565b808c6001600160a01b03168e6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006150db82613cc6565b9050856150ee5780955060019450615118565b858114615111576151018e8e888861599d565b9450600193929092019184615118565b8460010194505b505b5060010161500d565b508215615143576151368b8b858561599d565b81016151438b8b836159f1565b896001600160a01b03168b6001600160a01b031661515f612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156151cf5781810151838201526020016151b7565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561520e5781810151838201526020016151f6565b5050505090500194505050505060405180910390a46152358a6001600160a01b031661477c565b15615247576152478b8b8b8b8b614782565b5050505050505050505050565b600061214c836001600160a01b038416615a3c565b604080517f4e2312e0000000000000000000000000000000000000000000000000000000006024808301919091528251808303909101815260449091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001781528251935160008082529485948594909392908183858b612710fa955080519450505050609e5a1161531e57fe5b8280156153285750815b95945050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61615369612949565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156153f55781810151838201526020016153dd565b50505050905090810190601f1680156154225780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561491257600080fd5b7f150b7a02000000000000000000000000000000000000000000000000000000006001600160a01b03841663150b7a0261547d612949565b8786866040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156155025781810151838201526020016154ea565b50505050905090810190601f16801561552f5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561555157600080fd5b505af1158015615565573d6000803e3d6000fd5b505050506040513d602081101561557b57600080fd5b50516001600160e01b031916146117e8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0390961683529481528482208054849003905592815260039092529190208054919091039055565b8154600090821061565b5760405162461bcd60e51b8152600401808060200182810382526022815260200180615b9b6022913960400191505060405180910390fd5b82600001828154811061566a57fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b806156eb576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b8161573d576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b0389168452909152902054828110156157b5576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b846001600160a01b0316866001600160a01b0316146136075760009384526002602090815260408086206001600160a01b039889168752909152808520918490039091559390941682529190208054909101905550565b82600114615861576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600460205260409020546001600160a01b03878116908216146158d0576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b8261596157600160a01b81161580159061591057506000858152600760205260409020546001600160a01b0316615905612949565b6001600160a01b0316145b615961576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526004602052604090206001600160a01b038716905581613fc25761598c878760016159f1565b613fc2878761599a88613cc6565b60015b826001600160a01b0316846001600160a01b0316146117e85760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816001600160a01b0316836001600160a01b031614611852576001600160a01b0380841660009081526006602052604080822080548590039055918416815220805482019055505050565b60008181526001830160205260408120548015615af85783546000198083019190810190600090879083908110615a6f57fe5b9060005260206000200154905080876000018481548110615a8c57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080615abc57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506114d0565b60009150506114d0565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615b435782800160ff19823516178555615b70565b82800160010185558215615b70579182015b82811115615b70578235825591602001919060010190615b55565b50615b7c929150615b80565b5090565b611d5691905b80821115615b7c5760008155600101615b8656fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212209e841bdddad73c1f10b8bdab736977aeeed7a9ba64193de66753a5260fa39e6264736f6c63430006080033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103405760003560e01c80637e518ec8116101bd578063adebf6f2116100f9578063d0011d9d116100a2578063f242432a1161007c578063f242432a146111ab578063f247296514611276578063f2fde38b14611329578063f3993d111461134f57610340565b8063d0011d9d14611134578063d547741f14611151578063e985e9c51461117d57610340565b8063c7778baa116100d3578063c7778baa146110dd578063c87b56dd146110fa578063ca15c8731461111757610340565b8063adebf6f214610fdd578063b88d4fde14610ffa578063bd85b039146110c057610340565b806391d148541161016657806398650275116101405780639865027514610f79578063a217fddf14610f81578063a22cb46514610f89578063aa271e1a14610fb757610340565b806391d1485414610f1f57806395d89b4114610f4b578063983b2d5614610f5357610340565b80638832e6e3116101975780638832e6e314610e395780638da5cb5b14610ef45780639010d07c14610efc57610340565b80637e518ec814610c8a5780638053493414610cfa5780638456cb5914610e3157610340565b806336568abe1161028c578063510b5158116102355780635cfa92971161020f5780635cfa929714610b7d5780636352211e14610c3f57806370a0823114610c5c578063715018a614610c8257610340565b8063510b515814610b505780635b2bd79e14610b6d5780635c975abb14610b7557610340565b806342842e0e1161026657806342842e0e146109555780634684d7e91461098b5780634e1273f414610a3e57610340565b806336568abe146108f55780633f4ba83a1461092157806340c10f191461092957610340565b80630e89341c116102ee578063248a9ca3116102c8578063248a9ca3146106e55780632eb2c2d6146107025780632f2ff15d146108c957610340565b80630e89341c14610660578063124d91e51461067d57806323b872dd146106af57610340565b8063081812fc1161031f578063081812fc1461043b578063095ea7b3146104745780630d6a5bbb146104a257610340565b8062fdd58e1461034557806301ffc9a71461038357806306fdde03146103be575b600080fd5b6103716004803603604081101561035b57600080fd5b506001600160a01b03813516906020013561140b565b60408051918252519081900360200190f35b6103aa6004803603602081101561039957600080fd5b50356001600160e01b0319166114d6565b604080519115158252519081900360200190f35b6103c6611551565b6040805160208082528351818301528351919283929083019185019080838360005b838110156104005781810151838201526020016103e8565b50505050905090810190601f16801561042d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6104586004803603602081101561045157600080fd5b503561158a565b604080516001600160a01b039092168252519081900360200190f35b6104a06004803603604081101561048a57600080fd5b506001600160a01b038135169060200135611629565b005b6104a0600480360360808110156104b857600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156104e357600080fd5b8201836020820111156104f557600080fd5b8035906020019184602083028401116401000000008311171561051757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561056757600080fd5b82018360208201111561057957600080fd5b8035906020019184602083028401116401000000008311171561059b57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156105eb57600080fd5b8201836020820111156105fd57600080fd5b8035906020019184600183028401116401000000008311171561061f57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061177b945050505050565b6103c66004803603602081101561067657600080fd5b50356117ee565b6104a06004803603606081101561069357600080fd5b506001600160a01b0381351690602081013590604001356117f9565b6104a0600480360360608110156106c557600080fd5b506001600160a01b03813581169160208101359091169060400135611857565b610371600480360360208110156106fb57600080fd5b50356118b0565b6104a0600480360360a081101561071857600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561074c57600080fd5b82018360208201111561075e57600080fd5b8035906020019184602083028401116401000000008311171561078057600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092959493602081019350359150506401000000008111156107d057600080fd5b8201836020820111156107e257600080fd5b8035906020019184602083028401116401000000008311171561080457600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561085457600080fd5b82018360208201111561086657600080fd5b8035906020019184600183028401116401000000008311171561088857600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506118c5945050505050565b6104a0600480360360408110156108df57600080fd5b50803590602001356001600160a01b0316611927565b6104a06004803603604081101561090b57600080fd5b50803590602001356001600160a01b0316611993565b6104a06119f4565b6104a06004803603604081101561093f57600080fd5b506001600160a01b038135169060200135611a72565b6104a06004803603606081101561096b57600080fd5b506001600160a01b03813581169160208101359091169060400135611aea565b6104a0600480360360408110156109a157600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156109cc57600080fd5b8201836020820111156109de57600080fd5b80359060200191846020830284011164010000000083111715610a0057600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611b43945050505050565b610b0060048036036040811015610a5457600080fd5b810190602081018135640100000000811115610a6f57600080fd5b820183602082011115610a8157600080fd5b80359060200191846020830284011164010000000083111715610aa357600080fd5b919390929091602081019035640100000000811115610ac157600080fd5b820183602082011115610ad357600080fd5b80359060200191846020830284011164010000000083111715610af557600080fd5b509092509050611ba9565b60408051602080825283518183015283519192839290830191858101910280838360005b83811015610b3c578181015183820152602001610b24565b505050509050019250505060405180910390f35b61045860048036036020811015610b6657600080fd5b5035611caf565b6103c6611cba565b6103aa611d48565b6104a060048036036080811015610b9357600080fd5b6001600160a01b038235169160208101359160408201359190810190608081016060820135640100000000811115610bca57600080fd5b820183602082011115610bdc57600080fd5b80359060200191846001830284011164010000000083111715610bfe57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611d59945050505050565b61045860048036036020811015610c5557600080fd5b5035611dc1565b61037160048036036020811015610c7257600080fd5b50356001600160a01b0316611dcc565b6104a0611e45565b6104a060048036036020811015610ca057600080fd5b810190602081018135640100000000811115610cbb57600080fd5b820183602082011115610ccd57600080fd5b80359060200191846001830284011164010000000083111715610cef57600080fd5b509092509050611f06565b6104a060048036036060811015610d1057600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610d3b57600080fd5b820183602082011115610d4d57600080fd5b80359060200191846020830284011164010000000083111715610d6f57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610dbf57600080fd5b820183602082011115610dd157600080fd5b80359060200191846020830284011164010000000083111715610df357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550611fe1945050505050565b6104a061203a565b6104a060048036036060811015610e4f57600080fd5b6001600160a01b0382351691602081013591810190606081016040820135640100000000811115610e7f57600080fd5b820183602082011115610e9157600080fd5b80359060200191846001830284011164010000000083111715610eb357600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506120b6945050505050565b61045861211f565b61045860048036036040811015610f1257600080fd5b508035906020013561212e565b6103aa60048036036040811015610f3557600080fd5b50803590602001356001600160a01b0316612153565b6103c6612171565b6104a060048036036020811015610f6957600080fd5b50356001600160a01b03166121aa565b6104a06122a3565b610371612350565b6104a060048036036040811015610f9f57600080fd5b506001600160a01b0381351690602001351515612355565b6103aa60048036036020811015610fcd57600080fd5b50356001600160a01b031661235f565b6103aa60048036036020811015610ff357600080fd5b503561236b565b6104a06004803603608081101561101057600080fd5b6001600160a01b0382358116926020810135909116916040820135919081019060808101606082013564010000000081111561104b57600080fd5b82018360208201111561105d57600080fd5b8035906020019184600183028401116401000000008311171561107f57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550612376945050505050565b610371600480360360208110156110d657600080fd5b50356123d0565b610371600480360360208110156110f357600080fd5b5035612426565b6103c66004803603602081101561111057600080fd5b503561248b565b6103716004803603602081101561112d57600080fd5b5035612500565b6104a06004803603602081101561114a57600080fd5b5035612517565b6104a06004803603604081101561116757600080fd5b50803590602001356001600160a01b031661258d565b6103aa6004803603604081101561119357600080fd5b506001600160a01b03813581169160200135166125e6565b6104a0600480360360a08110156111c157600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a08101608082013564010000000081111561120157600080fd5b82018360208201111561121357600080fd5b8035906020019184600183028401116401000000008311171561123557600080fd5b91908080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152509295506125f2945050505050565b6104a06004803603604081101561128c57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156112b757600080fd5b8201836020820111156112c957600080fd5b803590602001918460208302840111640100000000831117156112eb57600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061264d945050505050565b6104a06004803603602081101561133f57600080fd5b50356001600160a01b03166126a5565b6104a06004803603606081101561136557600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561139957600080fd5b8201836020820111156113ab57600080fd5b803590602001918460208302840111640100000000831117156113cd57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295506127bc945050505050565b60006001600160a01b038316611468576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b6114718261282a565b156114ab576000828152600460205260409020546001600160a01b0384811691161461149e5760006114a1565b60015b60ff1690506114d0565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006114e18261287c565b8061151557506001600160e01b031982167f80ac58cd00000000000000000000000000000000000000000000000000000000145b8061154957506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b90505b919050565b6040518060400160405280600e81526020017f5245565620496e76656e746f727900000000000000000000000000000000000081525081565b6000818152600460205260408120546001600160a01b0381166115f4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b600160a01b81161561161f5750506000818152600760205260409020546001600160a01b031661154c565b600091505061154c565b600061163482611dc1565b9050806001600160a01b0316836001600160a01b0316141561169d576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6116ae816116a9612949565b61294d565b6116ff576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008281526004602090815260408083206001600160a01b03808616600160a01b81179092556007909352818420805493881673ffffffffffffffffffffffffffffffffffffffff1990941684179055905185937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b61178b611786612949565b61235f565b6117dc576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b6117e884848484612999565b50505050565b606061154982612d55565b611801611d48565b15611847576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383612e28565b505050565b61185f611d48565b156118a5576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383612f1b565b60009081526009602052604090206002015490565b6118cd611d48565b15611913576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b6119208585858585612f38565b5050505050565b60008281526009602052604090206002015461194a90611945612949565b612153565b6119855760405162461bcd60e51b815260040180806020018281038252602f815260200180615bbd602f913960400191505060405180910390fd5b61198f8282612f45565b5050565b61199b612949565b6001600160a01b0316816001600160a01b0316146119ea5760405162461bcd60e51b815260040180806020018281038252602f815260200180615c42602f913960400191505060405180910390fd5b61198f8282612fb4565b6119fc612949565b6001600160a01b0316611a0d61211f565b6001600160a01b031614611a68576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f7420746865206f776e65720000000000000000604482015290519081900360640190fd5b611a70613023565b565b611a7d611786612949565b611ace576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b61198f82826040518060200160405280600081525060006130ef565b611af2611d48565b15611b38576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383613293565b611b4e611786612949565b611b9f576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b61198f82826132b0565b6060838214611bff576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60608467ffffffffffffffff81118015611c1857600080fd5b50604051908082528060200260200182016040528015611c42578160200160208202803683370190505b50905060005b808614611ca557611c86878783818110611c5e57fe5b905060200201356001600160a01b0316868684818110611c7a57fe5b9050602002013561140b565b828281518110611c9257fe5b6020908102919091010152600101611c48565b5095945050505050565b60006115498261360f565b6008805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611d405780601f10611d1557610100808354040283529160200191611d40565b820191906000526020600020905b815481529060010190602001808311611d2357829003601f168201915b505050505081565b600054600160a01b900460ff165b90565b611d64611786612949565b611db5576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b6117e884848484613688565b6000611549826137d3565b60006001600160a01b038216611e29576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b506001600160a01b031660009081526006602052604090205490565b611e4d612949565b6000546001600160a01b03908116911614611eaf576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a36000805473ffffffffffffffffffffffffffffffffffffffff19169055565b611f0e612949565b6000546001600160a01b03908116911614611f70576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b611f7c60088383615b02565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b611fe9611d48565b1561202f576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b61185283838361383d565b612042612949565b6001600160a01b031661205361211f565b6001600160a01b0316146120ae576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f7420746865206f776e65720000000000000000604482015290519081900360640190fd5b611a70613ada565b6120c1611786612949565b612112576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206e6f742061206d696e746572000000000000000000604482015290519081900360640190fd5b61185283838360016130ef565b6000546001600160a01b031690565b600082815260096020526040812061214c908363ffffffff613b9016565b9392505050565b600082815260096020526040812061214c908363ffffffff613b9c16565b6040518060400160405280600681526020017f524556562d49000000000000000000000000000000000000000000000000000081525081565b6121b5611786612949565b612206576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b61220f8161235f565b15612261576040805162461bcd60e51b815260206004820152601a60248201527f4d696e746572526f6c653a20616c7265616479204d696e746572000000000000604482015290519081900360640190fd5b61226c600082611927565b6040516001600160a01b038216907f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f690600090a250565b6122ae611786612949565b6122ff576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b612311600061230c612949565b611993565b612319612949565b6001600160a01b03167fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb6669260405160405180910390a2565b600081565b61198f8282613bb1565b60006115498183612153565b600061154982613c92565b61237e611d48565b156123c4576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b6117e884848484613cb8565b60006123db8261282a565b15612411576000828152600460205260409020546001600160a01b031615612404576001612407565b60005b60ff16905061154c565b5060008181526003602052604090205461154c565b60006124318261282a565b612482576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b61154982613cc6565b6000818152600460205260409020546060906001600160a01b03166124f7576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b611549826117ee565b600081815260096020526040812061154990613cd3565b61251f612949565b6000546001600160a01b03908116911614612581576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b61258a81613cde565b50565b6000828152600960205260409020600201546125ab90611945612949565b6119ea5760405162461bcd60e51b8152600401808060200182810382526030815260200180615c126030913960400191505060405180910390fd5b600061214c8383613e1f565b6125fa611d48565b15612640576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b6119208585858585613e4d565b612655611d48565b1561269b576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b61198f8282613fcb565b6126ad612949565b6000546001600160a01b0390811691161461270f576040805162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6001600160a01b0381166127545760405162461bcd60e51b8152600401808060200182810382526026815260200180615bec6026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6127c4611d48565b1561280a576040805162461bcd60e51b8152602060048201526011602482015270125b9d995b9d1bdc9e4e881c185d5cd959607a1b604482015290519081900360640190fd5b611852838383614229565b600061214c836001600160a01b038416614511565b60007f80000000000000000000000000000000000000000000000000000000000000008216158015906115495750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f01ffc9a70000000000000000000000000000000000000000000000000000000014806128df57506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061291357506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806115495750506001600160e01b0319167fb44bec7f000000000000000000000000000000000000000000000000000000001490565b3390565b6000816001600160a01b0316836001600160a01b0316148061214c5750506001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6001600160a01b0384166129f4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114612a4b576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000806000805b848114612bf9576000888281518110612a6757fe5b602002602001015190506000888381518110612a7f57fe5b60200260200101519050612a9282613c92565b15612aa757612aa28b838361455b565b612bef565b612ab08261282a565b15612ba257612ac28b8383600161464d565b60405182906001600160a01b038d16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46000612b0583613cc6565b905086612b185780965060019550612b9c565b868114612b9557856002600089815260200190815260200160002060008e6001600160a01b03166001600160a01b0316815260200190815260200160002060008282540192505081905550856003600089815260200190815260200160002060008282540192505081905550809650858501945060019550612b9c565b8560010195505b50612bef565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b5050600101612a52565b508215612c4e5760008381526002602090815260408083206001600160a01b038c1680855290835281842080548701905586845260038352818420805487019055835260069091529020805491830191820190555b6001600160a01b0388166000612c62612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015612cd2578181015183820152602001612cba565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015612d11578181015183820152602001612cf9565b5050505090500194505050505060405180910390a4612d38886001600160a01b031661477c565b15612d4b57612d4b600089898989614782565b5050505050505050565b60606008612d628361499a565b6040516020018083805460018160011615610100020316600290048015612dc05780601f10612d9e576101008083540402835291820191612dc0565b820191906000526020600020905b815481529060010190602001808311612dac575b5050825160208401908083835b60208310612dec5780518252601f199092019160209182019101612dcd565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000612e32612949565b90506000612e40858361294d565b9050612e4b84613c92565b15612e6157612e5c85858584614aa9565b612eb6565b612e6a8461282a565b15612ba257612e7d858585846000614c05565b60405184906000906001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45b60006001600160a01b0316856001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a45050505050565b611852838383604051806020016040528060008152506000614dcc565b6119208585858585614f3a565b6000828152600960205260409020612f63908263ffffffff61281516565b1561198f57612f70612949565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6000828152600960205260409020612fd2908263ffffffff61525416565b1561198f57612fdf612949565b6001600160a01b0316816001600160a01b0316837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45050565b600054600160a01b900460ff16613081576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6130d2612949565b604080516001600160a01b039092168252519081900360200190a1565b6001600160a01b03841661314a576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6131538361282a565b6131a4576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b6131b284846001600061464d565b60405183906001600160a01b038616906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46001600160a01b03841660006131fe612949565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62866001604051808381526020018281526020019250505060405180910390a4613259846001600160a01b031661477c565b156117e85761326784615269565b156132805761327b60008585600186615331565b6117e8565b80156117e8576117e86000858585615445565b611852838383604051806020016040528060008152506001614dcc565b6001600160a01b03821661330b576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b805160608167ffffffffffffffff8111801561332657600080fd5b50604051908082528060200260200182016040528015613350578160200160208202803683370190505b50905060008060005b8481146134ab57600086828151811061336e57fe5b602002602001015190506133818161282a565b6133d2576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b60018583815181106133e057fe5b6020026020010181815250506133f9888260018061464d565b60405181906001600160a01b038a16906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4600061343c82613cc6565b90508461344f57809450600193506134a1565b84811461349a5760008581526002602090815260408083206001600160a01b038d168452825280832080548801905596825260039052949094208054909301909255600191836134a1565b8360010193505b5050600101613359565b5060008281526002602090815260408083206001600160a01b038a168085529083528184208054860190558584526003835281842080548601905580845260069092528220805487019055906134ff612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8887604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561356f578181015183820152602001613557565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156135ae578181015183820152602001613596565b5050505090500194505050505060405180910390a46135d5866001600160a01b031661477c565b80156135e557506135e586615269565b1561360757613607600087878660405180602001604052806000815250614782565b505050505050565b600061361a8261282a565b1561366c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b0384166136e3576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b60006136ed612949565b90506136f884613c92565b1561370d5761370885858561455b565b613761565b6137168461282a565b15612ba257613728858585600061464d565b60405184906001600160a01b038716906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45b604080518581526020810185905281516001600160a01b0380891693600093918616927fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f629281900390910190a46137c0856001600160a01b031661477c565b1561192057611920600086868686615331565b6000818152600460205260408120546001600160a01b038116611549576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b815181518114613894576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061389e612949565b905060006138ac868361294d565b90506000806000805b8681146139bf5760008982815181106138ca57fe5b602002602001015190506138dd81613c92565b15613906576139018b828b85815181106138f357fe5b602002602001015189614aa9565b6139b6565b61390f8161282a565b15612ba2576139358b828b858151811061392557fe5b6020026020010151896001614c05565b60405181906000906001600160a01b038e16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a4600061397882613cc6565b90508561398b57809550600194506139b4565b8581146139ad5761399d8c87876155d9565b94506001939290920191846139b4565b8460010194505b505b506001016138b5565b5082156139f5576139d18984846155d9565b6001600160a01b038916600090815260066020526040902080549183019182900390555b60006001600160a01b0316896001600160a01b0316866001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8b8b604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b83811015613a7b578181015183820152602001613a63565b50505050905001838103825284818151815260200191508051906020019060200280838360005b83811015613aba578181015183820152602001613aa2565b5050505090500194505050505060405180910390a4505050505050505050565b600054600160a01b900460ff1615613b39576040805162461bcd60e51b815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015290519081900360640190fd5b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586130d2612949565b600061214c8383615619565b600061214c836001600160a01b03841661567d565b6000613bbb612949565b9050806001600160a01b0316836001600160a01b03161415613c24576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b6117e8848484846001614dcc565b6001600160e01b03191690565b600061154982615695565b613ce78161282a565b15613d39576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615613da3576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b613dab612949565b6000828152600560205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055613ded81613c92565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000613e57612949565b90506001600160a01b038516613eb4576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000613ec0878361294d565b9050613ecb85613c92565b15613ee257613edd8787878785615699565b613f41565b613eeb8561282a565b15612ba257613eff8787878785600061580c565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628888604051808381526020018281526020019250505060405180910390a4613fb0866001600160a01b031661477c565b15613fc257613fc28787878787615331565b50505050505050565b6000613fd5612949565b90506000613fe3848361294d565b835190915060608167ffffffffffffffff8111801561400157600080fd5b5060405190808252806020026020018201604052801561402b578160200160208202803683370190505b50905060008060005b84811461411357600088828151811061404957fe5b60200260200101519050600185838151811061406157fe5b60200260200101818152505061408e8a8287858151811061407e57fe5b60200260200101518a6001614c05565b60405181906000906001600160a01b038d16907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a460006140d182613cc6565b9050846140e45780945060019350614109565b848114614102576140f68b86866155d9565b80945060019350614109565b8360010193505b5050600101614034565b508115614145576141258883836155d9565b6001600160a01b0388166000908152600660205260409020805485900390555b60006001600160a01b0316886001600160a01b0316876001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156141cb5781810151838201526020016141b3565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561420a5781810151838201526020016141f2565b5050505090500194505050505060405180910390a45050505050505050565b6001600160a01b038216614284576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b600061428e612949565b9050600061429c858361294d565b835190915060608167ffffffffffffffff811180156142ba57600080fd5b506040519080825280602002602001820160405280156142e4578160200160208202803683370190505b50905060008060005b8481146143c557600088828151811061430257fe5b60200260200101519050600185838151811061431a57fe5b6020026020010181815250506143368b8b8360018b600161580c565b808a6001600160a01b03168c6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4600061438282613cc6565b90508461439557809450600193506143bb565b8481146143b4576143a88c8c878761599d565b809450600193506143bb565b8360010193505b50506001016142ed565b5081156143e3576143d88989848461599d565b6143e38989866159f1565b876001600160a01b0316896001600160a01b03166143ff612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a87604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561446f578181015183820152602001614457565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156144ae578181015183820152602001614496565b5050505090500194505050505060405180910390a46144d5886001600160a01b031661477c565b80156144e557506144e588615269565b15614506576145068989898660405180602001604052806000815250614782565b505050505050505050565b600061451d838361567d565b614553575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556114d0565b5060006114d0565b806145ad576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b600082815260036020526040902054818101818111614613576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b816001146146a2576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b60008381526004602052604090205415614703576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b0385169055806117e857600061472d84613cc6565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a16855283528184208054820190556006909252909120805490910190555050505050565b3b151590565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816147ba612949565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561484557818101518382015260200161482d565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561488457818101518382015260200161486c565b50505050905001848103825285818151815260200191508051906020019080838360005b838110156148c05781810151838201526020016148a8565b50505050905090810190601f1680156148ed5780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561491257600080fd5b505af1158015614926573d6000803e3d6000fd5b505050506040513d602081101561493c57600080fd5b50516001600160e01b03191614611920576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b6060816149db575060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015261154c565b8160005b81156149f357600101600a820491506149df565b60608167ffffffffffffffff81118015614a0c57600080fd5b506040519080825280601f01601f191660200182016040528015614a37576020820181803683370190505b50859350905060001982015b8315614aa057600a840660300160f81b82828060019003935081518110614a6657fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350614a43565b50949350505050565b81614afb576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b80614b4d576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b038816845290915290205482811015614bc5576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008481526002602090815260408083206001600160a01b0390981683529681528682209285900390925593845260039052509190208054919091039055565b82600114614c5a576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600460205260409020546001600160a01b0386811690821614614cc9576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b82614d5a57600160a01b811615801590614d0957506000858152600760205260409020546001600160a01b0316614cfe612949565b6001600160a01b0316145b614d5a576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526004602052604090207fdead00000000000000000000000000000000000000000000000000000000000090558161360757614da486614d9d87613cc6565b60016155d9565b6001600160a01b03861660009081526006602052604090208054600019019055505050505050565b6001600160a01b038416614e27576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b6000614e31612949565b90506000614e3f878361294d565b9050614e51878787600185600061580c565b84866001600160a01b0316886001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4856001600160a01b0316876001600160a01b0316836001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62886001604051808381526020018281526020019250505060405180910390a4614f02866001600160a01b031661477c565b15613fc257614f1086615269565b15614f2857614f23878787600188615331565b613fc2565b8215613fc257613fc287878787615445565b6001600160a01b038416614f95576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114614fec576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b6000614ff6612949565b90506000615004888361294d565b90506000806000805b8681146151235760008a828151811061502257fe5b6020026020010151905061503581613c92565b1561505f5761505a8d8d838d868151811061504c57fe5b60200260200101518a615699565b61511a565b6150688161282a565b15612ba25761508f8d8d838d868151811061507f57fe5b60200260200101518a600161580c565b808c6001600160a01b03168e6001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a460006150db82613cc6565b9050856150ee5780955060019450615118565b858114615111576151018e8e888861599d565b9450600193929092019184615118565b8460010194505b505b5060010161500d565b508215615143576151368b8b858561599d565b81016151438b8b836159f1565b896001600160a01b03168b6001600160a01b031661515f612949565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8c8c604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156151cf5781810151838201526020016151b7565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561520e5781810151838201526020016151f6565b5050505090500194505050505060405180910390a46152358a6001600160a01b031661477c565b15615247576152478b8b8b8b8b614782565b5050505050505050505050565b600061214c836001600160a01b038416615a3c565b604080517f4e2312e0000000000000000000000000000000000000000000000000000000006024808301919091528251808303909101815260449091018252602081810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f01ffc9a7000000000000000000000000000000000000000000000000000000001781528251935160008082529485948594909392908183858b612710fa955080519450505050609e5a1161531e57fe5b8280156153285750815b95945050505050565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61615369612949565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03166001600160a01b03168152602001856001600160a01b03166001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156153f55781810151838201526020016153dd565b50505050905090810190601f1680156154225780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561491257600080fd5b7f150b7a02000000000000000000000000000000000000000000000000000000006001600160a01b03841663150b7a0261547d612949565b8786866040518563ffffffff1660e01b815260040180856001600160a01b03166001600160a01b03168152602001846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156155025781810151838201526020016154ea565b50505050905090810190601f16801561552f5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b15801561555157600080fd5b505af1158015615565573d6000803e3d6000fd5b505050506040513d602081101561557b57600080fd5b50516001600160e01b031916146117e8576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b0390961683529481528482208054849003905592815260039092529190208054919091039055565b8154600090821061565b5760405162461bcd60e51b8152600401808060200182810382526022815260200180615b9b6022913960400191505060405180910390fd5b82600001828154811061566a57fe5b9060005260206000200154905092915050565b60009081526001919091016020526040902054151590565b5490565b806156eb576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b8161573d576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b0389168452909152902054828110156157b5576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b846001600160a01b0316866001600160a01b0316146136075760009384526002602090815260408086206001600160a01b039889168752909152808520918490039091559390941682529190208054909101905550565b82600114615861576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000848152600460205260409020546001600160a01b03878116908216146158d0576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b8261596157600160a01b81161580159061591057506000858152600760205260409020546001600160a01b0316615905612949565b6001600160a01b0316145b615961576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008581526004602052604090206001600160a01b038716905581613fc25761598c878760016159f1565b613fc2878761599a88613cc6565b60015b826001600160a01b0316846001600160a01b0316146117e85760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b816001600160a01b0316836001600160a01b031614611852576001600160a01b0380841660009081526006602052604080822080548590039055918416815220805482019055505050565b60008181526001830160205260408120548015615af85783546000198083019190810190600090879083908110615a6f57fe5b9060005260206000200154905080876000018481548110615a8c57fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080615abc57fe5b600190038181906000526020600020016000905590558660010160008781526020019081526020016000206000905560019450505050506114d0565b60009150506114d0565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10615b435782800160ff19823516178555615b70565b82800160010185558215615b70579182015b82811115615b70578235825591602001919060010190615b55565b50615b7c929150615b80565b5090565b611d5691905b80821115615b7c5760008155600101615b8656fe456e756d657261626c655365743a20696e646578206f7574206f6620626f756e6473416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f206772616e744f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373416363657373436f6e74726f6c3a2073656e646572206d75737420626520616e2061646d696e20746f207265766f6b65416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66a26469706673582212209e841bdddad73c1f10b8bdab736977aeeed7a9ba64193de66753a5260fa39e6264736f6c63430006080033

Deployed Bytecode Sourcemap

109013:6848:0:-:0;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;109013:6848:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12:1:-1;9;2:12;37570:319:0;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;37570:319:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;44765:240;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;44765:240:0;-1:-1:-1;;;;;;44765:240:0;;:::i;:::-;;;;;;;;;;;;;;;;;;109269:55;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;109269:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46194:387;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;46194:387:0;;:::i;:::-;;;;-1:-1:-1;;;;;46194:387:0;;;;;;;;;;;;;;45696:440;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;45696:440:0;;;;;;;;:::i;:::-;;113067:293;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;113067:293:0;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;113067:293:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;113067:293:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;113067:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;113067:293:0;;;;;;;;-1:-1:-1;113067:293:0;;-1:-1:-1;;27:11;11:28;;8:2;;;52:1;49;42:12;8:2;113067:293:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;113067:293:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;113067:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;113067:293:0;;;;;;;;-1:-1:-1;113067:293:0;;-1:-1:-1;;27:11;11:28;;8:2;;;52:1;49;42:12;8:2;113067:293:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;113067:293:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;113067:293:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;113067:293:0;;-1:-1:-1;113067:293:0;;-1:-1:-1;;;;;113067:293:0:i;109602:112::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;109602:112:0;;:::i;115384:217::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;115384:217:0;;;;;;;;;;;;;:::i;113460:225::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;113460:225:0;;;;;;;;;;;;;;;;;:::i;101420:114::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;101420:114:0;;:::i;115052:324::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;115052:324:0;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;115052:324:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;115052:324:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;115052:324:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;115052:324:0;;;;;;;;-1:-1:-1;115052:324:0;;-1:-1:-1;;27:11;11:28;;8:2;;;52:1;49;42:12;8:2;115052:324:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;115052:324:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;115052:324:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;115052:324:0;;;;;;;;-1:-1:-1;115052:324:0;;-1:-1:-1;;27:11;11:28;;8:2;;;52:1;49;42:12;8:2;115052:324:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;115052:324:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;115052:324:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;115052:324:0;;-1:-1:-1;115052:324:0;;-1:-1:-1;;;;;115052:324:0:i;101796:227::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;101796:227:0;;;;;;-1:-1:-1;;;;;101796:227:0;;:::i;103005:209::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;103005:209:0;;;;;;-1:-1:-1;;;;;103005:209:0;;:::i;110543:136::-;;;:::i;111495:180::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;111495:180:0;;;;;;;;:::i;113947:233::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;113947:233:0;;;;;;;;;;;;;;;;;:::i;111854:190::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;111854:190:0;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;111854:190:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;111854:190:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;111854:190:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;111854:190:0;;-1:-1:-1;111854:190:0;;-1:-1:-1;;;;;111854:190:0:i;37963:445::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;37963:445:0;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37963:445:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37963:445:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;37963:445:0;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;37963:445:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;37963:445:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;-1:-1;37963:445:0;;-1:-1:-1;37963:445:0;-1:-1:-1;37963:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:100:-1;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;37963:445:0;;;;;;;;;;;;;;;;;109894:128;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;109894:128:0;;:::i;87000:29::-;;;:::i;107731:78::-;;;:::i;112621:261::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;112621:261:0;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;112621:261:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;112621:261:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;112621:261:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;112621:261:0;;-1:-1:-1;112621:261:0;;-1:-1:-1;;;;;112621:261:0:i;45463:171::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45463:171:0;;:::i;45159:209::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;45159:209:0;-1:-1:-1;;;;;45159:209:0;;:::i;85193:148::-;;;:::i;87038:186::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;87038:186:0;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;87038:186:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;87038:186:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;-1:-1;87038:186:0;;-1:-1:-1;87038:186:0;-1:-1:-1;87038:186:0;:::i;115609:249::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;115609:249:0;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;115609:249:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;115609:249:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;115609:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;115609:249:0;;;;;;;;-1:-1:-1;115609:249:0;;-1:-1:-1;;27:11;11:28;;8:2;;;52:1;49;42:12;8:2;115609:249:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;115609:249:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;115609:249:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;115609:249:0;;-1:-1:-1;115609:249:0;;-1:-1:-1;;;;;115609:249:0:i;110403:132::-;;;:::i;112214:238::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;112214:238:0;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;112214:238:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;112214:238:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;112214:238:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;112214:238:0;;-1:-1:-1;112214:238:0;;-1:-1:-1;;;;;112214:238:0:i;84551:79::-;;;:::i;101093:138::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;101093:138:0;;;;;;;:::i;100054:139::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;100054:139:0;;;;;;-1:-1:-1;;;;;100054:139:0;;:::i;109386:49::-;;;:::i;106197:215::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;106197:215:0;-1:-1:-1;;;;;106197:215:0;;:::i;106481:152::-;;;:::i;98799:49::-;;;:::i;47043:199::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;47043:199:0;;;;;;;;;;:::i;105935:124::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;105935:124:0;-1:-1:-1;;;;;105935:124:0;;:::i;39191:::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39191:124:0;;:::i;114188:267::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;114188:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;114188:267:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;114188:267:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;114188:267:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;114188:267:0;;-1:-1:-1;114188:267:0;;-1:-1:-1;;;;;114188:267:0:i;39961:258::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39961:258:0;;:::i;39384:215::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;39384:215:0;;:::i;50622:212::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;50622:212:0;;:::i;100367:127::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;100367:127:0;;:::i;111098:117::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;111098:117:0;;:::i;102268:230::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;102268:230:0;;;;;;-1:-1:-1;;;;;102268:230:0;;:::i;46700:224::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;;46700:224:0;;;;;;;;;;:::i;114752:292::-;;;;;;15:3:-1;10;7:12;4:2;;;32:1;29;22:12;4:2;-1:-1;;;;;114752:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;114752:292:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;114752:292:0;;;;;;100:9:-1;95:1;81:12;77:20;67:8;63:35;60:50;39:11;25:12;22:29;11:107;8:2;;;131:1;128;121:12;8:2;114752:292:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;114752:292:0;;-1:-1:-1;114752:292:0;;-1:-1:-1;;;;;114752:292:0:i;114463:188::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;114463:188:0;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;114463:188:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;114463:188:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;114463:188:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;114463:188:0;;-1:-1:-1;114463:188:0;;-1:-1:-1;;;;;114463:188:0:i;85496:244::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;85496:244:0;-1:-1:-1;;;;;85496:244:0;;:::i;113693:246::-;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;;;;;113693:246:0;;;;;;;;;;;;;;;;;;;;;;;27:11:-1;11:28;;8:2;;;52:1;49;42:12;8:2;113693:246:0;;41:9:-1;34:4;18:14;14:25;11:40;8:2;;;64:1;61;54:12;8:2;113693:246:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;113693:246:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16;;74:27;;;;-1:-1;113693:246:0;;-1:-1:-1;113693:246:0;;-1:-1:-1;;;;;113693:246:0:i;37570:319::-;37654:7;-1:-1:-1;;;;;37682:19:0;;37674:55;;;;;-1:-1:-1;;;37674:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;37746:23;:2;:21;:23::i;:::-;37742:100;;;37801:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;37793:29:0;;;;;;:37;;37829:1;37793:37;;;37825:1;37793:37;37786:44;;;;;;37742:100;-1:-1:-1;37861:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;37861:20:0;;;;;;;;;;37570:319;;;;;:::o;44765:240::-;44850:4;44874:36;44898:11;44874:23;:36::i;:::-;:75;;;-1:-1:-1;;;;;;;44914:35:0;;44243:25;44914:35;44874:75;:123;;;-1:-1:-1;;;;;;;44953:44:0;;44331:33;44953:44;44874:123;44867:130;;44765:240;;;;:::o;109269:55::-;;;;;;;;;;;;;;;;;;;:::o;46194:387::-;46270:7;46311:14;;;:7;:14;;;;;;-1:-1:-1;;;;;46344:33:0;;46336:73;;;;;-1:-1:-1;;;46336:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;46424:39:0;;:44;46420:154;;-1:-1:-1;;46492:20:0;;;;:13;:20;;;;;;-1:-1:-1;;;;;46492:20:0;46485:27;;46420:154;46560:1;46545:17;;;;;45696:440;45777:18;45798:14;45806:5;45798:7;:14::i;:::-;45777:35;;45837:10;-1:-1:-1;;;;;45831:16:0;:2;-1:-1:-1;;;;;45831:16:0;;;45823:53;;;;;-1:-1:-1;;;45823:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45895:39;45909:10;45921:12;:10;:12::i;:::-;45895:13;:39::i;:::-;45887:82;;;;;-1:-1:-1;;;45887:82:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45980:14;;;;:7;:14;;;;;;;;-1:-1:-1;;;;;45997:19:0;;;-1:-1:-1;;;45997:48:0;;45980:65;;;46056:13;:20;;;;;;:25;;;;;-1:-1:-1;;46056:25:0;;;;;;;46097:31;;45988:5;;46097:31;;;45696:440;;;:::o;113067:293::-;113254:22;113263:12;:10;:12::i;:::-;113254:8;:22::i;:::-;113246:58;;;;;-1:-1:-1;;;113246:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;113315:37;113330:2;113334:3;113339:6;113347:4;113315:14;:37::i;:::-;113067:293;;;;:::o;109602:112::-;109665:13;109698:8;109703:2;109698:4;:8::i;115384:217::-;115521:8;:6;:8::i;:::-;115520:9;115512:39;;;;;-1:-1:-1;;;115512:39:0;;;;;;;;;;;;-1:-1:-1;;;115512:39:0;;;;;;;;;;;;;;;115562:31;115577:4;115583:2;115587:5;115562:14;:31::i;:::-;115384:217;;;:::o;113460:225::-;113601:8;:6;:8::i;:::-;113600:9;113592:39;;;;;-1:-1:-1;;;113592:39:0;;;;;;;;;;;;-1:-1:-1;;;113592:39:0;;;;;;;;;;;;;;;113642:35;113661:4;113667:2;113671:5;113642:18;:35::i;101420:114::-;101477:7;101504:12;;;:6;:12;;;;;:22;;;;101420:114::o;115052:324::-;115271:8;:6;:8::i;:::-;115270:9;115262:39;;;;;-1:-1:-1;;;115262:39:0;;;;;;;;;;;;-1:-1:-1;;;115262:39:0;;;;;;;;;;;;;;;115312:56;115340:4;115346:2;115350:3;115355:6;115363:4;115312:27;:56::i;:::-;115052:324;;;;;:::o;101796:227::-;101888:12;;;;:6;:12;;;;;:22;;;101880:45;;101912:12;:10;:12::i;:::-;101880:7;:45::i;:::-;101872:105;;;;-1:-1:-1;;;101872:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101990:25;102001:4;102007:7;101990:10;:25::i;:::-;101796:227;;:::o;103005:209::-;103103:12;:10;:12::i;:::-;-1:-1:-1;;;;;103092:23:0;:7;-1:-1:-1;;;;;103092:23:0;;103084:83;;;;-1:-1:-1;;;103084:83:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;103180:26;103192:4;103198:7;103180:11;:26::i;110543:136::-;110609:12;:10;:12::i;:::-;-1:-1:-1;;;;;110598:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;110598:23:0;;110590:60;;;;;-1:-1:-1;;;110590:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;110661:10;:8;:10::i;:::-;110543:136::o;111495:180::-;111579:22;111588:12;:10;:12::i;111579:22::-;111571:58;;;;;-1:-1:-1;;;111571:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;111640:27;111646:2;111650:5;111640:27;;;;;;;;;;;;111661:5;111640;:27::i;113947:233::-;114092:8;:6;:8::i;:::-;114091:9;114083:39;;;;;-1:-1:-1;;;114083:39:0;;;;;;;;;;;;-1:-1:-1;;;114083:39:0;;;;;;;;;;;;;;;114133;114156:4;114162:2;114166:5;114133:22;:39::i;111854:190::-;111953:22;111962:12;:10;:12::i;111953:22::-;111945:58;;;;;-1:-1:-1;;;111945:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;112014:22;112025:2;112029:6;112014:10;:22::i;37963:445::-;38078:16;38115:27;;;38107:70;;;;;-1:-1:-1;;;38107:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38190:25;38232:6;38218:28;;;2:2:-1;;;;27:1;24;17:12;2:2;38218:28:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;38218:28:0;-1:-1:-1;38190:56:0;-1:-1:-1;38264:9:0;38259:114;38279:18;;;38259:114;;38333:28;38343:6;;38350:1;38343:9;;;;;;;;;;;;;-1:-1:-1;;;;;38343:9:0;38354:3;;38358:1;38354:6;;;;;;;;;;;;;38333:9;:28::i;:::-;38319:8;38328:1;38319:11;;;;;;;;;;;;;;;;;:42;38299:3;;38259:114;;;-1:-1:-1;38392:8:0;37963:445;-1:-1:-1;;;;;37963:445:0:o;109894:128::-;109965:7;109992:22;110001:12;109992:8;:22::i;87000:29::-;;;;;;;;;;;;;;;-1:-1:-1;;87000:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;107731:78::-;107770:4;107794:7;-1:-1:-1;;;107794:7:0;;;;107731:78;;:::o;112621:261::-;112783:22;112792:12;:10;:12::i;112783:22::-;112775:58;;;;;-1:-1:-1;;;112775:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;112844:30;112854:2;112858;112862:5;112869:4;112844:9;:30::i;45463:171::-;45564:7;45591:35;45620:5;45591:28;:35::i;45159:209::-;45238:7;-1:-1:-1;;;;;45266:24:0;;45258:60;;;;;-1:-1:-1;;;45258:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;45336:24:0;;;;;:12;:24;;;;;;;45159:209::o;85193:148::-;84773:12;:10;:12::i;:::-;84763:6;;-1:-1:-1;;;;;84763:6:0;;;:22;;;84755:67;;;;;-1:-1:-1;;;84755:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85300:1:::1;85284:6:::0;;85263:40:::1;::::0;-1:-1:-1;;;;;85284:6:0;;::::1;::::0;85263:40:::1;::::0;85300:1;;85263:40:::1;85331:1;85314:19:::0;;-1:-1:-1;;85314:19:0::1;::::0;;85193:148::o;87038:186::-;84773:12;:10;:12::i;:::-;84763:6;;-1:-1:-1;;;;;84763:6:0;;;:22;;;84755:67;;;;;-1:-1:-1;;;84755:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;87130:34:::1;:15;87148:16:::0;;87130:34:::1;:::i;:::-;;87180:36;87199:16;;87180:36;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;81:16:::0;;::::1;74:27:::0;87180:36:0::1;::::0;137:4:-1::1;117:14:::0;;::::1;-1:-1:::0;;113:30:::1;157:16:::0;;::::1;87180:36:0::0;;::::1;::::0;-1:-1:-1;87180:36:0;;-1:-1:-1;;;;87180:36:0::1;87038:186:::0;;:::o;115609:249::-;115771:8;:6;:8::i;:::-;115770:9;115762:39;;;;;-1:-1:-1;;;115762:39:0;;;;;;;;;;;;-1:-1:-1;;;115762:39:0;;;;;;;;;;;;;;;115812:38;115832:4;115838:3;115843:6;115812:19;:38::i;110403:132::-;110467:12;:10;:12::i;:::-;-1:-1:-1;;;;;110456:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;110456:23:0;;110448:60;;;;;-1:-1:-1;;;110448:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;110519:8;:6;:8::i;112214:238::-;112355:22;112364:12;:10;:12::i;112355:22::-;112347:58;;;;;-1:-1:-1;;;112347:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;112416:28;112422:2;112426:5;112433:4;112439;112416:5;:28::i;84551:79::-;84589:7;84616:6;-1:-1:-1;;;;;84616:6:0;84551:79;:::o;101093:138::-;101166:7;101193:12;;;:6;:12;;;;;:30;;101217:5;101193:30;:23;:30;:::i;:::-;101186:37;101093:138;-1:-1:-1;;;101093:138:0:o;100054:139::-;100123:4;100147:12;;;:6;:12;;;;;:38;;100177:7;100147:38;:29;:38;:::i;109386:49::-;;;;;;;;;;;;;;;;;;;:::o;106197:215::-;105444:22;105453:12;:10;:12::i;105444:22::-;105436:59;;;;;-1:-1:-1;;;105436:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;106271:17:::1;106280:7;106271:8;:17::i;:::-;106270:18;106262:57;;;::::0;;-1:-1:-1;;;106262:57:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;106330:38;98844:4;106360:7:::0;106330:9:::1;:38::i;:::-;106384:20;::::0;-1:-1:-1;;;;;106384:20:0;::::1;::::0;::::1;::::0;;;::::1;106197:215:::0;:::o;106481:152::-;105444:22;105453:12;:10;:12::i;105444:22::-;105436:59;;;;;-1:-1:-1;;;105436:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;106536:46:::1;98844:4;106569:12;:10;:12::i;:::-;106536;:46::i;:::-;106612:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;106598:27:0::1;;;;;;;;;;;106481:152::o:0;98799:49::-;98844:4;98799:49;:::o;47043:199::-;47176:58;47215:8;47225;47176:38;:58::i;105935:124::-;105991:4;106015:36;105991:4;106043:7;106015;:36::i;39191:124::-;39263:4;39287:20;:2;:18;:20::i;114188:267::-;114361:8;:6;:8::i;:::-;114360:9;114352:39;;;;;-1:-1:-1;;;114352:39:0;;;;;;;;;;;;-1:-1:-1;;;114352:39:0;;;;;;;;;;;;;;;114402:45;114425:4;114431:2;114435:5;114442:4;114402:22;:45::i;39961:258::-;40034:7;40058:23;:2;:21;:23::i;:::-;40054:158;;;40137:1;40113:11;;;:7;:11;;;;;;-1:-1:-1;;;;;40105:34:0;;:42;;40146:1;40105:42;;;40142:1;40105:42;40098:49;;;;;;40054:158;-1:-1:-1;40187:13:0;;;;:9;:13;;;;;;40180:20;;39384:215;39461:7;39489:26;:5;:24;:26::i;:::-;39481:60;;;;;-1:-1:-1;;;39481:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39559:32;:5;:30;:32::i;50622:212::-;50764:1;50737:14;;;:7;:14;;;;;;50695:13;;-1:-1:-1;;;;;50729:37:0;50721:77;;;;;-1:-1:-1;;;50721:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;50816:10;50820:5;50816:3;:10::i;100367:127::-;100430:7;100457:12;;;:6;:12;;;;;:29;;:27;:29::i;111098:117::-;84773:12;:10;:12::i;:::-;84763:6;;-1:-1:-1;;;;;84763:6:0;;;:22;;;84755:67;;;;;-1:-1:-1;;;84755:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111176:31:::1;111194:12;111176:17;:31::i;:::-;111098:117:::0;:::o;102268:230::-;102361:12;;;;:6;:12;;;;;:22;;;102353:45;;102385:12;:10;:12::i;102353:45::-;102345:106;;;;-1:-1:-1;;;102345:106:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46700:224;46833:4;46857:59;46895:10;46907:8;46857:37;:59::i;114752:292::-;114946:8;:6;:8::i;:::-;114945:9;114937:39;;;;;-1:-1:-1;;;114937:39:0;;;;;;;;;;;;-1:-1:-1;;;114937:39:0;;;;;;;;;;;;;;;114987:49;115010:4;115016:2;115020;115024:5;115031:4;114987:22;:49::i;114463:188::-;114569:8;:6;:8::i;:::-;114568:9;114560:39;;;;;-1:-1:-1;;;114560:39:0;;;;;;;;;;;;-1:-1:-1;;;114560:39:0;;;;;;;;;;;;;;;114610:33;114630:4;114636:6;114610:19;:33::i;85496:244::-;84773:12;:10;:12::i;:::-;84763:6;;-1:-1:-1;;;;;84763:6:0;;;:22;;;84755:67;;;;;-1:-1:-1;;;84755:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;85585:22:0;::::1;85577:73;;;;-1:-1:-1::0;;;85577:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;85687:6;::::0;;85666:38:::1;::::0;-1:-1:-1;;;;;85666:38:0;;::::1;::::0;85687:6;::::1;::::0;85666:38:::1;::::0;::::1;85715:6;:17:::0;;-1:-1:-1;;85715:17:0::1;-1:-1:-1::0;;;;;85715:17:0;;;::::1;::::0;;;::::1;::::0;;85496:244::o;113693:246::-;113849:8;:6;:8::i;:::-;113848:9;113840:39;;;;;-1:-1:-1;;;113840:39:0;;;;;;;;;;;;-1:-1:-1;;;113840:39:0;;;;;;;;;;;;;;;113890:41;113914:4;113920:2;113924:6;113890:23;:41::i;94062:143::-;94132:4;94156:41;94161:3;-1:-1:-1;;;;;94181:14:0;;94156:4;:41::i;35206:140::-;35269:4;34849:8;35293:12;;:17;;;;:45;;-1:-1:-1;;35060:20:0;35314:19;:24;;;35206:140::o;37065:347::-;37150:4;-1:-1:-1;;;;;;37187:35:0;;35715:25;37187:35;;:88;;-1:-1:-1;;;;;;;37239:36:0;;35795:26;37239:36;37187:88;:154;;;-1:-1:-1;;;;;;;37292:49:0;;35889:37;37292:49;37187:154;:217;;;-1:-1:-1;;;;;;;;37358:46:0;35991:35;37358:46;;37065:347::o;16510:106::-;16598:10;16510:106;:::o;41736:160::-;41820:4;41853:6;-1:-1:-1;;;;;41845:14:0;:4;-1:-1:-1;;;;;41845:14:0;;41844:44;;;-1:-1:-1;;;;;;;41864:16:0;;;;;;;:10;:16;;;;;;;;:24;;;;;;;;;;;;;;;41736:160::o;60134:2110::-;-1:-1:-1;;;;;60315:16:0;;60307:56;;;;;-1:-1:-1;;;60307:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;60391:10;;60430:13;;60420:23;;60412:66;;;;;-1:-1:-1;;;60412:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;60491:22;60524:25;60560:17;60593:9;60588:1191;60609:6;60604:1;:11;60588:1191;;60637:10;60650:3;60654:1;60650:6;;;;;;;;;;;;;;60637:19;;60671:13;60687:6;60694:1;60687:9;;;;;;;;;;;;;;60671:25;;60715:20;:2;:18;:20::i;:::-;60711:1057;;;60756:28;60770:2;60774;60778:5;60756:13;:28::i;:::-;60711:1057;;;60810:23;:2;:21;:23::i;:::-;60806:962;;;60854:29;60863:2;60867;60871:5;60878:4;60854:8;:29::i;:::-;60907:28;;60932:2;;-1:-1:-1;;;;;60907:28:0;;;60924:1;;60907:28;;60924:1;;60907:28;60954:24;60981:29;:2;:27;:29::i;:::-;60954:56;-1:-1:-1;61033:19:0;61029:648;;61094:16;61077:33;;61153:1;61133:21;;61029:648;;;61227:14;61207:16;:34;61203:455;;61303:17;61270:9;:25;61280:14;61270:25;;;;;;;;;;;:29;61296:2;-1:-1:-1;;;;;61270:29:0;-1:-1:-1;;;;;61270:29:0;;;;;;;;;;;;;:50;;;;;;;;;;;61376:17;61347:9;:25;61357:14;61347:25;;;;;;;;;;;;:46;;;;;;;;;;;61437:16;61420:33;;61493:17;61480:30;;;;61557:1;61537:21;;61203:455;;;61615:19;;;;;61203:455;60806:962;;;;61717:35;;;-1:-1:-1;;;61717:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;60806:962;-1:-1:-1;;60617:3:0;;60588:1191;;;-1:-1:-1;61795:19:0;;61791:252;;61831:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;61831:29:0;;;;;;;;;;;:50;;;;;;61896:25;;;:9;:25;;;;;:46;;;;;;62002:16;;:12;:16;;;;;:29;;61957:30;;;62002:29;;;;;61791:252;-1:-1:-1;;;;;62060:56:0;;62096:1;62074:12;:10;:12::i;:::-;-1:-1:-1;;;;;62060:56:0;;62104:3;62109:6;62060:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;62060:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;62060:56:0;;;;;;;;;;;;;;;;;;;62131:15;:2;-1:-1:-1;;;;;62131:13:0;;:15::i;:::-;62127:110;;;62163:62;62199:1;62203:2;62207:3;62212:6;62220:4;62163:27;:62::i;:::-;60134:2110;;;;;;;;:::o;87232:161::-;87289:13;87346:15;87363:20;:2;:18;:20::i;:::-;87329:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;87329:55:0;;;;;;;;;36:153:-1;66:2;61:3;58:11;36:153;;176:10;;164:23;;-1:-1;;139:12;;;;98:2;89:12;;;;114;36:153;;;274:1;267:3;263:2;259:12;254:3;250:22;246:30;315:4;311:9;305:3;299:10;295:26;356:4;350:3;344:10;340:21;389:7;380;377:20;372:3;365:33;3:399;;;87329:55:0;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;87329:55:0;;;87315:70;;87232:161;;;:::o;71351:621::-;71479:14;71496:12;:10;:12::i;:::-;71479:29;;71519:15;71537:27;71551:4;71557:6;71537:13;:27::i;:::-;71519:45;;71581:20;:2;:18;:20::i;:::-;71577:319;;;71618:42;71632:4;71638:2;71642:5;71649:10;71618:13;:42::i;:::-;71577:319;;;71682:23;:2;:21;:23::i;:::-;71678:218;;;71722:44;71731:4;71737:2;71741:5;71748:10;71760:5;71722:8;:44::i;:::-;71786:30;;71813:2;;71809:1;;-1:-1:-1;;;;;71786:30:0;;;;;71809:1;;71786:30;71678:218;71950:1;-1:-1:-1;;;;;71913:51:0;71936:4;-1:-1:-1;;;;;71913:51:0;71928:6;-1:-1:-1;;;;;71913:51:0;;71954:2;71958:5;71913:51;;;;;;;;;;;;;;;;;;;;;;;;71351:621;;;;;:::o;47416:281::-;47548:141;47576:4;47595:2;47612:5;47548:141;;;;;;;;;;;;47673:5;47548:13;:141::i;52157:329::-;52427:51;52450:4;52456:2;52460:3;52465:6;52473:4;52427:22;:51::i;104248:188::-;104322:12;;;;:6;:12;;;;;:33;;104347:7;104322:33;:24;:33;:::i;:::-;104318:111;;;104404:12;:10;:12::i;:::-;-1:-1:-1;;;;;104377:40:0;104395:7;-1:-1:-1;;;;;104377:40:0;104389:4;104377:40;;;;;;;;;;104248:188;;:::o;104444:192::-;104519:12;;;;:6;:12;;;;;:36;;104547:7;104519:36;:27;:36;:::i;:::-;104515:114;;;104604:12;:10;:12::i;:::-;-1:-1:-1;;;;;104577:40:0;104595:7;-1:-1:-1;;;;;104577:40:0;104589:4;104577:40;;;;;;;;;;104444:192;;:::o;108780:120::-;108325:7;;-1:-1:-1;;;108325:7:0;;;;108317:40;;;;;-1:-1:-1;;;108317:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;108849:5:::1;108839:15:::0;;;::::1;::::0;;108870:22:::1;108879:12;:10;:12::i;:::-;108870:22;::::0;;-1:-1:-1;;;;;108870:22:0;;::::1;::::0;;;;;;;::::1;::::0;;::::1;108780:120::o:0;56536:711::-;-1:-1:-1;;;;;56679:16:0;;56671:56;;;;;-1:-1:-1;;;56671:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56746:26;:5;:24;:26::i;:::-;56738:60;;;;;-1:-1:-1;;;56738:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56811:29;56820:2;56824:5;56831:1;56834:5;56811:8;:29::i;:::-;56858:31;;56883:5;;-1:-1:-1;;;;;56858:31:0;;;56875:1;;56858:31;;56875:1;;56858:31;-1:-1:-1;;;;;56905:54:0;;56942:1;56920:12;:10;:12::i;:::-;-1:-1:-1;;;;;56905:54:0;;56950:5;56957:1;56905:54;;;;;;;;;;;;;;;;;;;;;;;;56974:15;:2;-1:-1:-1;;;;;56974:13:0;;:15::i;:::-;56970:270;;;57010:27;57034:2;57010:23;:27::i;:::-;57006:223;;;57058:54;57089:1;57093:2;57097:5;57104:1;57107:4;57058:22;:54::i;:::-;57006:223;;;57138:4;57134:95;;;57163:50;57193:1;57197:2;57201:5;57208:4;57163:21;:50::i;47873:284::-;48009:140;48037:4;48056:2;48073:5;48009:140;;;;;;;;;;;;48134:4;48009:13;:140::i;57426:1623::-;-1:-1:-1;;;;;57511:16:0;;57503:56;;;;;-1:-1:-1;;;57503:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57589:13;;57613:23;57589:13;57639:21;;;2:2:-1;;;;27:1;24;17:12;2:2;57639:21:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;57639:21:0;;57613:47;;57673:22;57706:25;57747:9;57742:914;57763:6;57758:1;:11;57742:914;;57791:13;57807:6;57814:1;57807:9;;;;;;;;;;;;;;57791:25;;57839:26;:5;:24;:26::i;:::-;57831:60;;;;;-1:-1:-1;;;57831:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;57918:1;57906:6;57913:1;57906:9;;;;;;;;;;;;;:13;;;;;57934:28;57943:2;57947:5;57954:1;57957:4;57934:8;:28::i;:::-;57982:31;;58007:5;;-1:-1:-1;;;;;57982:31:0;;;57999:1;;57982:31;;57999:1;;57982:31;58028:24;58055:32;:5;:30;:32::i;:::-;58028:59;-1:-1:-1;58106:19:0;58102:543;;58163:16;58146:33;;58218:1;58198:21;;58102:543;;;58284:14;58264:16;:34;58260:370;;58323:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;58323:29:0;;;;;;;;;:50;;;;;;58396:25;;;:9;:25;;;;;;:46;;;;;;;;-1:-1:-1;;58482:16:0;58260:370;;;58591:19;;;;;58260:370;-1:-1:-1;;57771:3:0;;57742:914;;;-1:-1:-1;58668:25:0;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;58668:29:0;;;;;;;;;;;:50;;;;;;58729:25;;;:9;:25;;;;;:46;;;;;;58786:16;;;:12;:16;;;;;:26;;;;;;58668:29;58844:12;:10;:12::i;:::-;-1:-1:-1;;;;;58830:59:0;;58874:6;58882;58830:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;58830:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;58830:59:0;;;;;;;;;;;;;;;;;;;58904:15;:2;-1:-1:-1;;;;;58904:13:0;;:15::i;:::-;:46;;;;;58923:27;58947:2;58923:23;:27::i;:::-;58900:142;;;58967:63;59003:1;59007:2;59011:6;59019;58967:63;;;;;;;;;;;;:27;:63::i;:::-;57426:1623;;;;;;:::o;41110:214::-;41181:7;41210:33;:12;:31;:33::i;:::-;41209:34;41201:74;;;;;-1:-1:-1;;;41201:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;41293:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;41293:23:0;;41110:214::o;59218:731::-;-1:-1:-1;;;;;59374:16:0;;59366:56;;;;;-1:-1:-1;;;59366:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;59433:14;59450:12;:10;:12::i;:::-;59433:29;;59477:20;:2;:18;:20::i;:::-;59473:289;;;59514:28;59528:2;59532;59536:5;59514:13;:28::i;:::-;59473:289;;;59564:23;:2;:21;:23::i;:::-;59560:202;;;59604:30;59613:2;59617;59621:5;59628;59604:8;:30::i;:::-;59654:28;;59679:2;;-1:-1:-1;;;;;59654:28:0;;;59671:1;;59654:28;;59671:1;;59654:28;59560:202;59779:49;;;;;;;;;;;;;;-1:-1:-1;;;;;59779:49:0;;;;59810:1;;59779:49;;;;;;;;;;;;;;59843:15;:2;-1:-1:-1;;;;;59843:13:0;;:15::i;:::-;59839:103;;;59875:55;59906:1;59910:2;59914;59918:5;59925:4;59875:22;:55::i;39663:230::-;39733:7;39777:14;;;:7;:14;;;;;;-1:-1:-1;;;;;39811:19:0;;39803:59;;;;;-1:-1:-1;;;39803:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;72143:1967;72313:10;;72352:13;;72342:23;;72334:66;;;;;-1:-1:-1;;;72334:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;72413:14;72430:12;:10;:12::i;:::-;72413:29;;72453:15;72471:27;72485:4;72491:6;72471:13;:27::i;:::-;72453:45;;72511:22;72544:25;72580:17;72613:9;72608:1131;72629:6;72624:1;:11;72608:1131;;72657:10;72670:3;72674:1;72670:6;;;;;;;;;;;;;;72657:19;;72695:20;:2;:18;:20::i;:::-;72691:1037;;;72736:46;72750:4;72756:2;72760:6;72767:1;72760:9;;;;;;;;;;;;;;72771:10;72736:13;:46::i;:::-;72691:1037;;;72808:23;:2;:21;:23::i;:::-;72804:924;;;72852:47;72861:4;72867:2;72871:6;72878:1;72871:9;;;;;;;;;;;;;;72882:10;72894:4;72852:8;:47::i;:::-;72923:30;;72950:2;;72946:1;;-1:-1:-1;;;;;72923:30:0;;;;;72946:1;;72923:30;72972:24;72999:29;:2;:27;:29::i;:::-;72972:56;-1:-1:-1;73051:19:0;73047:590;;73112:16;73095:33;;73171:1;73151:21;;73047:590;;;73245:14;73225:16;:34;73221:397;;73288:65;73313:4;73319:14;73335:17;73288:24;:65::i;:::-;73397:16;-1:-1:-1;73517:1:0;;73440:30;;;;;73397:16;73221:397;;;73575:19;;;;;73221:397;72804:924;;-1:-1:-1;72637:3:0;;72608:1131;;;-1:-1:-1;73755:19:0;;73751:282;;73791:65;73816:4;73822:14;73838:17;73791:24;:65::i;:::-;-1:-1:-1;;;;;73990:18:0;;;;;;:12;:18;;;;;:31;;73871:30;;;73990:31;;;;;;73751:282;74086:1;-1:-1:-1;;;;;74050:52:0;74072:4;-1:-1:-1;;;;;74050:52:0;74064:6;-1:-1:-1;;;;;74050:52:0;;74090:3;74095:6;74050:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;74050:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;74050:52:0;;;;;;;;;;;;;;;;;;;72143:1967;;;;;;;;;:::o;108521:118::-;108049:7;;-1:-1:-1;;;108049:7:0;;;;108048:8;108040:37;;;;;-1:-1:-1;;;108040:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;108581:7:::1;:14:::0;;;::::1;-1:-1:-1::0;;;108581:14:0::1;::::0;;108611:20:::1;108618:12;:10;:12::i;95321:149::-:0;95395:7;95438:22;95442:3;95454:5;95438:3;:22::i;94616:158::-;94696:4;94720:46;94730:3;-1:-1:-1;;;;;94750:14:0;;94720:9;:46::i;38478:306::-;38573:14;38590:12;:10;:12::i;:::-;38573:29;;38633:6;-1:-1:-1;;;;;38621:18:0;:8;-1:-1:-1;;;;;38621:18:0;;;38613:55;;;;;-1:-1:-1;;;38613:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;38679:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;38679:39:0;;;;;;;;;;38734:42;;;;;;;;;;;;;;;;;38478:306;;;:::o;35089:109::-;34849:8;35173:12;:17;;35089:109::o;48339:314::-;48503:142;48531:4;48550:2;48567:5;48587:4;48630;48503:13;:142::i;35354:134::-;-1:-1:-1;;;;;;35453:27:0;;35354:134::o;94860:117::-;94923:7;94950:19;94958:3;94950:7;:19::i;40661:378::-;40747:33;:12;:31;:33::i;:::-;40746:34;40738:74;;;;;-1:-1:-1;;;40738:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40866:1;40831:23;;;:9;:23;;;;;;-1:-1:-1;;;;;40831:23:0;:37;40823:80;;;;;-1:-1:-1;;;40823:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40940:12;:10;:12::i;:::-;40914:23;;;;:9;:23;;;;;:38;;-1:-1:-1;;40914:38:0;-1:-1:-1;;;;;40914:38:0;;;;;;;;;;41000:30;40914:23;41000:28;:30::i;:::-;40968:63;;40986:12;40968:63;;;;;;;;;;40661:378;:::o;38856:166::-;-1:-1:-1;;;;;38982:22:0;;;38958:4;38982:22;;;:10;:22;;;;;;;;:32;;;;;;;;;;;;;;;38856:166::o;51108:852::-;51293:14;51310:12;:10;:12::i;:::-;51293:29;-1:-1:-1;;;;;;51341:16:0;;51333:56;;;;;-1:-1:-1;;;51333:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51400:15;51418:27;51432:4;51438:6;51418:13;:27::i;:::-;51400:45;;51462:20;:2;:18;:20::i;:::-;51458:327;;;51499:50;51517:4;51523:2;51527;51531:5;51538:10;51499:17;:50::i;:::-;51458:327;;;51571:23;:2;:21;:23::i;:::-;51567:218;;;51611:52;51624:4;51630:2;51634;51638:5;51645:10;51657:5;51611:12;:52::i;:::-;51702:2;51698;-1:-1:-1;;;;;51683:22:0;51692:4;-1:-1:-1;;;;;51683:22:0;;;;;;;;;;;51567:218;51831:2;-1:-1:-1;;;;;51802:43:0;51825:4;-1:-1:-1;;;;;51802:43:0;51817:6;-1:-1:-1;;;;;51802:43:0;;51835:2;51839:5;51802:43;;;;;;;;;;;;;;;;;;;;;;;;51860:15;:2;-1:-1:-1;;;;;51860:13:0;;:15::i;:::-;51856:97;;;51892:49;51915:4;51921:2;51925;51929:5;51936:4;51892:22;:49::i;:::-;51108:852;;;;;;;:::o;74270:1426::-;74367:14;74384:12;:10;:12::i;:::-;74367:29;;74407:15;74425:27;74439:4;74445:6;74425:13;:27::i;:::-;74482:13;;74407:45;;-1:-1:-1;74506:23:0;74482:13;74532:21;;;2:2:-1;;;;27:1;24;17:12;2:2;74532:21:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;74532:21:0;;74506:47;;74566:22;74599:25;74640:9;74635:809;74656:6;74651:1;:11;74635:809;;74684:13;74700:6;74707:1;74700:9;;;;;;;;;;;;;;74684:25;;74736:1;74724:6;74731:1;74724:9;;;;;;;;;;;;;:13;;;;;74752:50;74761:4;74767:5;74774:6;74781:1;74774:9;;;;;;;;;;;;;;74785:10;74797:4;74752:8;:50::i;:::-;74822:33;;74849:5;;74845:1;;-1:-1:-1;;;;;74822:33:0;;;;;74845:1;;74822:33;74870:24;74897:32;:5;:30;:32::i;:::-;74870:59;-1:-1:-1;74948:19:0;74944:489;;75005:16;74988:33;;75060:1;75040:21;;74944:489;;;75126:14;75106:16;:34;75102:316;;75165:65;75190:4;75196:14;75212:17;75165:24;:65::i;:::-;75270:16;75253:33;;75329:1;75309:21;;75102:316;;;75379:19;;;;;75102:316;-1:-1:-1;;74664:3:0;;74635:809;;;-1:-1:-1;75460:19:0;;75456:160;;75496:65;75521:4;75527:14;75543:17;75496:24;:65::i;:::-;-1:-1:-1;;;;;75576:18:0;;;;;;:12;:18;;;;;:28;;;;;;;75456:160;75669:1;-1:-1:-1;;;;;75633:55:0;75655:4;-1:-1:-1;;;;;75633:55:0;75647:6;-1:-1:-1;;;;;75633:55:0;;75673:6;75681;75633:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;75633:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;75633:55:0;;;;;;;;;;;;;;;;;;;74270:1426;;;;;;;;:::o;48848:1711::-;-1:-1:-1;;;;;49003:16:0;;48995:56;;;;;-1:-1:-1;;;48995:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49062:14;49079:12;:10;:12::i;:::-;49062:29;;49102:15;49120:27;49134:4;49140:6;49120:13;:27::i;:::-;49177:13;;49102:45;;-1:-1:-1;49201:23:0;49177:13;49227:21;;;2:2:-1;;;;27:1;24;17:12;2:2;49227:21:0;;;;;;;;;;;;;;;;;;;;;;;29:2:-1;21:6;17:15;125:4;109:14;101:6;88:42;144:17;;-1:-1;49227:21:0;;49201:47;;49261:22;49294:25;49335:9;49330:809;49351:6;49346:1;:11;49330:809;;49379:13;49395:6;49402:1;49395:9;;;;;;;;;;;;;;49379:25;;49431:1;49419:6;49426:1;49419:9;;;;;;;;;;;;;:13;;;;;49447:50;49460:4;49466:2;49470:5;49477:1;49480:10;49492:4;49447:12;:50::i;:::-;49536:5;49532:2;-1:-1:-1;;;;;49517:25:0;49526:4;-1:-1:-1;;;;;49517:25:0;;;;;;;;;;;49557:24;49584:32;:5;:30;:32::i;:::-;49557:59;-1:-1:-1;49635:19:0;49631:497;;49692:16;49675:33;;49747:1;49727:21;;49631:497;;;49813:14;49793:16;:34;49789:324;;49852:73;49881:4;49887:2;49891:14;49907:17;49852:28;:73::i;:::-;49965:16;49948:33;;50024:1;50004:21;;49789:324;;;50074:19;;;;;49789:324;-1:-1:-1;;49359:3:0;;49330:809;;;-1:-1:-1;50155:19:0;;50151:184;;50191:73;50220:4;50226:2;50230:14;50246:17;50191:28;:73::i;:::-;50279:44;50306:4;50312:2;50316:6;50279:26;:44::i;:::-;50386:2;-1:-1:-1;;;;;50352:53:0;50380:4;-1:-1:-1;;;;;50352:53:0;50366:12;:10;:12::i;:::-;-1:-1:-1;;;;;50352:53:0;;50390:6;50398;50352:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;50352:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;50352:53:0;;;;;;;;;;;;;;;;;;;50420:15;:2;-1:-1:-1;;;;;50420:13:0;;:15::i;:::-;:46;;;;;50439:27;50463:2;50439:23;:27::i;:::-;50416:136;;;50483:57;50511:4;50517:2;50521:6;50529;50483:57;;;;;;;;;;;;:27;:57::i;:::-;48848:1711;;;;;;;;;:::o;89126:414::-;89189:4;89211:21;89221:3;89226:5;89211:9;:21::i;:::-;89206:327;;-1:-1:-1;27:10;;39:1;23:18;;;45:23;;89249:11:0;:23;;;;;;;;;;;;;89432:18;;89410:19;;;:12;;;:19;;;;;;:40;;;;89465:11;;89206:327;-1:-1:-1;89516:5:0;89509:12;;62359:449;62483:10;62475:44;;;;;-1:-1:-1;;;62475:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62530:14;62547:13;;;:9;:13;;;;;;62591:14;;;62624:18;;;62616:57;;;;;-1:-1:-1;;;62616:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;62684:13;;;;:9;:13;;;;;;;;:25;;;;62774:9;:13;;;;;-1:-1:-1;;;;;62774:17:0;;;;;;;;;-1:-1:-1;62774:17:0;;;:26;;;;;;;62359:449::o;62816:672::-;62958:5;62967:1;62958:10;62950:49;;;;;-1:-1:-1;;;62950:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63018:11;;;;:7;:11;;;;;;:16;63010:58;;;;;-1:-1:-1;;;63010:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63081:11;;;;:7;:11;;;;;-1:-1:-1;;;;;63095:11:0;;63081:25;;63124:7;63119:362;;63148:20;63171:29;:2;:27;:29::i;:::-;63369:23;;;;:9;:23;;;;;;;;63367:25;;;;;;;;;63409:9;:23;;;;;-1:-1:-1;;;;;63409:27:0;;;;;;;;;63407:29;;;;;;63453:12;:16;;;;;;63451:18;;;;;;;-1:-1:-1;62816:672:0;;;;:::o;875:422::-;1242:20;1281:8;;;875:422::o;43200:400::-;43514:23;-1:-1:-1;;;;;43423:48:0;;36331:10;43472:12;:10;:12::i;:::-;43486:4;43492:3;43497:6;43505:4;43423:87;;;;;;;;;;;;;-1:-1:-1;;;;;43423:87:0;-1:-1:-1;;;;;43423:87:0;;;;;;-1:-1:-1;;;;;43423:87:0;-1:-1:-1;;;;;43423:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43423:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43423:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;43423:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;43423:87:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;43423:87:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;43423:87:0;-1:-1:-1;;;;;;43423:114:0;;43401:191;;;;;-1:-1:-1;;;43401:191:0;;;;;;;;;;;;;;;;;;;;;;;;;;;85921:791;85984:13;86241:10;86237:53;;-1:-1:-1;86268:10:0;;;;;;;;;;;;;;;;;;;86237:53;86315:5;86300:12;86356:78;86363:9;;86356:78;;86389:8;;86420:2;86412:10;;;;86356:78;;;86444:19;86476:6;86466:17;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;86466:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;21:6:-1;;108:14;86466:17:0;87:42:-1;143:17;;-1:-1;86466:17:0;-1:-1:-1;86538:5:0;;-1:-1:-1;86444:39:0;-1:-1:-1;;;86510:10:0;;86554:119;86561:9;;86554:119;;86631:2;86624:4;:9;86618:2;:16;86605:31;;86587:6;86594:7;;;;;;;86587:15;;;;;;;;;;;:49;;;;;;;;;;-1:-1:-1;86659:2:0;86651:10;;;;86554:119;;;-1:-1:-1;86697:6:0;85921:791;-1:-1:-1;;;;85921:791:0:o;75811:487::-;75963:10;75955:44;;;;;-1:-1:-1;;;75955:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76018:10;76010:53;;;;;-1:-1:-1;;;76010:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76074:15;76092:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;76092:19:0;;;;;;;;;;76130:16;;;;76122:58;;;;;-1:-1:-1;;;76122:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76191:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;76191:19:0;;;;;;;;;;;76213:15;;;;76191:37;;;76268:13;;;:9;:13;;-1:-1:-1;76268:13:0;;;:22;;;;;;;;75811:487::o;76306:783::-;76484:5;76493:1;76484:10;76476:49;;;;;-1:-1:-1;;;76476:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76536:13;76552:11;;;:7;:11;;;;;;-1:-1:-1;;;;;76582:22:0;;;;;;;76574:59;;;;;-1:-1:-1;;;76574:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76649:10;76644:165;;-1:-1:-1;;;76685:34:0;;:39;;;;76684:78;;-1:-1:-1;76745:17:0;;;;:13;:17;;;;;;-1:-1:-1;;;;;76745:17:0;76729:12;:10;:12::i;:::-;-1:-1:-1;;;;;76729:33:0;;76684:78;76676:121;;;;;-1:-1:-1;;;76676:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;76819:11;;;;:7;:11;;;;;36448:66;76819:30;;76867:7;76862:220;;76891:64;76916:4;76922:29;:2;:27;:29::i;:::-;76953:1;76891:24;:64::i;:::-;-1:-1:-1;;;;;77052:18:0;;;;;;:12;:18;;;;;77050:20;;-1:-1:-1;;77050:20:0;;;76306:783;;;;;;:::o;53148:759::-;-1:-1:-1;;;;;53322:16:0;;53314:56;;;;;-1:-1:-1;;;53314:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53381:14;53398:12;:10;:12::i;:::-;53381:29;;53421:15;53439:27;53453:4;53459:6;53439:13;:27::i;:::-;53421:45;;53479:51;53492:4;53498:2;53502:5;53509:1;53512:10;53524:5;53479:12;:51::i;:::-;53567:5;53563:2;-1:-1:-1;;;;;53548:25:0;53557:4;-1:-1:-1;;;;;53548:25:0;;;;;;;;;;;53618:2;-1:-1:-1;;;;;53589:42:0;53612:4;-1:-1:-1;;;;;53589:42:0;53604:6;-1:-1:-1;;;;;53589:42:0;;53622:5;53629:1;53589:42;;;;;;;;;;;;;;;;;;;;;;;;53646:15;:2;-1:-1:-1;;;;;53646:13:0;;:15::i;:::-;53642:258;;;53682:27;53706:2;53682:23;:27::i;:::-;53678:211;;;53730:48;53753:4;53759:2;53763:5;53770:1;53773:4;53730:22;:48::i;:::-;53678:211;;;53804:4;53800:89;;;53829:44;53851:4;53857:2;53861:5;53868:4;53829:21;:44::i;54104:2153::-;-1:-1:-1;;;;;54308:16:0;;54300:56;;;;;-1:-1:-1;;;54300:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54384:10;;54423:13;;54413:23;;54405:66;;;;;-1:-1:-1;;;54405:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;54482:14;54499:12;:10;:12::i;:::-;54482:29;;54522:15;54540:27;54554:4;54560:6;54540:13;:27::i;:::-;54522:45;;54580:22;54613:25;54649:17;54682:9;54677:1147;54698:6;54693:1;:11;54677:1147;;54726:10;54739:3;54743:1;54739:6;;;;;;;;;;;;;;54726:19;;54764:20;:2;:18;:20::i;:::-;54760:1053;;;54805:54;54823:4;54829:2;54833;54837:6;54844:1;54837:9;;;;;;;;;;;;;;54848:10;54805:17;:54::i;:::-;54760:1053;;;54885:23;:2;:21;:23::i;:::-;54881:932;;;54929:55;54942:4;54948:2;54952;54956:6;54963:1;54956:9;;;;;;;;;;;;;;54967:10;54979:4;54929:12;:55::i;:::-;55027:2;55023;-1:-1:-1;;;;;55008:22:0;55017:4;-1:-1:-1;;;;;55008:22:0;;;;;;;;;;;55049:24;55076:29;:2;:27;:29::i;:::-;55049:56;-1:-1:-1;55128:19:0;55124:598;;55189:16;55172:33;;55248:1;55228:21;;55124:598;;;55322:14;55302:16;:34;55298:405;;55365:73;55394:4;55400:2;55404:14;55420:17;55365:28;:73::i;:::-;55482:16;-1:-1:-1;55602:1:0;;55525:30;;;;;55482:16;55298:405;;;55660:19;;;;;55298:405;54881:932;;-1:-1:-1;54706:3:0;;54677:1147;;;-1:-1:-1;55840:19:0;;55836:232;;55876:73;55905:4;55911:2;55915:14;55931:17;55876:28;:73::i;:::-;55964:30;;56009:47;56036:4;56042:2;55964:30;56009:26;:47::i;:::-;56119:2;-1:-1:-1;;;;;56085:50:0;56113:4;-1:-1:-1;;;;;56085:50:0;56099:12;:10;:12::i;:::-;-1:-1:-1;;;;;56085:50:0;;56123:3;56128:6;56085:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56085:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;56085:50:0;;;;;;;;;;;;;;;;;;;56150:15;:2;-1:-1:-1;;;;;56150:13:0;;:15::i;:::-;56146:104;;;56182:56;56210:4;56216:2;56220:3;56225:6;56233:4;56182:27;:56::i;:::-;54104:2153;;;;;;;;;;;:::o;94381:149::-;94454:4;94478:44;94486:3;-1:-1:-1;;;;;94506:14:0;;94478:7;:44::i;66023:878::-;66190:82;;;44150:39;66190:82;;;;;;;;;;26:21:-1;;;22:32;;;6:49;;66190:82:0;;;;;;;25:18:-1;;;61:17;;66190:82:0;182:15:-1;44055:25:0;179:29:-1;160:49;;66379:21:0;;66428:11;;66098:4;66512:19;;;66098:4;;;;;66190:82;;25:18:-1;66428:11:0;;66379:21;25:18:-1;66574:9:0;66567:5;66556:63;66545:74;;66661:6;66655:13;66645:23;;;;;66854:3;66842:9;:15;66835:23;;;;66876:7;:17;;;;;66887:6;66876:17;66869:24;66023:878;-1:-1:-1;;;;;66023:878:0:o;42379:325::-;42647:17;-1:-1:-1;;;;;42563:43:0;;36166:10;42607:12;:10;:12::i;:::-;42621:4;42627:2;42631:5;42638:4;42563:80;;;;;;;;;;;;;-1:-1:-1;;;;;42563:80:0;-1:-1:-1;;;;;42563:80:0;;;;;;-1:-1:-1;;;;;42563:80:0;-1:-1:-1;;;;;42563:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;42563:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;67330:291:0;44417:33;-1:-1:-1;;;;;67492:36:0;;;67529:12;:10;:12::i;:::-;67543:4;67549:5;67556:4;67492:69;;;;;;;;;;;;;-1:-1:-1;;;;;67492:69:0;-1:-1:-1;;;;;67492:69:0;;;;;;-1:-1:-1;;;;;67492:69:0;-1:-1:-1;;;;;67492:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;90:11;;;84:18;71:11;;;64:39;52:2;45:10;8:100;;;12:14;67492:69:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5:9:-1;2:2;;;27:1;24;17:12;2:2;67492:69:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;67492:69:0;;;;;;;15:2:-1;10:3;7:11;4:2;;;31:1;28;21:12;4:2;-1:-1;67492:69:0;-1:-1:-1;;;;;;67492:89:0;;67484:129;;;;;-1:-1:-1;;;67484:129:0;;;;;;;;;;;;;;;;;;;;;;;;;;;77097:313;77319:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;77319:29:0;;;;;;;;;;;:39;;;;;;;77369:23;;;:9;:23;;;;;;:33;;;;;;;;77097:313::o;92014:204::-;92109:18;;92081:7;;92109:26;-1:-1:-1;92101:73:0;;;;-1:-1:-1;;;92101:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92192:3;:11;;92204:5;92192:18;;;;;;;;;;;;;;;;92185:25;;92014:204;;;;:::o;91346:129::-;91419:4;91443:19;;;:12;;;;;:19;;;;;;:24;;;91346:129::o;91561:109::-;91644:18;;91561:109::o;63496:591::-;63673:10;63665:53;;;;;-1:-1:-1;;;63665:53:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63737:10;63729:44;;;;;-1:-1:-1;;;63729:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63784:15;63802:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;63802:19:0;;;;;;;;;;63840:16;;;;63832:58;;;;;-1:-1:-1;;;63832:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;63913:2;-1:-1:-1;;;;;63905:10:0;:4;-1:-1:-1;;;;;63905:10:0;;63901:179;;63932:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;63932:19:0;;;;;;;;;;;63954:15;;;;63932:37;;;64042:17;;;;;;;;;:26;;;;;;;-1:-1:-1;63496:591:0:o;64095:748::-;64298:5;64307:1;64298:10;64290:49;;;;;-1:-1:-1;;;64290:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64350:13;64366:11;;;:7;:11;;;;;;-1:-1:-1;;;;;64396:22:0;;;;;;;64388:59;;;;;-1:-1:-1;;;64388:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64463:10;64458:165;;-1:-1:-1;;;64499:34:0;;:39;;;;64498:78;;-1:-1:-1;64559:17:0;;;;:13;:17;;;;;;-1:-1:-1;;;;;64559:17:0;64543:12;:10;:12::i;:::-;-1:-1:-1;;;;;64543:33:0;;64498:78;64490:121;;;;;-1:-1:-1;;;64490:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;64633:11;;;;:7;:11;;;;;-1:-1:-1;;;;;64647:11:0;;64633:25;;64674:7;64669:167;;64698:39;64725:4;64731:2;64735:1;64698:26;:39::i;:::-;64752:72;64781:4;64787:2;64791:29;:2;:27;:29::i;:::-;64822:1;65251:446;65436:2;-1:-1:-1;;;;;65428:10:0;:4;-1:-1:-1;;;;;65428:10:0;;65424:266;;65529:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;65529:29:0;;;;;;;;;;;:39;;;;;;;65641:27;;;;;;;:37;;;;;;;65251:446::o;64851:392::-;65003:2;-1:-1:-1;;;;;64995:10:0;:4;-1:-1:-1;;;;;64995:10:0;;64991:245;;-1:-1:-1;;;;;65096:18:0;;;;;;;:12;:18;;;;;;:28;;;;;;;65198:16;;;;;;:26;;;;;;64851:392;;;:::o;89716:1544::-;89782:4;89921:19;;;:12;;;:19;;;;;;89957:15;;89953:1300;;90392:18;;-1:-1:-1;;90343:14:0;;;;90392:22;;;;90319:21;;90392:3;;:22;;90679;;;;;;;;;;;;;;90659:42;;90825:9;90796:3;:11;;90808:13;90796:26;;;;;;;;;;;;;;;;;;;:38;;;;90902:23;;;90944:1;90902:12;;;:23;;;;;;90928:17;;;90902:43;;91054:17;;90902:3;;91054:17;;;;;;;;;;;;;;;;;;;;;;91149:3;:12;;:19;91162:5;91149:19;;;;;;;;;;;91142:26;;;91192:4;91185:11;;;;;;;;89953:1300;91236:5;91229:12;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;

Swarm Source

ipfs://9e841bdddad73c1f10b8bdab736977aeeed7a9ba64193de66753a5260fa39e62

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.