Token
Overview ERC-1155
Total Supply:
0 N/A
Holders:
604 addresses
Contract:
Balance
0 N/A
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SquireRings
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Arbiscan.io on 2022-05-26 */ // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC1155/IERC1155Receiver.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes calldata data ) external; /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function safeBatchTransferFrom( address from, address to, uint256[] calldata ids, uint256[] calldata amounts, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC1155/ERC1155.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) public view virtual override returns (string memory) { return _uri; } /** * @dev See {IERC1155-balanceOf}. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) public view virtual override returns (uint256) { require(account != address(0), "ERC1155: balance query for the zero address"); return _balances[id][account]; } /** * @dev See {IERC1155-balanceOfBatch}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] memory accounts, uint256[] memory ids) public view virtual override returns (uint256[] memory) { require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch"); uint256[] memory batchBalances = new uint256[](accounts.length); for (uint256 i = 0; i < accounts.length; ++i) { batchBalances[i] = balanceOf(accounts[i], ids[i]); } return batchBalances; } /** * @dev See {IERC1155-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC1155-isApprovedForAll}. */ function isApprovedForAll(address account, address operator) public view virtual override returns (bool) { return _operatorApprovals[account][operator]; } /** * @dev See {IERC1155-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not owner nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: transfer caller is not owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * Requirements: * * - `ids` and `amounts` must have the same length. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _mintBatch( address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); for (uint256 i = 0; i < ids.length; i++) { _balances[ids[i]][to] += amounts[i]; } emit TransferBatch(operator, address(0), to, ids, amounts); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data); } /** * @dev Destroys `amount` tokens of token type `id` from `from` * * Requirements: * * - `from` cannot be the zero address. * - `from` must have at least `amount` tokens of token type `id`. */ function _burn( address from, uint256 id, uint256 amount ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } emit TransferSingle(operator, from, address(0), id, amount); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}. * * Requirements: * * - `ids` and `amounts` must have the same length. */ function _burnBatch( address from, uint256[] memory ids, uint256[] memory amounts ) internal virtual { require(from != address(0), "ERC1155: burn from the zero address"); require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, address(0), ids, amounts, ""); for (uint256 i = 0; i < ids.length; i++) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: burn amount exceeds balance"); unchecked { _balances[id][from] = fromBalance - amount; } } emit TransferBatch(operator, from, address(0), ids, amounts); _afterTokenTransfer(operator, from, address(0), ids, amounts, ""); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC1155: setting approval status for self"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Hook that is called before any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} /** * @dev Hook that is called after any token transfer. This includes minting * and burning, as well as batched variants. * * The same hook is called on both single and batched variants. For single * transfers, the length of the `id` and `amount` arrays will be 1. * * Calling conditions (for each `id` and `amount` pair): * * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens * of token type `id` will be transferred to `to`. * - When `from` is zero, `amount` tokens of token type `id` will be minted * for `to`. * - when `to` is zero, `amount` of ``from``'s tokens of token type `id` * will be burned. * - `from` and `to` are never both zero. * - `ids` and `amounts` have the same, non-zero length. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual {} function _doSafeTransferAcceptanceCheck( address operator, address from, address to, uint256 id, uint256 amount, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155Receiver.onERC1155Received.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _doSafeBatchTransferAcceptanceCheck( address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) private { if (to.isContract()) { try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155Receiver.onERC1155BatchReceived.selector) { revert("ERC1155: ERC1155Receiver rejected tokens"); } } catch Error(string memory reason) { revert(reason); } catch { revert("ERC1155: transfer to non ERC1155Receiver implementer"); } } } function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) { uint256[] memory array = new uint256[](1); array[0] = element; return array; } } // File: Squires/Rings.sol pragma solidity ^0.8.11; contract SquireRings is ERC1155, Ownable { enum ItemType { RING, POTION, TRINKET } uint256 thisType = uint(ItemType.RING); //mappings mapping(address => bool) private allowedContracts; string public _baseURI = "ipfs://QmNaBt67t24B5Zqdpv4g3WEk4K2AGAj5su1K3NjnSahx53/"; string public _contractURI; constructor() ERC1155(_baseURI) { } function mint(address to, uint typeChoice) external { require(allowedContracts[msg.sender]); _mint(to, typeChoice, 1, ""); } function burn(address account, uint256 id, uint256 qty) external { require(allowedContracts[msg.sender]); require(balanceOf(account, id) >= qty, "balance too low"); _burn(account, id, qty); } function setBaseURI(string memory newuri) public onlyOwner { _baseURI = newuri; } function setContractURI(string memory newuri) public onlyOwner { _contractURI = newuri; } function uri(uint256 tokenId) public view override returns (string memory) { return string(abi.encodePacked(_baseURI, uint2str(tokenId))); } function contractURI() public view returns (string memory) { return _contractURI; } function uint2str(uint256 _i) internal pure returns (string memory _uintAsString) { if (_i == 0) {return "0";} uint256 j = _i; uint256 len; while (j != 0) {len++; j /= 10;} bytes memory bstr = new bytes(len); uint256 k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } function setAllowedContracts(address[] calldata contracts) external onlyOwner { for (uint256 i; i < contracts.length; i++) { allowedContracts[contracts[i]] = true; } } function checkAllowedContracts(address account) public view returns (bool) { return allowedContracts[account]; } //withdraw any funds function withdrawToOwner() external onlyOwner { payable(msg.sender).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"_baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"checkAllowedContracts","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"typeChoice","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"contracts","type":"address[]"}],"name":"setAllowedContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawToOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
600060045560e060405260366080818152906200229460a03980516200002e916006916020909101906200015e565b503480156200003c57600080fd5b50600680546200004c9062000204565b80601f01602080910402602001604051908101604052809291908181526020018280546200007a9062000204565b8015620000cb5780601f106200009f57610100808354040283529160200191620000cb565b820191906000526020600020905b815481529060010190602001808311620000ad57829003601f168201915b5050505050620000e181620000f360201b60201c565b50620000ed336200010c565b62000240565b8051620001089060029060208401906200015e565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200016c9062000204565b90600052602060002090601f016020900481019282620001905760008555620001db565b82601f10620001ab57805160ff1916838001178555620001db565b82800160010185558215620001db579182015b82811115620001db578251825591602001919060010190620001be565b50620001e9929150620001ed565b5090565b5b80821115620001e95760008155600101620001ee565b600181811c908216806200021957607f821691505b6020821081036200023a57634e487b7160e01b600052602260045260246000fd5b50919050565b61204480620002506000396000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c8063743976a0116100b8578063c0e727401161007c578063c0e7274014610297578063e8a3d4851461029f578063e985e9c5146102a7578063f242432a146102e3578063f2fde38b146102f6578063f5298aca1461030957600080fd5b8063743976a01461023b578063843db83d146102435780638da5cb5b14610256578063938e3d7b14610271578063a22cb4651461028457600080fd5b806340c10f19116100ff57806340c10f19146101c15780634e1273f4146101d457806355f804b3146101f4578063695ef95514610207578063715018a61461023357600080fd5b8062fdd58e1461013b57806301ffc9a7146101615780630e89341c146101845780632eb2c2d6146101a45780633cb40e16146101b9575b600080fd5b61014e6101493660046115b4565b61031c565b6040519081526020015b60405180910390f35b61017461016f3660046115f4565b6103b3565b6040519015158152602001610158565b610197610192366004611618565b610405565b604051610158919061168d565b6101b76101b23660046117f6565b610439565b005b6101b76104d0565b6101b76101cf3660046115b4565b610529565b6101e76101e23660046118a0565b610565565b60405161015891906119a6565b6101b76102023660046119b9565b61068f565b610174610215366004611a0a565b6001600160a01b031660009081526005602052604090205460ff1690565b6101b76106cc565b610197610702565b6101b7610251366004611a25565b610790565b6003546040516001600160a01b039091168152602001610158565b6101b761027f3660046119b9565b610831565b6101b7610292366004611a9a565b61086e565b610197610879565b610197610886565b6101746102b5366004611ad6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101b76102f1366004611b09565b610918565b6101b7610304366004611a0a565b61099f565b6101b7610317366004611b6e565b610a37565b60006001600160a01b03831661038d5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103e457506001600160e01b031982166303a24d0760e21b145b806103ff57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600661041283610aa9565b604051602001610423929190611bf7565b6040516020818303038152906040529050919050565b6001600160a01b038516331480610455575061045585336102b5565b6104bc5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610384565b6104c98585858585610bd5565b5050505050565b6003546001600160a01b031633146104fa5760405162461bcd60e51b815260040161038490611c9d565b60405133904780156108fc02916000818181858888f19350505050158015610526573d6000803e3d6000fd5b50565b3360009081526005602052604090205460ff1661054557600080fd5b6105618282600160405180602001604052806000815250610db2565b5050565b606081518351146105ca5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610384565b6000835167ffffffffffffffff8111156105e6576105e66116a0565b60405190808252806020026020018201604052801561060f578160200160208202803683370190505b50905060005b84518110156106875761065a85828151811061063357610633611cd2565b602002602001015185838151811061064d5761064d611cd2565b602002602001015161031c565b82828151811061066c5761066c611cd2565b602090810291909101015261068081611cfe565b9050610615565b509392505050565b6003546001600160a01b031633146106b95760405162461bcd60e51b815260040161038490611c9d565b80516105619060069060208401906114ff565b6003546001600160a01b031633146106f65760405162461bcd60e51b815260040161038490611c9d565b6107006000610ec6565b565b6006805461070f90611ba1565b80601f016020809104026020016040519081016040528092919081815260200182805461073b90611ba1565b80156107885780601f1061075d57610100808354040283529160200191610788565b820191906000526020600020905b81548152906001019060200180831161076b57829003601f168201915b505050505081565b6003546001600160a01b031633146107ba5760405162461bcd60e51b815260040161038490611c9d565b60005b8181101561082c576001600560008585858181106107dd576107dd611cd2565b90506020020160208101906107f29190611a0a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061082481611cfe565b9150506107bd565b505050565b6003546001600160a01b0316331461085b5760405162461bcd60e51b815260040161038490611c9d565b80516105619060079060208401906114ff565b610561338383610f18565b6007805461070f90611ba1565b60606007805461089590611ba1565b80601f01602080910402602001604051908101604052809291908181526020018280546108c190611ba1565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b5050505050905090565b6001600160a01b038516331480610934575061093485336102b5565b6109925760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610384565b6104c98585858585610ff8565b6003546001600160a01b031633146109c95760405162461bcd60e51b815260040161038490611c9d565b6001600160a01b038116610a2e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610384565b61052681610ec6565b3360009081526005602052604090205460ff16610a5357600080fd5b80610a5e848461031c565b1015610a9e5760405162461bcd60e51b815260206004820152600f60248201526e62616c616e636520746f6f206c6f7760881b6044820152606401610384565b61082c838383611122565b606081600003610ad05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610afa5780610ae481611cfe565b9150610af39050600a83611d17565b9150610ad4565b60008167ffffffffffffffff811115610b1557610b156116a0565b6040519080825280601f01601f191660200182016040528015610b3f576020820181803683370190505b509050815b8515610bcc57610b55600182611d39565b90506000610b64600a88611d17565b610b6f90600a611d50565b610b799088611d39565b610b84906030611d6f565b905060008160f81b905080848481518110610ba157610ba1611cd2565b60200101906001600160f81b031916908160001a905350610bc3600a89611d17565b97505050610b44565b50949350505050565b8151835114610c375760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610384565b6001600160a01b038416610c5d5760405162461bcd60e51b815260040161038490611d94565b3360005b8451811015610d44576000858281518110610c7e57610c7e611cd2565b602002602001015190506000858381518110610c9c57610c9c611cd2565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610cec5760405162461bcd60e51b815260040161038490611dd9565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610d29908490611e23565b9250508190555050505080610d3d90611cfe565b9050610c61565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610d94929190611e3b565b60405180910390a4610daa81878787878761129e565b505050505050565b6001600160a01b038416610e125760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610384565b336000610e1e856113f9565b90506000610e2b856113f9565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610e5d908490611e23565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610ebd83600089898989611444565b50505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610f8b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610384565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661101e5760405162461bcd60e51b815260040161038490611d94565b33600061102a856113f9565b90506000611037856113f9565b90506000868152602081815260408083206001600160a01b038c1684529091529020548581101561107a5760405162461bcd60e51b815260040161038490611dd9565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906110b7908490611e23565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611117848a8a8a8a8a611444565b505050505050505050565b6001600160a01b0383166111845760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610384565b336000611190846113f9565b9050600061119d846113f9565b60408051602080820183526000918290528882528181528282206001600160a01b038b16835290522054909150848110156112265760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610384565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052610ebd565b6001600160a01b0384163b15610daa5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906112e29089908990889088908890600401611e60565b6020604051808303816000875af192505050801561131d575060408051601f3d908101601f1916820190925261131a91810190611ebe565b60015b6113c957611329611edb565b806308c379a003611362575061133d611ef7565b806113485750611364565b8060405162461bcd60e51b8152600401610384919061168d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610384565b6001600160e01b0319811663bc197c8160e01b14610ebd5760405162461bcd60e51b815260040161038490611f81565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061143357611433611cd2565b602090810291909101015292915050565b6001600160a01b0384163b15610daa5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906114889089908990889088908890600401611fc9565b6020604051808303816000875af19250505080156114c3575060408051601f3d908101601f191682019092526114c091810190611ebe565b60015b6114cf57611329611edb565b6001600160e01b0319811663f23a6e6160e01b14610ebd5760405162461bcd60e51b815260040161038490611f81565b82805461150b90611ba1565b90600052602060002090601f01602090048101928261152d5760008555611573565b82601f1061154657805160ff1916838001178555611573565b82800160010185558215611573579182015b82811115611573578251825591602001919060010190611558565b5061157f929150611583565b5090565b5b8082111561157f5760008155600101611584565b80356001600160a01b03811681146115af57600080fd5b919050565b600080604083850312156115c757600080fd5b6115d083611598565b946020939093013593505050565b6001600160e01b03198116811461052657600080fd5b60006020828403121561160657600080fd5b8135611611816115de565b9392505050565b60006020828403121561162a57600080fd5b5035919050565b60005b8381101561164c578181015183820152602001611634565b8381111561165b576000848401525b50505050565b60008151808452611679816020860160208601611631565b601f01601f19169290920160200192915050565b6020815260006116116020830184611661565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156116dc576116dc6116a0565b6040525050565b600067ffffffffffffffff8211156116fd576116fd6116a0565b5060051b60200190565b600082601f83011261171857600080fd5b81356020611725826116e3565b60405161173282826116b6565b83815260059390931b850182019282810191508684111561175257600080fd5b8286015b8481101561176d5780358352918301918301611756565b509695505050505050565b600067ffffffffffffffff831115611792576117926116a0565b6040516117a9601f8501601f1916602001826116b6565b8091508381528484840111156117be57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126117e757600080fd5b61161183833560208501611778565b600080600080600060a0868803121561180e57600080fd5b61181786611598565b945061182560208701611598565b9350604086013567ffffffffffffffff8082111561184257600080fd5b61184e89838a01611707565b9450606088013591508082111561186457600080fd5b61187089838a01611707565b9350608088013591508082111561188657600080fd5b50611893888289016117d6565b9150509295509295909350565b600080604083850312156118b357600080fd5b823567ffffffffffffffff808211156118cb57600080fd5b818501915085601f8301126118df57600080fd5b813560206118ec826116e3565b6040516118f982826116b6565b83815260059390931b850182019282810191508984111561191957600080fd5b948201945b8386101561193e5761192f86611598565b8252948201949082019061191e565b9650508601359250508082111561195457600080fd5b5061196185828601611707565b9150509250929050565b600081518084526020808501945080840160005b8381101561199b5781518752958201959082019060010161197f565b509495945050505050565b602081526000611611602083018461196b565b6000602082840312156119cb57600080fd5b813567ffffffffffffffff8111156119e257600080fd5b8201601f810184136119f357600080fd5b611a0284823560208401611778565b949350505050565b600060208284031215611a1c57600080fd5b61161182611598565b60008060208385031215611a3857600080fd5b823567ffffffffffffffff80821115611a5057600080fd5b818501915085601f830112611a6457600080fd5b813581811115611a7357600080fd5b8660208260051b8501011115611a8857600080fd5b60209290920196919550909350505050565b60008060408385031215611aad57600080fd5b611ab683611598565b915060208301358015158114611acb57600080fd5b809150509250929050565b60008060408385031215611ae957600080fd5b611af283611598565b9150611b0060208401611598565b90509250929050565b600080600080600060a08688031215611b2157600080fd5b611b2a86611598565b9450611b3860208701611598565b93506040860135925060608601359150608086013567ffffffffffffffff811115611b6257600080fd5b611893888289016117d6565b600080600060608486031215611b8357600080fd5b611b8c84611598565b95602085013595506040909401359392505050565b600181811c90821680611bb557607f821691505b602082108103611bd557634e487b7160e01b600052602260045260246000fd5b50919050565b60008151611bed818560208601611631565b9290920192915050565b600080845481600182811c915080831680611c1357607f831692505b60208084108203611c3257634e487b7160e01b86526022600452602486fd5b818015611c465760018114611c5757611c84565b60ff19861689528489019650611c84565b60008b81526020902060005b86811015611c7c5781548b820152908501908301611c63565b505084890196505b505050505050611c948185611bdb565b95945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611d1057611d10611ce8565b5060010190565b600082611d3457634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611d4b57611d4b611ce8565b500390565b6000816000190483118215151615611d6a57611d6a611ce8565b500290565b600060ff821660ff84168060ff03821115611d8c57611d8c611ce8565b019392505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115611e3657611e36611ce8565b500190565b604081526000611e4e604083018561196b565b8281036020840152611c94818561196b565b6001600160a01b0386811682528516602082015260a060408201819052600090611e8c9083018661196b565b8281036060840152611e9e818661196b565b90508281036080840152611eb28185611661565b98975050505050505050565b600060208284031215611ed057600080fd5b8151611611816115de565b600060033d1115611ef45760046000803e5060005160e01c5b90565b600060443d1015611f055790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611f3557505050505090565b8285019150815181811115611f4d5750505050505090565b843d8701016020828501011115611f675750505050505090565b611f76602082860101876116b6565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061200390830184611661565b97965050505050505056fea2646970667358221220f39fbf7ec1ec917d08be30d67529f07fe08f3e693238095df9b180dce07f469564736f6c634300080e0033697066733a2f2f516d4e614274363774323442355a7164707634673357456b344b324147416a357375314b334e6a6e5361687835332f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101365760003560e01c8063743976a0116100b8578063c0e727401161007c578063c0e7274014610297578063e8a3d4851461029f578063e985e9c5146102a7578063f242432a146102e3578063f2fde38b146102f6578063f5298aca1461030957600080fd5b8063743976a01461023b578063843db83d146102435780638da5cb5b14610256578063938e3d7b14610271578063a22cb4651461028457600080fd5b806340c10f19116100ff57806340c10f19146101c15780634e1273f4146101d457806355f804b3146101f4578063695ef95514610207578063715018a61461023357600080fd5b8062fdd58e1461013b57806301ffc9a7146101615780630e89341c146101845780632eb2c2d6146101a45780633cb40e16146101b9575b600080fd5b61014e6101493660046115b4565b61031c565b6040519081526020015b60405180910390f35b61017461016f3660046115f4565b6103b3565b6040519015158152602001610158565b610197610192366004611618565b610405565b604051610158919061168d565b6101b76101b23660046117f6565b610439565b005b6101b76104d0565b6101b76101cf3660046115b4565b610529565b6101e76101e23660046118a0565b610565565b60405161015891906119a6565b6101b76102023660046119b9565b61068f565b610174610215366004611a0a565b6001600160a01b031660009081526005602052604090205460ff1690565b6101b76106cc565b610197610702565b6101b7610251366004611a25565b610790565b6003546040516001600160a01b039091168152602001610158565b6101b761027f3660046119b9565b610831565b6101b7610292366004611a9a565b61086e565b610197610879565b610197610886565b6101746102b5366004611ad6565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6101b76102f1366004611b09565b610918565b6101b7610304366004611a0a565b61099f565b6101b7610317366004611b6e565b610a37565b60006001600160a01b03831661038d5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b506000908152602081815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b14806103e457506001600160e01b031982166303a24d0760e21b145b806103ff57506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060600661041283610aa9565b604051602001610423929190611bf7565b6040516020818303038152906040529050919050565b6001600160a01b038516331480610455575061045585336102b5565b6104bc5760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610384565b6104c98585858585610bd5565b5050505050565b6003546001600160a01b031633146104fa5760405162461bcd60e51b815260040161038490611c9d565b60405133904780156108fc02916000818181858888f19350505050158015610526573d6000803e3d6000fd5b50565b3360009081526005602052604090205460ff1661054557600080fd5b6105618282600160405180602001604052806000815250610db2565b5050565b606081518351146105ca5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610384565b6000835167ffffffffffffffff8111156105e6576105e66116a0565b60405190808252806020026020018201604052801561060f578160200160208202803683370190505b50905060005b84518110156106875761065a85828151811061063357610633611cd2565b602002602001015185838151811061064d5761064d611cd2565b602002602001015161031c565b82828151811061066c5761066c611cd2565b602090810291909101015261068081611cfe565b9050610615565b509392505050565b6003546001600160a01b031633146106b95760405162461bcd60e51b815260040161038490611c9d565b80516105619060069060208401906114ff565b6003546001600160a01b031633146106f65760405162461bcd60e51b815260040161038490611c9d565b6107006000610ec6565b565b6006805461070f90611ba1565b80601f016020809104026020016040519081016040528092919081815260200182805461073b90611ba1565b80156107885780601f1061075d57610100808354040283529160200191610788565b820191906000526020600020905b81548152906001019060200180831161076b57829003601f168201915b505050505081565b6003546001600160a01b031633146107ba5760405162461bcd60e51b815260040161038490611c9d565b60005b8181101561082c576001600560008585858181106107dd576107dd611cd2565b90506020020160208101906107f29190611a0a565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790558061082481611cfe565b9150506107bd565b505050565b6003546001600160a01b0316331461085b5760405162461bcd60e51b815260040161038490611c9d565b80516105619060079060208401906114ff565b610561338383610f18565b6007805461070f90611ba1565b60606007805461089590611ba1565b80601f01602080910402602001604051908101604052809291908181526020018280546108c190611ba1565b801561090e5780601f106108e35761010080835404028352916020019161090e565b820191906000526020600020905b8154815290600101906020018083116108f157829003601f168201915b5050505050905090565b6001600160a01b038516331480610934575061093485336102b5565b6109925760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260448201526808185c1c1c9bdd995960ba1b6064820152608401610384565b6104c98585858585610ff8565b6003546001600160a01b031633146109c95760405162461bcd60e51b815260040161038490611c9d565b6001600160a01b038116610a2e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610384565b61052681610ec6565b3360009081526005602052604090205460ff16610a5357600080fd5b80610a5e848461031c565b1015610a9e5760405162461bcd60e51b815260206004820152600f60248201526e62616c616e636520746f6f206c6f7760881b6044820152606401610384565b61082c838383611122565b606081600003610ad05750506040805180820190915260018152600360fc1b602082015290565b8160005b8115610afa5780610ae481611cfe565b9150610af39050600a83611d17565b9150610ad4565b60008167ffffffffffffffff811115610b1557610b156116a0565b6040519080825280601f01601f191660200182016040528015610b3f576020820181803683370190505b509050815b8515610bcc57610b55600182611d39565b90506000610b64600a88611d17565b610b6f90600a611d50565b610b799088611d39565b610b84906030611d6f565b905060008160f81b905080848481518110610ba157610ba1611cd2565b60200101906001600160f81b031916908160001a905350610bc3600a89611d17565b97505050610b44565b50949350505050565b8151835114610c375760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610384565b6001600160a01b038416610c5d5760405162461bcd60e51b815260040161038490611d94565b3360005b8451811015610d44576000858281518110610c7e57610c7e611cd2565b602002602001015190506000858381518110610c9c57610c9c611cd2565b602090810291909101810151600084815280835260408082206001600160a01b038e168352909352919091205490915081811015610cec5760405162461bcd60e51b815260040161038490611dd9565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290610d29908490611e23565b9250508190555050505080610d3d90611cfe565b9050610c61565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051610d94929190611e3b565b60405180910390a4610daa81878787878761129e565b505050505050565b6001600160a01b038416610e125760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610384565b336000610e1e856113f9565b90506000610e2b856113f9565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610e5d908490611e23565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610ebd83600089898989611444565b50505050505050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031603610f8b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610384565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661101e5760405162461bcd60e51b815260040161038490611d94565b33600061102a856113f9565b90506000611037856113f9565b90506000868152602081815260408083206001600160a01b038c1684529091529020548581101561107a5760405162461bcd60e51b815260040161038490611dd9565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906110b7908490611e23565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611117848a8a8a8a8a611444565b505050505050505050565b6001600160a01b0383166111845760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b6064820152608401610384565b336000611190846113f9565b9050600061119d846113f9565b60408051602080820183526000918290528882528181528282206001600160a01b038b16835290522054909150848110156112265760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b6064820152608401610384565b6000868152602081815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052610ebd565b6001600160a01b0384163b15610daa5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906112e29089908990889088908890600401611e60565b6020604051808303816000875af192505050801561131d575060408051601f3d908101601f1916820190925261131a91810190611ebe565b60015b6113c957611329611edb565b806308c379a003611362575061133d611ef7565b806113485750611364565b8060405162461bcd60e51b8152600401610384919061168d565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610384565b6001600160e01b0319811663bc197c8160e01b14610ebd5760405162461bcd60e51b815260040161038490611f81565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061143357611433611cd2565b602090810291909101015292915050565b6001600160a01b0384163b15610daa5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906114889089908990889088908890600401611fc9565b6020604051808303816000875af19250505080156114c3575060408051601f3d908101601f191682019092526114c091810190611ebe565b60015b6114cf57611329611edb565b6001600160e01b0319811663f23a6e6160e01b14610ebd5760405162461bcd60e51b815260040161038490611f81565b82805461150b90611ba1565b90600052602060002090601f01602090048101928261152d5760008555611573565b82601f1061154657805160ff1916838001178555611573565b82800160010185558215611573579182015b82811115611573578251825591602001919060010190611558565b5061157f929150611583565b5090565b5b8082111561157f5760008155600101611584565b80356001600160a01b03811681146115af57600080fd5b919050565b600080604083850312156115c757600080fd5b6115d083611598565b946020939093013593505050565b6001600160e01b03198116811461052657600080fd5b60006020828403121561160657600080fd5b8135611611816115de565b9392505050565b60006020828403121561162a57600080fd5b5035919050565b60005b8381101561164c578181015183820152602001611634565b8381111561165b576000848401525b50505050565b60008151808452611679816020860160208601611631565b601f01601f19169290920160200192915050565b6020815260006116116020830184611661565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff811182821017156116dc576116dc6116a0565b6040525050565b600067ffffffffffffffff8211156116fd576116fd6116a0565b5060051b60200190565b600082601f83011261171857600080fd5b81356020611725826116e3565b60405161173282826116b6565b83815260059390931b850182019282810191508684111561175257600080fd5b8286015b8481101561176d5780358352918301918301611756565b509695505050505050565b600067ffffffffffffffff831115611792576117926116a0565b6040516117a9601f8501601f1916602001826116b6565b8091508381528484840111156117be57600080fd5b83836020830137600060208583010152509392505050565b600082601f8301126117e757600080fd5b61161183833560208501611778565b600080600080600060a0868803121561180e57600080fd5b61181786611598565b945061182560208701611598565b9350604086013567ffffffffffffffff8082111561184257600080fd5b61184e89838a01611707565b9450606088013591508082111561186457600080fd5b61187089838a01611707565b9350608088013591508082111561188657600080fd5b50611893888289016117d6565b9150509295509295909350565b600080604083850312156118b357600080fd5b823567ffffffffffffffff808211156118cb57600080fd5b818501915085601f8301126118df57600080fd5b813560206118ec826116e3565b6040516118f982826116b6565b83815260059390931b850182019282810191508984111561191957600080fd5b948201945b8386101561193e5761192f86611598565b8252948201949082019061191e565b9650508601359250508082111561195457600080fd5b5061196185828601611707565b9150509250929050565b600081518084526020808501945080840160005b8381101561199b5781518752958201959082019060010161197f565b509495945050505050565b602081526000611611602083018461196b565b6000602082840312156119cb57600080fd5b813567ffffffffffffffff8111156119e257600080fd5b8201601f810184136119f357600080fd5b611a0284823560208401611778565b949350505050565b600060208284031215611a1c57600080fd5b61161182611598565b60008060208385031215611a3857600080fd5b823567ffffffffffffffff80821115611a5057600080fd5b818501915085601f830112611a6457600080fd5b813581811115611a7357600080fd5b8660208260051b8501011115611a8857600080fd5b60209290920196919550909350505050565b60008060408385031215611aad57600080fd5b611ab683611598565b915060208301358015158114611acb57600080fd5b809150509250929050565b60008060408385031215611ae957600080fd5b611af283611598565b9150611b0060208401611598565b90509250929050565b600080600080600060a08688031215611b2157600080fd5b611b2a86611598565b9450611b3860208701611598565b93506040860135925060608601359150608086013567ffffffffffffffff811115611b6257600080fd5b611893888289016117d6565b600080600060608486031215611b8357600080fd5b611b8c84611598565b95602085013595506040909401359392505050565b600181811c90821680611bb557607f821691505b602082108103611bd557634e487b7160e01b600052602260045260246000fd5b50919050565b60008151611bed818560208601611631565b9290920192915050565b600080845481600182811c915080831680611c1357607f831692505b60208084108203611c3257634e487b7160e01b86526022600452602486fd5b818015611c465760018114611c5757611c84565b60ff19861689528489019650611c84565b60008b81526020902060005b86811015611c7c5781548b820152908501908301611c63565b505084890196505b505050505050611c948185611bdb565b95945050505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b600060018201611d1057611d10611ce8565b5060010190565b600082611d3457634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611d4b57611d4b611ce8565b500390565b6000816000190483118215151615611d6a57611d6a611ce8565b500290565b600060ff821660ff84168060ff03821115611d8c57611d8c611ce8565b019392505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115611e3657611e36611ce8565b500190565b604081526000611e4e604083018561196b565b8281036020840152611c94818561196b565b6001600160a01b0386811682528516602082015260a060408201819052600090611e8c9083018661196b565b8281036060840152611e9e818661196b565b90508281036080840152611eb28185611661565b98975050505050505050565b600060208284031215611ed057600080fd5b8151611611816115de565b600060033d1115611ef45760046000803e5060005160e01c5b90565b600060443d1015611f055790565b6040516003193d81016004833e81513d67ffffffffffffffff8160248401118184111715611f3557505050505090565b8285019150815181811115611f4d5750505050505090565b843d8701016020828501011115611f675750505050505090565b611f76602082860101876116b6565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009061200390830184611661565b97965050505050505056fea2646970667358221220f39fbf7ec1ec917d08be30d67529f07fe08f3e693238095df9b180dce07f469564736f6c634300080e0033
Deployed ByteCode Sourcemap
38838:2102:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23392:231;;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;23392:231:0;;;;;;;;22415:310;;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;22415:310:0;1019:187:1;39782:145:0;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;25331:442::-;;;;;;:::i;:::-;;:::i;:::-;;40830:107;;;:::i;39221:150::-;;;;;;:::i;:::-;;:::i;23789:524::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;39592:86::-;;;;;;:::i;:::-;;:::i;40678:124::-;;;;;;:::i;:::-;-1:-1:-1;;;;;40769:25:0;40747:4;40769:25;;;:16;:25;;;;;;;;;40678:124;2606:103;;;:::i;39053:81::-;;;:::i;40467:203::-;;;;;;:::i;:::-;;:::i;1955:87::-;2028:6;;1955:87;;-1:-1:-1;;;;;2028:6:0;;;8449:51:1;;8437:2;8422:18;1955:87:0;8303:203:1;39683:94:0;;;;;;:::i;:::-;;:::i;24386:155::-;;;;;;:::i;:::-;;:::i;39138:26::-;;;:::i;39932:88::-;;;:::i;24613:168::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24736:27:0;;;24712:4;24736:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;24613:168;24853:401;;;;;;:::i;:::-;;:::i;2864:201::-;;;;;;:::i;:::-;;:::i;39376:209::-;;;;;;:::i;:::-;;:::i;23392:231::-;23478:7;-1:-1:-1;;;;;23506:21:0;;23498:77;;;;-1:-1:-1;;;23498:77:0;;10268:2:1;23498:77:0;;;10250:21:1;10307:2;10287:18;;;10280:30;10346:34;10326:18;;;10319:62;-1:-1:-1;;;10397:18:1;;;10390:41;10448:19;;23498:77:0;;;;;;;;;-1:-1:-1;23593:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;23593:22:0;;;;;;;;;;;;23392:231::o;22415:310::-;22517:4;-1:-1:-1;;;;;;22554:41:0;;-1:-1:-1;;;22554:41:0;;:110;;-1:-1:-1;;;;;;;22612:52:0;;-1:-1:-1;;;22612:52:0;22554:110;:163;;;-1:-1:-1;;;;;;;;;;13817:40:0;;;22681:36;22534:183;22415:310;-1:-1:-1;;22415:310:0:o;39782:145::-;39842:13;39893:8;39903:17;39912:7;39903:8;:17::i;:::-;39876:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;39862:60;;39782:145;;;:::o;25331:442::-;-1:-1:-1;;;;;25564:20:0;;759:10;25564:20;;:60;;-1:-1:-1;25588:36:0;25605:4;759:10;24613:168;:::i;25588:36::-;25542:160;;;;-1:-1:-1;;;25542:160:0;;12560:2:1;25542:160:0;;;12542:21:1;12599:2;12579:18;;;12572:30;12638:34;12618:18;;;12611:62;-1:-1:-1;;;12689:18:1;;;12682:48;12747:19;;25542:160:0;12358:414:1;25542:160:0;25713:52;25736:4;25742:2;25746:3;25751:7;25760:4;25713:22;:52::i;:::-;25331:442;;;;;:::o;40830:107::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;40881:51:::1;::::0;40889:10:::1;::::0;40910:21:::1;40881:51:::0;::::1;;;::::0;::::1;::::0;;;40910:21;40889:10;40881:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;40830:107::o:0;39221:150::-;39309:10;39292:28;;;;:16;:28;;;;;;;;39284:37;;;;;;39335:28;39341:2;39345:10;39357:1;39335:28;;;;;;;;;;;;:5;:28::i;:::-;39221:150;;:::o;23789:524::-;23945:16;24006:3;:10;23987:8;:15;:29;23979:83;;;;-1:-1:-1;;;23979:83:0;;13340:2:1;23979:83:0;;;13322:21:1;13379:2;13359:18;;;13352:30;13418:34;13398:18;;;13391:62;-1:-1:-1;;;13469:18:1;;;13462:39;13518:19;;23979:83:0;13138:405:1;23979:83:0;24075:30;24122:8;:15;24108:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;24108:30:0;;24075:63;;24156:9;24151:122;24175:8;:15;24171:1;:19;24151:122;;;24231:30;24241:8;24250:1;24241:11;;;;;;;;:::i;:::-;;;;;;;24254:3;24258:1;24254:6;;;;;;;;:::i;:::-;;;;;;;24231:9;:30::i;:::-;24212:13;24226:1;24212:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;24192:3;;;:::i;:::-;;;24151:122;;;-1:-1:-1;24292:13:0;23789:524;-1:-1:-1;;;23789:524:0:o;39592:86::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;39656:17;;::::1;::::0;:8:::1;::::0;:17:::1;::::0;::::1;::::0;::::1;:::i;2606:103::-:0;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;2671:30:::1;2698:1;2671:18;:30::i;:::-;2606:103::o:0;39053:81::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40467:203::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;40561:9:::1;40556:107;40572:20:::0;;::::1;40556:107;;;40647:4;40614:16;:30;40631:9;;40641:1;40631:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;40614:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;40614:30:0;:37;;-1:-1:-1;;40614:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;40594:3;::::1;::::0;::::1;:::i;:::-;;;;40556:107;;;;40467:203:::0;;:::o;39683:94::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;39751:21;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;24386:155::-:0;24481:52;759:10;24514:8;24524;24481:18;:52::i;39138:26::-;;;;;;;:::i;39932:88::-;39976:13;40003:12;39996:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39932:88;:::o;24853:401::-;-1:-1:-1;;;;;25061:20:0;;759:10;25061:20;;:60;;-1:-1:-1;25085:36:0;25102:4;759:10;24613:168;:::i;25085:36::-;25039:151;;;;-1:-1:-1;;;25039:151:0;;14154:2:1;25039:151:0;;;14136:21:1;14193:2;14173:18;;;14166:30;14232:34;14212:18;;;14205:62;-1:-1:-1;;;14283:18:1;;;14276:39;14332:19;;25039:151:0;13952:405:1;25039:151:0;25201:45;25219:4;25225:2;25229;25233:6;25241:4;25201:17;:45::i;2864:201::-;2028:6;;-1:-1:-1;;;;;2028:6:0;759:10;2175:23;2167:68;;;;-1:-1:-1;;;2167:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;2953:22:0;::::1;2945:73;;;::::0;-1:-1:-1;;;2945:73:0;;14564:2:1;2945:73:0::1;::::0;::::1;14546:21:1::0;14603:2;14583:18;;;14576:30;14642:34;14622:18;;;14615:62;-1:-1:-1;;;14693:18:1;;;14686:36;14739:19;;2945:73:0::1;14362:402:1::0;2945:73:0::1;3029:28;3048:8;3029:18;:28::i;39376:209::-:0;39474:10;39457:28;;;;:16;:28;;;;;;;;39449:37;;;;;;39527:3;39501:22;39511:7;39520:2;39501:9;:22::i;:::-;:29;;39493:57;;;;-1:-1:-1;;;39493:57:0;;14971:2:1;39493:57:0;;;14953:21:1;15010:2;14990:18;;;14983:30;-1:-1:-1;;;15029:18:1;;;15022:45;15084:18;;39493:57:0;14769:339:1;39493:57:0;39557:23;39563:7;39572:2;39576:3;39557:5;:23::i;40025:430::-;40078:27;40116:2;40122:1;40116:7;40112:26;;-1:-1:-1;;40126:10:0;;;;;;;;;;;;-1:-1:-1;;;40126:10:0;;;;;40025:430::o;40112:26::-;40155:2;40143:9;40179:32;40186:6;;40179:32;;40195:5;;;;:::i;:::-;;-1:-1:-1;40202:7:0;;-1:-1:-1;40207:2:0;40202:7;;:::i;:::-;;;40179:32;;;40216:17;40246:3;40236:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40236:14:0;-1:-1:-1;40216:34:0;-1:-1:-1;40268:3:0;40276:151;40283:7;;40276:151;;40302:5;40306:1;40302;:5;:::i;:::-;40298:9;-1:-1:-1;40313:10:0;40344:7;40349:2;40344;:7;:::i;:::-;40343:14;;40355:2;40343:14;:::i;:::-;40338:19;;:2;:19;:::i;:::-;40327:31;;:2;:31;:::i;:::-;40313:46;;40365:9;40384:4;40377:12;;40365:24;;40405:2;40395:4;40400:1;40395:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;40395:12:0;;;;;;;;-1:-1:-1;40413:8:0;40419:2;40413:8;;:::i;:::-;;;40292:135;;40276:151;;;-1:-1:-1;40445:4:0;40025:430;-1:-1:-1;;;;40025:430:0:o;27569:1146::-;27796:7;:14;27782:3;:10;:28;27774:81;;;;-1:-1:-1;;;27774:81:0;;16049:2:1;27774:81:0;;;16031:21:1;16088:2;16068:18;;;16061:30;16127:34;16107:18;;;16100:62;-1:-1:-1;;;16178:18:1;;;16171:38;16226:19;;27774:81:0;15847:404:1;27774:81:0;-1:-1:-1;;;;;27874:16:0;;27866:66;;;;-1:-1:-1;;;27866:66:0;;;;;;;:::i;:::-;759:10;27945:16;28062:421;28086:3;:10;28082:1;:14;28062:421;;;28118:10;28131:3;28135:1;28131:6;;;;;;;;:::i;:::-;;;;;;;28118:19;;28152:14;28169:7;28177:1;28169:10;;;;;;;;:::i;:::-;;;;;;;;;;;;28196:19;28218:13;;;;;;;;;;-1:-1:-1;;;;;28218:19:0;;;;;;;;;;;;28169:10;;-1:-1:-1;28260:21:0;;;;28252:76;;;;-1:-1:-1;;;28252:76:0;;;;;;;:::i;:::-;28372:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28372:19:0;;;;;;;;;;28394:20;;;28372:42;;28444:17;;;;;;;:27;;28394:20;;28372:9;28444:27;;28394:20;;28444:27;:::i;:::-;;;;;;;;28103:380;;;28098:3;;;;:::i;:::-;;;28062:421;;;;28530:2;-1:-1:-1;;;;;28500:47:0;28524:4;-1:-1:-1;;;;;28500:47:0;28514:8;-1:-1:-1;;;;;28500:47:0;;28534:3;28539:7;28500:47;;;;;;;:::i;:::-;;;;;;;;28632:75;28668:8;28678:4;28684:2;28688:3;28693:7;28702:4;28632:35;:75::i;:::-;27763:952;27569:1146;;;;;:::o;30033:729::-;-1:-1:-1;;;;;30186:16:0;;30178:62;;;;-1:-1:-1;;;30178:62:0;;17878:2:1;30178:62:0;;;17860:21:1;17917:2;17897:18;;;17890:30;17956:34;17936:18;;;17929:62;-1:-1:-1;;;18007:18:1;;;18000:31;18048:19;;30178:62:0;17676:397:1;30178:62:0;759:10;30253:16;30318:21;30336:2;30318:17;:21::i;:::-;30295:44;;30350:24;30377:25;30395:6;30377:17;:25::i;:::-;30350:52;;30494:9;:13;;;;;;;;;;;-1:-1:-1;;;;;30494:17:0;;;;;;;;;:27;;30515:6;;30494:9;:27;;30515:6;;30494:27;:::i;:::-;;;;-1:-1:-1;;30537:52:0;;;18252:25:1;;;18308:2;18293:18;;18286:34;;;-1:-1:-1;;;;;30537:52:0;;;;30570:1;;30537:52;;;;;;18225:18:1;30537:52:0;;;;;;;30680:74;30711:8;30729:1;30733:2;30737;30741:6;30749:4;30680:30;:74::i;:::-;30167:595;;;30033:729;;;;:::o;3225:191::-;3318:6;;;-1:-1:-1;;;;;3335:17:0;;;-1:-1:-1;;;;;;3335:17:0;;;;;;;3368:40;;3318:6;;;3335:17;3318:6;;3368:40;;3299:16;;3368:40;3288:128;3225:191;:::o;34303:331::-;34458:8;-1:-1:-1;;;;;34449:17:0;:5;-1:-1:-1;;;;;34449:17:0;;34441:71;;;;-1:-1:-1;;;34441:71:0;;18533:2:1;34441:71:0;;;18515:21:1;18572:2;18552:18;;;18545:30;18611:34;18591:18;;;18584:62;-1:-1:-1;;;18662:18:1;;;18655:39;18711:19;;34441:71:0;18331:405:1;34441:71:0;-1:-1:-1;;;;;34523:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;34523:46:0;;;;;;;;;;34585:41;;1159::1;;;34585::0;;1132:18:1;34585:41:0;;;;;;;34303:331;;;:::o;26237:974::-;-1:-1:-1;;;;;26425:16:0;;26417:66;;;;-1:-1:-1;;;26417:66:0;;;;;;;:::i;:::-;759:10;26496:16;26561:21;26579:2;26561:17;:21::i;:::-;26538:44;;26593:24;26620:25;26638:6;26620:17;:25::i;:::-;26593:52;;26731:19;26753:13;;;;;;;;;;;-1:-1:-1;;;;;26753:19:0;;;;;;;;;;26791:21;;;;26783:76;;;;-1:-1:-1;;;26783:76:0;;;;;;;:::i;:::-;26895:9;:13;;;;;;;;;;;-1:-1:-1;;;;;26895:19:0;;;;;;;;;;26917:20;;;26895:42;;26959:17;;;;;;;:27;;26917:20;;26895:9;26959:27;;26917:20;;26959:27;:::i;:::-;;;;-1:-1:-1;;27004:46:0;;;18252:25:1;;;18308:2;18293:18;;18286:34;;;-1:-1:-1;;;;;27004:46:0;;;;;;;;;;;;;;18225:18:1;27004:46:0;;;;;;;27135:68;27166:8;27176:4;27182:2;27186;27190:6;27198:4;27135:30;:68::i;:::-;26406:805;;;;26237:974;;;;;:::o;32181:808::-;-1:-1:-1;;;;;32308:18:0;;32300:66;;;;-1:-1:-1;;;32300:66:0;;18943:2:1;32300:66:0;;;18925:21:1;18982:2;18962:18;;;18955:30;19021:34;19001:18;;;18994:62;-1:-1:-1;;;19072:18:1;;;19065:33;19115:19;;32300:66:0;18741:399:1;32300:66:0;759:10;32379:16;32444:21;32462:2;32444:17;:21::i;:::-;32421:44;;32476:24;32503:25;32521:6;32503:17;:25::i;:::-;32541:66;;;;;;;;;-1:-1:-1;32541:66:0;;;;32642:13;;;;;;;;;-1:-1:-1;;;;;32642:19:0;;;;;;;;32476:52;;-1:-1:-1;32680:21:0;;;;32672:70;;;;-1:-1:-1;;;32672:70:0;;19347:2:1;32672:70:0;;;19329:21:1;19386:2;19366:18;;;19359:30;19425:34;19405:18;;;19398:62;-1:-1:-1;;;19476:18:1;;;19469:34;19520:19;;32672:70:0;19145:400:1;32672:70:0;32778:9;:13;;;;;;;;;;;-1:-1:-1;;;;;32778:19:0;;;;;;;;;;;;32800:20;;;32778:42;;32849:54;;18252:25:1;;;18293:18;;;18286:34;;;32778:19:0;;32849:54;;;;;;18225:18:1;32849:54:0;;;;;;;32916:65;;;;;;;;;32960:1;32916:65;;;27569:1146;37746:813;-1:-1:-1;;;;;37986:13:0;;4951:19;:23;37982:570;;38022:79;;-1:-1:-1;;;38022:79:0;;-1:-1:-1;;;;;38022:43:0;;;;;:79;;38066:8;;38076:4;;38082:3;;38087:7;;38096:4;;38022:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38022:79:0;;;;;;;;-1:-1:-1;;38022:79:0;;;;;;;;;;;;:::i;:::-;;;38018:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;38414:6;38407:14;;-1:-1:-1;;;38407:14:0;;;;;;;;:::i;38018:523::-;;;38463:62;;-1:-1:-1;;;38463:62:0;;21709:2:1;38463:62:0;;;21691:21:1;21748:2;21728:18;;;21721:30;21787:34;21767:18;;;21760:62;-1:-1:-1;;;21838:18:1;;;21831:50;21898:19;;38463:62:0;21507:416:1;38018:523:0;-1:-1:-1;;;;;;38183:60:0;;-1:-1:-1;;;38183:60:0;38179:159;;38268:50;;-1:-1:-1;;;38268:50:0;;;;;;;:::i;38567:198::-;38687:16;;;38701:1;38687:16;;;;;;;;;38633;;38662:22;;38687:16;;;;;;;;;;;;-1:-1:-1;38687:16:0;38662:41;;38725:7;38714:5;38720:1;38714:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;38752:5;38567:198;-1:-1:-1;;38567:198:0:o;36994:744::-;-1:-1:-1;;;;;37209:13:0;;4951:19;:23;37205:526;;37245:72;;-1:-1:-1;;;37245:72:0;;-1:-1:-1;;;;;37245:38:0;;;;;:72;;37284:8;;37294:4;;37300:2;;37304:6;;37312:4;;37245:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37245:72:0;;;;;;;;-1:-1:-1;;37245:72:0;;;;;;;;;;;;:::i;:::-;;;37241:479;;;;:::i;:::-;-1:-1:-1;;;;;;37367:55:0;;-1:-1:-1;;;37367:55:0;37363:154;;37447:50;;-1:-1:-1;;;37447:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:1:o;1211:180::-;1270:6;1323:2;1311:9;1302:7;1298:23;1294:32;1291:52;;;1339:1;1336;1329:12;1291:52;-1:-1:-1;1362:23:1;;1211:180;-1:-1:-1;1211:180:1:o;1396:258::-;1468:1;1478:113;1492:6;1489:1;1486:13;1478:113;;;1568:11;;;1562:18;1549:11;;;1542:39;1514:2;1507:10;1478:113;;;1609:6;1606:1;1603:13;1600:48;;;1644:1;1635:6;1630:3;1626:16;1619:27;1600:48;;1396:258;;;:::o;1659:269::-;1712:3;1750:5;1744:12;1777:6;1772:3;1765:19;1793:63;1849:6;1842:4;1837:3;1833:14;1826:4;1819:5;1815:16;1793:63;:::i;:::-;1910:2;1889:15;-1:-1:-1;;1885:29:1;1876:39;;;;1917:4;1872:50;;1659:269;-1:-1:-1;;1659:269:1:o;1933:231::-;2082:2;2071:9;2064:21;2045:4;2102:56;2154:2;2143:9;2139:18;2131:6;2102:56;:::i;2169:127::-;2230:10;2225:3;2221:20;2218:1;2211:31;2261:4;2258:1;2251:15;2285:4;2282:1;2275:15;2301:249;2411:2;2392:13;;-1:-1:-1;;2388:27:1;2376:40;;2446:18;2431:34;;2467:22;;;2428:62;2425:88;;;2493:18;;:::i;:::-;2529:2;2522:22;-1:-1:-1;;2301:249:1:o;2555:183::-;2615:4;2648:18;2640:6;2637:30;2634:56;;;2670:18;;:::i;:::-;-1:-1:-1;2715:1:1;2711:14;2727:4;2707:25;;2555:183::o;2743:724::-;2797:5;2850:3;2843:4;2835:6;2831:17;2827:27;2817:55;;2868:1;2865;2858:12;2817:55;2904:6;2891:20;2930:4;2953:43;2993:2;2953:43;:::i;:::-;3025:2;3019:9;3037:31;3065:2;3057:6;3037:31;:::i;:::-;3103:18;;;3195:1;3191:10;;;;3179:23;;3175:32;;;3137:15;;;;-1:-1:-1;3219:15:1;;;3216:35;;;3247:1;3244;3237:12;3216:35;3283:2;3275:6;3271:15;3295:142;3311:6;3306:3;3303:15;3295:142;;;3377:17;;3365:30;;3415:12;;;;3328;;3295:142;;;-1:-1:-1;3455:6:1;2743:724;-1:-1:-1;;;;;;2743:724:1:o;3472:468::-;3536:5;3570:18;3562:6;3559:30;3556:56;;;3592:18;;:::i;:::-;3641:2;3635:9;3653:69;3710:2;3689:15;;-1:-1:-1;;3685:29:1;3716:4;3681:40;3635:9;3653:69;:::i;:::-;3740:6;3731:15;;3770:6;3762;3755:22;3810:3;3801:6;3796:3;3792:16;3789:25;3786:45;;;3827:1;3824;3817:12;3786:45;3877:6;3872:3;3865:4;3857:6;3853:17;3840:44;3932:1;3925:4;3916:6;3908;3904:19;3900:30;3893:41;;3472:468;;;;;:::o;3945:220::-;3987:5;4040:3;4033:4;4025:6;4021:17;4017:27;4007:55;;4058:1;4055;4048:12;4007:55;4080:79;4155:3;4146:6;4133:20;4126:4;4118:6;4114:17;4080:79;:::i;4170:943::-;4324:6;4332;4340;4348;4356;4409:3;4397:9;4388:7;4384:23;4380:33;4377:53;;;4426:1;4423;4416:12;4377:53;4449:29;4468:9;4449:29;:::i;:::-;4439:39;;4497:38;4531:2;4520:9;4516:18;4497:38;:::i;:::-;4487:48;;4586:2;4575:9;4571:18;4558:32;4609:18;4650:2;4642:6;4639:14;4636:34;;;4666:1;4663;4656:12;4636:34;4689:61;4742:7;4733:6;4722:9;4718:22;4689:61;:::i;:::-;4679:71;;4803:2;4792:9;4788:18;4775:32;4759:48;;4832:2;4822:8;4819:16;4816:36;;;4848:1;4845;4838:12;4816:36;4871:63;4926:7;4915:8;4904:9;4900:24;4871:63;:::i;:::-;4861:73;;4987:3;4976:9;4972:19;4959:33;4943:49;;5017:2;5007:8;5004:16;5001:36;;;5033:1;5030;5023:12;5001:36;;5056:51;5099:7;5088:8;5077:9;5073:24;5056:51;:::i;:::-;5046:61;;;4170:943;;;;;;;;:::o;5118:1208::-;5236:6;5244;5297:2;5285:9;5276:7;5272:23;5268:32;5265:52;;;5313:1;5310;5303:12;5265:52;5353:9;5340:23;5382:18;5423:2;5415:6;5412:14;5409:34;;;5439:1;5436;5429:12;5409:34;5477:6;5466:9;5462:22;5452:32;;5522:7;5515:4;5511:2;5507:13;5503:27;5493:55;;5544:1;5541;5534:12;5493:55;5580:2;5567:16;5602:4;5625:43;5665:2;5625:43;:::i;:::-;5697:2;5691:9;5709:31;5737:2;5729:6;5709:31;:::i;:::-;5775:18;;;5863:1;5859:10;;;;5851:19;;5847:28;;;5809:15;;;;-1:-1:-1;5887:19:1;;;5884:39;;;5919:1;5916;5909:12;5884:39;5943:11;;;;5963:148;5979:6;5974:3;5971:15;5963:148;;;6045:23;6064:3;6045:23;:::i;:::-;6033:36;;5996:12;;;;6089;;;;5963:148;;;6130:6;-1:-1:-1;;6174:18:1;;6161:32;;-1:-1:-1;;6205:16:1;;;6202:36;;;6234:1;6231;6224:12;6202:36;;6257:63;6312:7;6301:8;6290:9;6286:24;6257:63;:::i;:::-;6247:73;;;5118:1208;;;;;:::o;6331:435::-;6384:3;6422:5;6416:12;6449:6;6444:3;6437:19;6475:4;6504:2;6499:3;6495:12;6488:19;;6541:2;6534:5;6530:14;6562:1;6572:169;6586:6;6583:1;6580:13;6572:169;;;6647:13;;6635:26;;6681:12;;;;6716:15;;;;6608:1;6601:9;6572:169;;;-1:-1:-1;6757:3:1;;6331:435;-1:-1:-1;;;;;6331:435:1:o;6771:261::-;6950:2;6939:9;6932:21;6913:4;6970:56;7022:2;7011:9;7007:18;6999:6;6970:56;:::i;7037:450::-;7106:6;7159:2;7147:9;7138:7;7134:23;7130:32;7127:52;;;7175:1;7172;7165:12;7127:52;7215:9;7202:23;7248:18;7240:6;7237:30;7234:50;;;7280:1;7277;7270:12;7234:50;7303:22;;7356:4;7348:13;;7344:27;-1:-1:-1;7334:55:1;;7385:1;7382;7375:12;7334:55;7408:73;7473:7;7468:2;7455:16;7450:2;7446;7442:11;7408:73;:::i;:::-;7398:83;7037:450;-1:-1:-1;;;;7037:450:1:o;7492:186::-;7551:6;7604:2;7592:9;7583:7;7579:23;7575:32;7572:52;;;7620:1;7617;7610:12;7572:52;7643:29;7662:9;7643:29;:::i;7683:615::-;7769:6;7777;7830:2;7818:9;7809:7;7805:23;7801:32;7798:52;;;7846:1;7843;7836:12;7798:52;7886:9;7873:23;7915:18;7956:2;7948:6;7945:14;7942:34;;;7972:1;7969;7962:12;7942:34;8010:6;7999:9;7995:22;7985:32;;8055:7;8048:4;8044:2;8040:13;8036:27;8026:55;;8077:1;8074;8067:12;8026:55;8117:2;8104:16;8143:2;8135:6;8132:14;8129:34;;;8159:1;8156;8149:12;8129:34;8212:7;8207:2;8197:6;8194:1;8190:14;8186:2;8182:23;8178:32;8175:45;8172:65;;;8233:1;8230;8223:12;8172:65;8264:2;8256:11;;;;;8286:6;;-1:-1:-1;7683:615:1;;-1:-1:-1;;;;7683:615:1:o;8511:347::-;8576:6;8584;8637:2;8625:9;8616:7;8612:23;8608:32;8605:52;;;8653:1;8650;8643:12;8605:52;8676:29;8695:9;8676:29;:::i;:::-;8666:39;;8755:2;8744:9;8740:18;8727:32;8802:5;8795:13;8788:21;8781:5;8778:32;8768:60;;8824:1;8821;8814:12;8768:60;8847:5;8837:15;;;8511:347;;;;;:::o;8863:260::-;8931:6;8939;8992:2;8980:9;8971:7;8967:23;8963:32;8960:52;;;9008:1;9005;8998:12;8960:52;9031:29;9050:9;9031:29;:::i;:::-;9021:39;;9079:38;9113:2;9102:9;9098:18;9079:38;:::i;:::-;9069:48;;8863:260;;;;;:::o;9128:606::-;9232:6;9240;9248;9256;9264;9317:3;9305:9;9296:7;9292:23;9288:33;9285:53;;;9334:1;9331;9324:12;9285:53;9357:29;9376:9;9357:29;:::i;:::-;9347:39;;9405:38;9439:2;9428:9;9424:18;9405:38;:::i;:::-;9395:48;;9490:2;9479:9;9475:18;9462:32;9452:42;;9541:2;9530:9;9526:18;9513:32;9503:42;;9596:3;9585:9;9581:19;9568:33;9624:18;9616:6;9613:30;9610:50;;;9656:1;9653;9646:12;9610:50;9679:49;9720:7;9711:6;9700:9;9696:22;9679:49;:::i;9739:322::-;9816:6;9824;9832;9885:2;9873:9;9864:7;9860:23;9856:32;9853:52;;;9901:1;9898;9891:12;9853:52;9924:29;9943:9;9924:29;:::i;:::-;9914:39;10000:2;9985:18;;9972:32;;-1:-1:-1;10051:2:1;10036:18;;;10023:32;;9739:322;-1:-1:-1;;;9739:322:1:o;10478:380::-;10557:1;10553:12;;;;10600;;;10621:61;;10675:4;10667:6;10663:17;10653:27;;10621:61;10728:2;10720:6;10717:14;10697:18;10694:38;10691:161;;10774:10;10769:3;10765:20;10762:1;10755:31;10809:4;10806:1;10799:15;10837:4;10834:1;10827:15;10691:161;;10478:380;;;:::o;10989:185::-;11031:3;11069:5;11063:12;11084:52;11129:6;11124:3;11117:4;11110:5;11106:16;11084:52;:::i;:::-;11152:16;;;;;10989:185;-1:-1:-1;;10989:185:1:o;11179:1174::-;11355:3;11384:1;11417:6;11411:13;11447:3;11469:1;11497:9;11493:2;11489:18;11479:28;;11557:2;11546:9;11542:18;11579;11569:61;;11623:4;11615:6;11611:17;11601:27;;11569:61;11649:2;11697;11689:6;11686:14;11666:18;11663:38;11660:165;;-1:-1:-1;;;11724:33:1;;11780:4;11777:1;11770:15;11810:4;11731:3;11798:17;11660:165;11841:18;11868:104;;;;11986:1;11981:320;;;;11834:467;;11868:104;-1:-1:-1;;11901:24:1;;11889:37;;11946:16;;;;-1:-1:-1;11868:104:1;;11981:320;10936:1;10929:14;;;10973:4;10960:18;;12076:1;12090:165;12104:6;12101:1;12098:13;12090:165;;;12182:14;;12169:11;;;12162:35;12225:16;;;;12119:10;;12090:165;;;12094:3;;12284:6;12279:3;12275:16;12268:23;;11834:467;;;;;;;12317:30;12343:3;12335:6;12317:30;:::i;:::-;12310:37;11179:1174;-1:-1:-1;;;;;11179:1174:1:o;12777:356::-;12979:2;12961:21;;;12998:18;;;12991:30;13057:34;13052:2;13037:18;;13030:62;13124:2;13109:18;;12777:356::o;13548:127::-;13609:10;13604:3;13600:20;13597:1;13590:31;13640:4;13637:1;13630:15;13664:4;13661:1;13654:15;13680:127;13741:10;13736:3;13732:20;13729:1;13722:31;13772:4;13769:1;13762:15;13796:4;13793:1;13786:15;13812:135;13851:3;13872:17;;;13869:43;;13892:18;;:::i;:::-;-1:-1:-1;13939:1:1;13928:13;;13812:135::o;15113:217::-;15153:1;15179;15169:132;;15223:10;15218:3;15214:20;15211:1;15204:31;15258:4;15255:1;15248:15;15286:4;15283:1;15276:15;15169:132;-1:-1:-1;15315:9:1;;15113:217::o;15335:125::-;15375:4;15403:1;15400;15397:8;15394:34;;;15408:18;;:::i;:::-;-1:-1:-1;15445:9:1;;15335:125::o;15465:168::-;15505:7;15571:1;15567;15563:6;15559:14;15556:1;15553:21;15548:1;15541:9;15534:17;15530:45;15527:71;;;15578:18;;:::i;:::-;-1:-1:-1;15618:9:1;;15465:168::o;15638:204::-;15676:3;15712:4;15709:1;15705:12;15744:4;15741:1;15737:12;15779:3;15773:4;15769:14;15764:3;15761:23;15758:49;;;15787:18;;:::i;:::-;15823:13;;15638:204;-1:-1:-1;;;15638:204:1:o;16256:401::-;16458:2;16440:21;;;16497:2;16477:18;;;16470:30;16536:34;16531:2;16516:18;;16509:62;-1:-1:-1;;;16602:2:1;16587:18;;16580:35;16647:3;16632:19;;16256:401::o;16662:406::-;16864:2;16846:21;;;16903:2;16883:18;;;16876:30;16942:34;16937:2;16922:18;;16915:62;-1:-1:-1;;;17008:2:1;16993:18;;16986:40;17058:3;17043:19;;16662:406::o;17073:128::-;17113:3;17144:1;17140:6;17137:1;17134:13;17131:39;;;17150:18;;:::i;:::-;-1:-1:-1;17186:9:1;;17073:128::o;17206:465::-;17463:2;17452:9;17445:21;17426:4;17489:56;17541:2;17530:9;17526:18;17518:6;17489:56;:::i;:::-;17593:9;17585:6;17581:22;17576:2;17565:9;17561:18;17554:50;17621:44;17658:6;17650;17621:44;:::i;19550:838::-;-1:-1:-1;;;;;19947:15:1;;;19929:34;;19999:15;;19994:2;19979:18;;19972:43;19909:3;20046:2;20031:18;;20024:31;;;19872:4;;20078:57;;20115:19;;20107:6;20078:57;:::i;:::-;20183:9;20175:6;20171:22;20166:2;20155:9;20151:18;20144:50;20217:44;20254:6;20246;20217:44;:::i;:::-;20203:58;;20310:9;20302:6;20298:22;20292:3;20281:9;20277:19;20270:51;20338:44;20375:6;20367;20338:44;:::i;:::-;20330:52;19550:838;-1:-1:-1;;;;;;;;19550:838:1:o;20393:249::-;20462:6;20515:2;20503:9;20494:7;20490:23;20486:32;20483:52;;;20531:1;20528;20521:12;20483:52;20563:9;20557:16;20582:30;20606:5;20582:30;:::i;20647:179::-;20682:3;20724:1;20706:16;20703:23;20700:120;;;20770:1;20767;20764;20749:23;-1:-1:-1;20807:1:1;20801:8;20796:3;20792:18;20700:120;20647:179;:::o;20831:671::-;20870:3;20912:4;20894:16;20891:26;20888:39;;;20831:671;:::o;20888:39::-;20954:2;20948:9;-1:-1:-1;;21019:16:1;21015:25;;21012:1;20948:9;20991:50;21070:4;21064:11;21094:16;21129:18;21200:2;21193:4;21185:6;21181:17;21178:25;21173:2;21165:6;21162:14;21159:45;21156:58;;;21207:5;;;;;20831:671;:::o;21156:58::-;21244:6;21238:4;21234:17;21223:28;;21280:3;21274:10;21307:2;21299:6;21296:14;21293:27;;;21313:5;;;;;;20831:671;:::o;21293:27::-;21397:2;21378:16;21372:4;21368:27;21364:36;21357:4;21348:6;21343:3;21339:16;21335:27;21332:69;21329:82;;;21404:5;;;;;;20831:671;:::o;21329:82::-;21420:57;21471:4;21462:6;21454;21450:19;21446:30;21440:4;21420:57;:::i;:::-;-1:-1:-1;21493:3:1;;20831:671;-1:-1:-1;;;;;20831:671:1:o;21928:404::-;22130:2;22112:21;;;22169:2;22149:18;;;22142:30;22208:34;22203:2;22188:18;;22181:62;-1:-1:-1;;;22274:2:1;22259:18;;22252:38;22322:3;22307:19;;21928:404::o;22337:572::-;-1:-1:-1;;;;;22634:15:1;;;22616:34;;22686:15;;22681:2;22666:18;;22659:43;22733:2;22718:18;;22711:34;;;22776:2;22761:18;;22754:34;;;22596:3;22819;22804:19;;22797:32;;;22559:4;;22846:57;;22883:19;;22875:6;22846:57;:::i;:::-;22838:65;22337:572;-1:-1:-1;;;;;;;22337:572:1:o
Metadata Hash
ipfs://f39fbf7ec1ec917d08be30d67529f07fe08f3e693238095df9b180dce07f4695