Token
Overview ERC-1155
Total Supply:
0 N/A
Holders:
283 addresses
Transfers:
-
Contract:
[ Download CSV Export ]
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Dispensary
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-02-01 */ // SPDX-License-Identifier: Unlicensed pragma solidity 0.8.17; // __ __ _ ___ __ ________ // \ \ / /_ _| |___ _ _____ _ |_ ) \__ /__ / // \ V / _` | / / || |_ / _` | / / () |_ \|_ \ // |_|\__,_|_\_\\_,_/__\__,_| /___\__/___/___/ // / __| |_ ___ __ _ _ _ _ _ // \__ \ ' \/ _ \/ _` | || | ' \ // |___/_||_\___/\__, |\_,_|_||_| // |___/ // (•_•) // ( •_•)>⌐■-■ // (⌐■_■) // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) /** * @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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { 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/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) /** * @dev Required interface of an ERC1155 compliant contract, as defined in the * https://eips.ethereum.org/EIPS/eip-1155[EIP]. * * _Available since v3.1._ */ interface IERC1155 is IERC165 { /** * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`. */ event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value); /** * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all * transfers. */ event TransferBatch( address indexed operator, address indexed from, address indexed to, uint256[] ids, uint256[] values ); /** * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to * `approved`. */ event ApprovalForAll(address indexed account, address indexed operator, bool approved); /** * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI. * * If an {URI} event was emitted for `id`, the standard * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value * returned by {IERC1155MetadataURI-uri}. */ event URI(string value, uint256 indexed id); /** * @dev Returns the amount of tokens of token type `id` owned by `account`. * * Requirements: * * - `account` cannot be the zero address. */ function balanceOf(address account, uint256 id) external view returns (uint256); /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}. * * Requirements: * * - `accounts` and `ids` must have the same length. */ function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids) external view returns (uint256[] memory); /** * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`, * * Emits an {ApprovalForAll} event. * * Requirements: * * - `operator` cannot be the caller. */ function setApprovalForAll(address operator, bool approved) external; /** * @dev Returns true if `operator` is approved to transfer ``account``'s tokens. * * See {setApprovalForAll}. */ function isApprovedForAll(address account, address operator) external view returns (bool); /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If the caller is not `from`, it must 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/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) /** * @dev Interface of the optional ERC1155MetadataExtension interface, as defined * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP]. * * _Available since v3.1._ */ interface IERC1155MetadataURI is IERC1155 { /** * @dev Returns the URI for token type `id`. * * If the `\{id\}` substring is present in the URI, it must be replaced by * clients with the actual token type ID. */ function uri(uint256 id) external view returns (string memory); } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) /** * @dev _Available since v3.1._ */ interface IERC1155Receiver is IERC165 { /** * @dev Handles the receipt of a single ERC1155 token type. This function is * called at the end of a `safeTransferFrom` after the balance has been updated. * * NOTE: To accept the transfer, this must return * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * (i.e. 0xf23a6e61, or its own function selector). * * @param operator The address which initiated the transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param id The ID of the token being transferred * @param value The amount of tokens being transferred * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed */ function onERC1155Received( address operator, address from, uint256 id, uint256 value, bytes calldata data ) external returns (bytes4); /** * @dev Handles the receipt of a multiple ERC1155 token types. This function * is called at the end of a `safeBatchTransferFrom` after the balances have * been updated. * * NOTE: To accept the transfer(s), this must return * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * (i.e. 0xbc197c81, or its own function selector). * * @param operator The address which initiated the batch transfer (i.e. msg.sender) * @param from The address which previously owned the token * @param ids An array containing ids of each token being transferred (order and length must match values array) * @param values An array containing amounts of each token being transferred (order and length must match ids array) * @param data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed */ function onERC1155BatchReceived( address operator, address from, uint256[] calldata ids, uint256[] calldata values, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol) /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, "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"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, 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) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata, errorMessage); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract. * * _Available since v4.8._ */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata, string memory errorMessage ) internal view returns (bytes memory) { if (success) { if (returndata.length == 0) { // only check isContract if the call was successful and the return data is empty // otherwise we already know that it was a contract require(isContract(target), "Address: call to non-contract"); } return returndata; } else { _revert(returndata, errorMessage); } } /** * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason or 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 { _revert(returndata, errorMessage); } } function _revert(bytes memory returndata, string memory errorMessage) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/token/ERC1155/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (token/ERC1155/ERC1155.sol) /** * @dev Implementation of the basic standard multi-token. * See https://eips.ethereum.org/EIPS/eip-1155 * Originally based on code by Enjin: https://github.com/enjin/erc-1155 * * _Available since v3.1._ */ contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI { using Address for address; // Mapping from token ID to account balances mapping(uint256 => mapping(address => uint256)) private _balances; // Mapping from account to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json string private _uri; /** * @dev See {_setURI}. */ constructor(string memory uri_) { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC1155).interfaceId || interfaceId == type(IERC1155MetadataURI).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the same URI for *all* token types. It relies * on the token type ID substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * Clients calling this function must replace the `\{id\}` substring with the * actual token type ID. */ function uri(uint256) 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: address zero is not a valid owner"); 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 token owner or 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: caller is not token owner or 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}. * * 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 _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` * * Emits a {TransferSingle} event. * * 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}. * * Emits a {TransferBatch} event. * * 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 an {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 `ids` and `amounts` 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 @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts (last updated v4.8.0) (security/ReentrancyGuard.sol) /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be _NOT_ENTERED require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File contracts/utility/Permissions.sol /** * @title A generic permissions-management contract for Yakuza 2033. * * @notice Yakuza 2033 * Telegram: t.me/yakuza2033 * Twitter: yakuza2033 * App: yakuza2033.com * * @author Shogun * Telegram: zeroXshogun * Web: coinlord.finance * * @custom:security-contact Telegram: zeroXshogun */ contract Permissions is Context, Ownable { /// Accounts permitted to modify rules. mapping(address => bool) public appAddresses; modifier onlyApp() { require(appAddresses[_msgSender()] == true, "Caller is not admin"); _; } constructor() {} function setPermission(address account, bool permitted) external onlyOwner { appAddresses[account] = permitted; } } // File contracts/inventory/Dispensary.sol interface IGenericToken { function addToWhitelist(address) external; function mint(address, uint256, uint256) external; function whitelistEnabled() external returns(bool); function whitelistBalance(address) external returns(uint256); } /** * @title An ERC-1155 NFT contract for Yakuza 2033. * * @notice Yakuza 2033 * Telegram: t.me/yakuza2033 * Twitter: yakuza2033 * App: yakuza2033.com * * @author Shogun * Telegram: zeroXshogun * Web: coinlord.finance * * @custom:security-contact Telegram: zeroXshogun */ contract Dispensary is ERC1155, Permissions { using Counters for Counters.Counter; IGenericToken public bugs; // Standardized decimals variable for App's yielding contracts. uint8 public decimals = 0; struct Token { uint256 id; string name; string uri; } /// Operatives ID counter. Counters.Counter private _currentId; /// Mapping of all tokens. /// @dev id => Token mapping(uint256 => Token) public tokens; /// Mapping of claimable tokens. /// @dev id => address => amount mapping(uint256 => mapping(address => uint256)) public claimableTokens; //// //// INIT //// /** * Deploy contract. */ constructor(address _bugs) ERC1155("") { bugs = IGenericToken(_bugs); } //// //// FALLBACK //// /** * Fallback function. */ receive() external payable { // Genesis whitelist. if (bugs.whitelistEnabled()) { require(msg.value == 4200000000000000, "Send 0.0042 ETH"); require(bugs.whitelistBalance(_msgSender()) == 0, "Already whitelisted"); bugs.addToWhitelist(_msgSender()); bugs.mint(_msgSender(), 0, 1000000000000000000000); _mint(_msgSender(), 0, 1, ""); } } //// //// TOKEN //// /** * Get number of token types in this collection. * * @return uint256 of current counter value. */ function typesCount() external view returns(uint256) { return _currentId.current(); } /** * Add new token to this collection. * * @param name as string name for this token. * @param uri as string location of this token's metadata. */ function addNewToken(string calldata name, string calldata uri) public onlyOwner { uint256 id = _currentId.current(); tokens[id] = Token(id, name, uri); _currentId.increment(); } /** * Mint a token. * * @dev Caller must have approved Operatives to transfer Bugs. * * @param to as address of recipient. * @param id as uint256 ID of the token to mint. * @param amount as uint256 amount of the token to mint. */ function mint(address to, uint256 id, uint256 amount) external onlyApp { _mint(to, id, amount, ""); } function setClaimableToken(address account, uint256 id, uint256 amount) external onlyApp { claimableTokens[id][account] = amount; } function claimToken(uint256 id) external { uint256 amount = claimableTokens[id][_msgSender()]; require(amount > 0, "No claimable balance"); _mint(_msgSender(), 0, amount, ""); } function setURI(string memory newuri) external onlyOwner { _setURI(newuri); } //// //// BALANCES //// /** * Withdraw ETH to owner. * * @param amount quantity of ETH to withdraw. */ function recoverETH(uint256 amount) external payable onlyOwner { (bool success, ) = payable(owner()).call{value: amount}(''); require(success, 'Transfer failed.'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_bugs","type":"address"}],"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":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"name":"addNewToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"appAddresses","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[],"name":"bugs","outputs":[{"internalType":"contract IGenericToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"claimToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"claimableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"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":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverETH","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setClaimableToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bool","name":"permitted","type":"bool"}],"name":"setPermission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokens","outputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"uri","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typesCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60806040526005805460ff60a01b191690553480156200001e57600080fd5b5060405162002603380380620026038339810160408190526200004191620000f1565b6040805160208101909152600081526200005b816200008d565b5062000067336200009f565b600580546001600160a01b0319166001600160a01b039290921691909117905562000294565b60026200009b8282620001c8565b5050565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000602082840312156200010457600080fd5b81516001600160a01b03811681146200011c57600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014e57607f821691505b6020821081036200016f57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001c357600081815260208120601f850160051c810160208610156200019e5750805b601f850160051c820191505b81811015620001bf57828155600101620001aa565b5050505b505050565b81516001600160401b03811115620001e457620001e462000123565b620001fc81620001f5845462000139565b8462000175565b602080601f8311600181146200023457600084156200021b5750858301515b600019600386901b1c1916600185901b178555620001bf565b600085815260208120601f198616915b82811015620002655788860151825594840194600190910190840162000244565b5085821015620002845787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61235f80620002a46000396000f3fe60806040526004361061014e5760003560e01c80635f80c910116100b6578063d087d74d1161006f578063d087d74d146106a4578063d3335553146106dc578063e985e9c5146106ef578063ec6263c014610738578063f242432a14610758578063f2fde38b1461077857600080fd5b80635f80c910146105c9578063715018a6146106015780638da5cb5b1461061657806390de210414610634578063a22cb46514610664578063a9e7c2e51461068457600080fd5b80632eb2c2d6116101085780632eb2c2d6146104e5578063313ce567146105055780634e1273f4146105385780634edf6fe0146105655780634f64b2be1461057a5780635689c028146105a957600080fd5b8062fdd58e146103f557806301ffc9a71461042857806302fe5305146104585780630e89341c1461047857806313351e93146104a5578063156e29f6146104c557600080fd5b366103f057600560009054906101000a90046001600160a01b03166001600160a01b03166351fb012d6040518163ffffffff1660e01b81526004016020604051808303816000875af11580156101a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906101cc919061181c565b156103ee5734660eebe0b40e80001461021e5760405162461bcd60e51b815260206004820152600f60248201526e0a6cadcc840605c60606864408aa89608b1b60448201526064015b60405180910390fd5b6005546001600160a01b031663368e1861336040516001600160e01b031960e084901b1681526001600160a01b0390911660048201526024016020604051808303816000875af1158015610276573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061029a9190611840565b156102dd5760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481dda1a5d195b1a5cdd1959606a1b6044820152606401610215565b6005546001600160a01b031663e43252d7336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602401600060405180830381600087803b15801561033057600080fd5b505af1158015610344573d6000803e3d6000fd5b50506005546001600160a01b0316915063156e29f69050336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260006024820152683635c9adc5dea000006044820152606401600060405180830381600087803b1580156103b357600080fd5b505af11580156103c7573d6000803e3d6000fd5b505050506103ee6103d53390565b6000600160405180602001604052806000815250610798565b005b600080fd5b34801561040157600080fd5b50610415610410366004611875565b6108ac565b6040519081526020015b60405180910390f35b34801561043457600080fd5b506104486104433660046118b5565b610940565b604051901515815260200161041f565b34801561046457600080fd5b506103ee610473366004611973565b610990565b34801561048457600080fd5b506104986104933660046119c4565b6109a4565b60405161041f9190611a23565b3480156104b157600080fd5b506103ee6104c0366004611a36565b610a38565b3480156104d157600080fd5b506103ee6104e0366004611a36565b610ab9565b3480156104f157600080fd5b506103ee610500366004611b1e565b610b33565b34801561051157600080fd5b5060055461052690600160a01b900460ff1681565b60405160ff909116815260200161041f565b34801561054457600080fd5b50610558610553366004611bc8565b610b7f565b60405161041f9190611cce565b34801561057157600080fd5b50610415610ca9565b34801561058657600080fd5b5061059a6105953660046119c4565b610cb9565b60405161041f93929190611ce1565b3480156105b557600080fd5b506103ee6105c4366004611d5f565b610dec565b3480156105d557600080fd5b506005546105e9906001600160a01b031681565b6040516001600160a01b03909116815260200161041f565b34801561060d57600080fd5b506103ee610ed4565b34801561062257600080fd5b506003546001600160a01b03166105e9565b34801561064057600080fd5b5061044861064f366004611dcb565b60046020526000908152604090205460ff1681565b34801561067057600080fd5b506103ee61067f366004611de6565b610ee8565b34801561069057600080fd5b506103ee61069f3660046119c4565b610ef7565b3480156106b057600080fd5b506104156106bf366004611e1d565b600860209081526000928352604080842090915290825290205481565b6103ee6106ea3660046119c4565b610f71565b3480156106fb57600080fd5b5061044861070a366004611e49565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b34801561074457600080fd5b506103ee610753366004611de6565b611020565b34801561076457600080fd5b506103ee610773366004611e73565b611053565b34801561078457600080fd5b506103ee610793366004611dcb565b611098565b6001600160a01b0384166107f85760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610215565b3360006108048561110e565b905060006108118561110e565b90506000868152602081815260408083206001600160a01b038b16845290915281208054879290610843908490611eee565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a46108a383600089898989611161565b50505050505050565b60006001600160a01b0383166109175760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b6064820152608401610215565b506000818152602081815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061097157506001600160e01b031982166303a24d0760e21b145b8061093a57506301ffc9a760e01b6001600160e01b031983161461093a565b6109986112bc565b6109a181611316565b50565b6060600280546109b390611f01565b80601f01602080910402602001604051908101604052809291908181526020018280546109df90611f01565b8015610a2c5780601f10610a0157610100808354040283529160200191610a2c565b820191906000526020600020905b815481529060010190602001808311610a0f57829003601f168201915b50505050509050919050565b3360009081526004602052604090205460ff161515600114610a925760405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606401610215565b60009182526008602090815260408084206001600160a01b03909516845293905291902055565b3360009081526004602052604090205460ff161515600114610b135760405162461bcd60e51b815260206004820152601360248201527221b0b63632b91034b9903737ba1030b236b4b760691b6044820152606401610215565b610b2e83838360405180602001604052806000815250610798565b505050565b6001600160a01b038516331480610b4f5750610b4f853361070a565b610b6b5760405162461bcd60e51b815260040161021590611f3b565b610b788585858585611322565b5050505050565b60608151835114610be45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b6064820152608401610215565b6000835167ffffffffffffffff811115610c0057610c006118d2565b604051908082528060200260200182016040528015610c29578160200160208202803683370190505b50905060005b8451811015610ca157610c74858281518110610c4d57610c4d611f89565b6020026020010151858381518110610c6757610c67611f89565b60200260200101516108ac565b828281518110610c8657610c86611f89565b6020908102919091010152610c9a81611f9f565b9050610c2f565b509392505050565b6000610cb460065490565b905090565b60076020526000908152604090208054600182018054919291610cdb90611f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610d0790611f01565b8015610d545780601f10610d2957610100808354040283529160200191610d54565b820191906000526020600020905b815481529060010190602001808311610d3757829003601f168201915b505050505090806002018054610d6990611f01565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9590611f01565b8015610de25780601f10610db757610100808354040283529160200191610de2565b820191906000526020600020905b815481529060010190602001808311610dc557829003601f168201915b5050505050905083565b610df46112bc565b6000610dff60065490565b9050604051806060016040528082815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250604080516020601f870181900481028201810190925285815291810191908690869081908401838280828437600092018290525093909452505083815260076020908152604090912083518155908301519091506001820190610eae9082611ffe565b5060408201516002820190610ec39082611ffe565b505060068054600101905550610b78565b610edc6112bc565b610ee660006114f7565b565b610ef3338383611549565b5050565b600081815260086020908152604080832033845290915290205480610f555760405162461bcd60e51b81526020600482015260146024820152734e6f20636c61696d61626c652062616c616e636560601b6044820152606401610215565b610ef33360008360405180602001604052806000815250610798565b610f796112bc565b6000610f8d6003546001600160a01b031690565b6001600160a01b03168260405160006040518083038185875af1925050503d8060008114610fd7576040519150601f19603f3d011682016040523d82523d6000602084013e610fdc565b606091505b5050905080610ef35760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610215565b6110286112bc565b6001600160a01b03919091166000908152600460205260409020805460ff1916911515919091179055565b6001600160a01b03851633148061106f575061106f853361070a565b61108b5760405162461bcd60e51b815260040161021590611f3b565b610b788585858585611629565b6110a06112bc565b6001600160a01b0381166111055760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610215565b6109a1816114f7565b6040805160018082528183019092526060916000919060208083019080368337019050509050828160008151811061114857611148611f89565b602090810291909101015292915050565b505050505050565b6001600160a01b0384163b156111595760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906111a590899089908890889088906004016120be565b6020604051808303816000875af19250505080156111e0575060408051601f3d908101601f191682019092526111dd91810190612103565b60015b61128c576111ec612120565b806308c379a003611225575061120061213c565b8061120b5750611227565b8060405162461bcd60e51b81526004016102159190611a23565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b6064820152608401610215565b6001600160e01b0319811663f23a6e6160e01b146108a35760405162461bcd60e51b8152600401610215906121c6565b6003546001600160a01b03163314610ee65760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610215565b6002610ef38282611ffe565b81518351146113845760405162461bcd60e51b815260206004820152602860248201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206044820152670dad2e6dac2e8c6d60c31b6064820152608401610215565b6001600160a01b0384166113aa5760405162461bcd60e51b81526004016102159061220e565b3360005b84518110156114915760008582815181106113cb576113cb611f89565b6020026020010151905060008583815181106113e9576113e9611f89565b602090810291909101810151600084815280835260408082206001600160a01b038e1683529093529190912054909150818110156114395760405162461bcd60e51b815260040161021590612253565b6000838152602081815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611476908490611eee565b925050819055505050508061148a90611f9f565b90506113ae565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516114e192919061229d565b60405180910390a4611159818787878787611753565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316036115bc5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b6064820152608401610215565b6001600160a01b03838116600081815260016020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661164f5760405162461bcd60e51b81526004016102159061220e565b33600061165b8561110e565b905060006116688561110e565b90506000868152602081815260408083206001600160a01b038c168452909152902054858110156116ab5760405162461bcd60e51b815260040161021590612253565b6000878152602081815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906116e8908490611eee565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611748848a8a8a8a8a611161565b505050505050505050565b6001600160a01b0384163b156111595760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061179790899089908890889088906004016122cb565b6020604051808303816000875af19250505080156117d2575060408051601f3d908101601f191682019092526117cf91810190612103565b60015b6117de576111ec612120565b6001600160e01b0319811663bc197c8160e01b146108a35760405162461bcd60e51b8152600401610215906121c6565b80151581146109a157600080fd5b60006020828403121561182e57600080fd5b81516118398161180e565b9392505050565b60006020828403121561185257600080fd5b5051919050565b80356001600160a01b038116811461187057600080fd5b919050565b6000806040838503121561188857600080fd5b61189183611859565b946020939093013593505050565b6001600160e01b0319811681146109a157600080fd5b6000602082840312156118c757600080fd5b81356118398161189f565b634e487b7160e01b600052604160045260246000fd5b601f8201601f1916810167ffffffffffffffff8111828210171561190e5761190e6118d2565b6040525050565b600067ffffffffffffffff83111561192f5761192f6118d2565b604051611946601f8501601f1916602001826118e8565b80915083815284848401111561195b57600080fd5b83836020830137600060208583010152509392505050565b60006020828403121561198557600080fd5b813567ffffffffffffffff81111561199c57600080fd5b8201601f810184136119ad57600080fd5b6119bc84823560208401611915565b949350505050565b6000602082840312156119d657600080fd5b5035919050565b6000815180845260005b81811015611a03576020818501810151868301820152016119e7565b506000602082860101526020601f19601f83011685010191505092915050565b60208152600061183960208301846119dd565b600080600060608486031215611a4b57600080fd5b611a5484611859565b95602085013595506040909401359392505050565b600067ffffffffffffffff821115611a8357611a836118d2565b5060051b60200190565b600082601f830112611a9e57600080fd5b81356020611aab82611a69565b604051611ab882826118e8565b83815260059390931b8501820192828101915086841115611ad857600080fd5b8286015b84811015611af35780358352918301918301611adc565b509695505050505050565b600082601f830112611b0f57600080fd5b61183983833560208501611915565b600080600080600060a08688031215611b3657600080fd5b611b3f86611859565b9450611b4d60208701611859565b9350604086013567ffffffffffffffff80821115611b6a57600080fd5b611b7689838a01611a8d565b94506060880135915080821115611b8c57600080fd5b611b9889838a01611a8d565b93506080880135915080821115611bae57600080fd5b50611bbb88828901611afe565b9150509295509295909350565b60008060408385031215611bdb57600080fd5b823567ffffffffffffffff80821115611bf357600080fd5b818501915085601f830112611c0757600080fd5b81356020611c1482611a69565b604051611c2182826118e8565b83815260059390931b8501820192828101915089841115611c4157600080fd5b948201945b83861015611c6657611c5786611859565b82529482019490820190611c46565b96505086013592505080821115611c7c57600080fd5b50611c8985828601611a8d565b9150509250929050565b600081518084526020808501945080840160005b83811015611cc357815187529582019590820190600101611ca7565b509495945050505050565b6020815260006118396020830184611c93565b838152606060208201526000611cfa60608301856119dd565b8281036040840152611d0c81856119dd565b9695505050505050565b60008083601f840112611d2857600080fd5b50813567ffffffffffffffff811115611d4057600080fd5b602083019150836020828501011115611d5857600080fd5b9250929050565b60008060008060408587031215611d7557600080fd5b843567ffffffffffffffff80821115611d8d57600080fd5b611d9988838901611d16565b90965094506020870135915080821115611db257600080fd5b50611dbf87828801611d16565b95989497509550505050565b600060208284031215611ddd57600080fd5b61183982611859565b60008060408385031215611df957600080fd5b611e0283611859565b91506020830135611e128161180e565b809150509250929050565b60008060408385031215611e3057600080fd5b82359150611e4060208401611859565b90509250929050565b60008060408385031215611e5c57600080fd5b611e6583611859565b9150611e4060208401611859565b600080600080600060a08688031215611e8b57600080fd5b611e9486611859565b9450611ea260208701611859565b93506040860135925060608601359150608086013567ffffffffffffffff811115611ecc57600080fd5b611bbb88828901611afe565b634e487b7160e01b600052601160045260246000fd5b8082018082111561093a5761093a611ed8565b600181811c90821680611f1557607f821691505b602082108103611f3557634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b600060018201611fb157611fb1611ed8565b5060010190565b601f821115610b2e57600081815260208120601f850160051c81016020861015611fdf5750805b601f850160051c820191505b8181101561115957828155600101611feb565b815167ffffffffffffffff811115612018576120186118d2565b61202c816120268454611f01565b84611fb8565b602080601f83116001811461206157600084156120495750858301515b600019600386901b1c1916600185901b178555611159565b600085815260208120601f198616915b8281101561209057888601518255948401946001909101908401612071565b50858210156120ae5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906120f8908301846119dd565b979650505050505050565b60006020828403121561211557600080fd5b81516118398161189f565b600060033d11156121395760046000803e5060005160e01c5b90565b600060443d101561214a5790565b6040516003193d81016004833e81513d67ffffffffffffffff816024840111818411171561217a57505050505090565b82850191508151818111156121925750505050505090565b843d87010160208285010111156121ac5750505050505090565b6121bb602082860101876118e8565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6040815260006122b06040830185611c93565b82810360208401526122c28185611c93565b95945050505050565b6001600160a01b0386811682528516602082015260a0604082018190526000906122f790830186611c93565b82810360608401526123098186611c93565b9050828103608084015261231d81856119dd565b9897505050505050505056fea264697066735822122031bcf3285eaa5510b0f63dfe1e2dd0000b5f1bec1dece61d26d4353eede6059264736f6c634300081100330000000000000000000000003350748459411d148e9c9e2cb3dcb3b4bdc509cb
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000003350748459411d148e9c9e2cb3dcb3b4bdc509cb
-----Decoded View---------------
Arg [0] : _bugs (address): 0x3350748459411d148e9c9e2cb3dcb3b4bdc509cb
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000003350748459411d148e9c9e2cb3dcb3b4bdc509cb
Deployed ByteCode Sourcemap
46243:3301:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47262:4;;;;;;;;;-1:-1:-1;;;;;47262:4:0;-1:-1:-1;;;;;47262:21:0;;:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;47258:357;;;47310:9;47323:16;47310:29;47302:57;;;;-1:-1:-1;;;47302:57:0;;589:2:1;47302:57:0;;;571:21:1;628:2;608:18;;;601:30;-1:-1:-1;;;647:18:1;;;640:45;702:18;;47302:57:0;;;;;;;;;47382:4;;-1:-1:-1;;;;;47382:4:0;:21;1278:10;47382:35;;-1:-1:-1;;;;;;47382:35:0;;;;;;;-1:-1:-1;;;;;895:32:1;;;47382:35:0;;;877:51:1;850:18;;47382:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;47374:72;;;;-1:-1:-1;;;47374:72:0;;1330:2:1;47374:72:0;;;1312:21:1;1369:2;1349:18;;;1342:30;-1:-1:-1;;;1388:18:1;;;1381:49;1447:18;;47374:72:0;1128:343:1;47374:72:0;47461:4;;-1:-1:-1;;;;;47461:4:0;:19;1278:10;47461:33;;-1:-1:-1;;;;;;47461:33:0;;;;;;;-1:-1:-1;;;;;895:32:1;;;47461:33:0;;;877:51:1;850:18;;47461:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;47509:4:0;;-1:-1:-1;;;;;47509:4:0;;-1:-1:-1;47509:9:0;;-1:-1:-1;1278:10:0;47509:50;;-1:-1:-1;;;;;;47509:50:0;;;;;;;-1:-1:-1;;;;;1733:32:1;;;47509:50:0;;;1715:51:1;47533:1:0;1782:18:1;;;1775:34;47536:22:0;1825:18:1;;;1818:34;1688:18;;47509:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47574:29;47580:12;1278:10;;1198:98;47580:12;47594:1;47597;47574:29;;;;;;;;;;;;:5;:29::i;:::-;46243:3301;;;;;24796:230;;;;;;;;;;-1:-1:-1;24796:230:0;;;;;:::i;:::-;;:::i;:::-;;;2446:25:1;;;2434:2;2419:18;24796:230:0;;;;;;;;23819:310;;;;;;;;;;-1:-1:-1;23819:310:0;;;;;:::i;:::-;;:::i;:::-;;;3033:14:1;;3026:22;3008:41;;2996:2;2981:18;23819:310:0;2868:187:1;49105:91:0;;;;;;;;;;-1:-1:-1;49105:91:0;;;;;:::i;:::-;;:::i;24540:105::-;;;;;;;;;;-1:-1:-1;24540:105:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48735:145::-;;;;;;;;;;-1:-1:-1;48735:145:0;;;;;:::i;:::-;;:::i;48612:115::-;;;;;;;;;;-1:-1:-1;48612:115:0;;;;;:::i;:::-;;:::i;26739:438::-;;;;;;;;;;-1:-1:-1;26739:438:0;;;;;:::i;:::-;;:::i;46466:25::-;;;;;;;;;;-1:-1:-1;46466:25:0;;;;-1:-1:-1;;;46466:25:0;;;;;;;;;7804:4:1;7792:17;;;7774:36;;7762:2;7747:18;46466:25:0;7632:184:1;25192:524:0;;;;;;;;;;-1:-1:-1;25192:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;47798:99::-;;;;;;;;;;;;;:::i;46727:39::-;;;;;;;;;;-1:-1:-1;46727:39:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;48088:233::-;;;;;;;;;;-1:-1:-1;48088:233:0;;;;;:::i;:::-;;:::i;46363:25::-;;;;;;;;;;-1:-1:-1;46363:25:0;;;;-1:-1:-1;;;;;46363:25:0;;;;;;-1:-1:-1;;;;;895:32:1;;;877:51;;865:2;850:18;46363:25:0;731:203:1;3268:103:0;;;;;;;;;;;;;:::i;2620:87::-;;;;;;;;;;-1:-1:-1;2693:6:0;;-1:-1:-1;;;;;2693:6:0;2620:87;;45207:44;;;;;;;;;;-1:-1:-1;45207:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;25789:155;;;;;;;;;;-1:-1:-1;25789:155:0;;;;;:::i;:::-;;:::i;48888:209::-;;;;;;;;;;-1:-1:-1;48888:209:0;;;;;:::i;:::-;;:::i;46851:70::-;;;;;;;;;;-1:-1:-1;46851:70:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;49353:188;;;;;;:::i;:::-;;:::i;26016:168::-;;;;;;;;;;-1:-1:-1;26016:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;26139:27:0;;;26115:4;26139:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;26016:168;45408:150;;;;;;;;;;-1:-1:-1;45408:150:0;;;;;:::i;:::-;;:::i;26256:406::-;;;;;;;;;;-1:-1:-1;26256:406:0;;;;;:::i;:::-;;:::i;3526:201::-;;;;;;;;;;-1:-1:-1;3526:201:0;;;;;:::i;:::-;;:::i;31437:729::-;-1:-1:-1;;;;;31590:16:0;;31582:62;;;;-1:-1:-1;;;31582:62:0;;13356:2:1;31582:62:0;;;13338:21:1;13395:2;13375:18;;;13368:30;13434:34;13414:18;;;13407:62;-1:-1:-1;;;13485:18:1;;;13478:31;13526:19;;31582:62:0;13154:397:1;31582:62:0;1278:10;31657:16;31722:21;31740:2;31722:17;:21::i;:::-;31699:44;;31754:24;31781:25;31799:6;31781:17;:25::i;:::-;31754:52;;31898:9;:13;;;;;;;;;;;-1:-1:-1;;;;;31898:17:0;;;;;;;;;:27;;31919:6;;31898:9;:27;;31919:6;;31898:27;:::i;:::-;;;;-1:-1:-1;;31941:52:0;;;13992:25:1;;;14048:2;14033:18;;14026:34;;;-1:-1:-1;;;;;31941:52:0;;;;31974:1;;31941:52;;;;;;13965:18:1;31941:52:0;;;;;;;32084:74;32115:8;32133:1;32137:2;32141;32145:6;32153:4;32084:30;:74::i;:::-;31571:595;;;31437:729;;;;:::o;24796:230::-;24882:7;-1:-1:-1;;;;;24910:21:0;;24902:76;;;;-1:-1:-1;;;24902:76:0;;14273:2:1;24902:76:0;;;14255:21:1;14312:2;14292:18;;;14285:30;14351:34;14331:18;;;14324:62;-1:-1:-1;;;14402:18:1;;;14395:40;14452:19;;24902:76:0;14071:406:1;24902:76:0;-1:-1:-1;24996:9:0;:13;;;;;;;;;;;-1:-1:-1;;;;;24996:22:0;;;;;;;;;;24796:230;;;;;:::o;23819:310::-;23921:4;-1:-1:-1;;;;;;23958:41:0;;-1:-1:-1;;;23958:41:0;;:110;;-1:-1:-1;;;;;;;24016:52:0;;-1:-1:-1;;;24016:52:0;23958:110;:163;;;-1:-1:-1;;;;;;;;;;22709:40:0;;;24085:36;22600:157;49105:91;2506:13;:11;:13::i;:::-;49173:15:::1;49181:6;49173:7;:15::i;:::-;49105:91:::0;:::o;24540:105::-;24600:13;24633:4;24626:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24540:105;;;:::o;48735:145::-;1278:10;45298:26;;;;:12;:26;;;;;;;;:34;;:26;:34;45290:66;;;;-1:-1:-1;;;45290:66:0;;15069:2:1;45290:66:0;;;15051:21:1;15108:2;15088:18;;;15081:30;-1:-1:-1;;;15127:18:1;;;15120:49;15186:18;;45290:66:0;14867:343:1;45290:66:0;48835:19:::1;::::0;;;:15:::1;:19;::::0;;;;;;;-1:-1:-1;;;;;48835:28:0;;::::1;::::0;;;;;;;;:37;48735:145::o;48612:115::-;1278:10;45298:26;;;;:12;:26;;;;;;;;:34;;:26;:34;45290:66;;;;-1:-1:-1;;;45290:66:0;;15069:2:1;45290:66:0;;;15051:21:1;15108:2;15088:18;;;15081:30;-1:-1:-1;;;15127:18:1;;;15120:49;15186:18;;45290:66:0;14867:343:1;45290:66:0;48694:25:::1;48700:2;48704;48708:6;48694:25;;;;;;;;;;;::::0;:5:::1;:25::i;:::-;48612:115:::0;;;:::o;26739:438::-;-1:-1:-1;;;;;26972:20:0;;1278:10;26972:20;;:60;;-1:-1:-1;26996:36:0;27013:4;1278:10;26016:168;:::i;26996:36::-;26950:156;;;;-1:-1:-1;;;26950:156:0;;;;;;;:::i;:::-;27117:52;27140:4;27146:2;27150:3;27155:7;27164:4;27117:22;:52::i;:::-;26739:438;;;;;:::o;25192:524::-;25348:16;25409:3;:10;25390:8;:15;:29;25382:83;;;;-1:-1:-1;;;25382:83:0;;15832:2:1;25382:83:0;;;15814:21:1;15871:2;15851:18;;;15844:30;15910:34;15890:18;;;15883:62;-1:-1:-1;;;15961:18:1;;;15954:39;16010:19;;25382:83:0;15630:405:1;25382:83:0;25478:30;25525:8;:15;25511:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25511:30:0;;25478:63;;25559:9;25554:122;25578:8;:15;25574:1;:19;25554:122;;;25634:30;25644:8;25653:1;25644:11;;;;;;;;:::i;:::-;;;;;;;25657:3;25661:1;25657:6;;;;;;;;:::i;:::-;;;;;;;25634:9;:30::i;:::-;25615:13;25629:1;25615:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;25595:3;;;:::i;:::-;;;25554:122;;;-1:-1:-1;25695:13:0;25192:524;-1:-1:-1;;;25192:524:0:o;47798:99::-;47842:7;47869:20;:10;41260:14;;41168:114;47869:20;47862:27;;47798:99;:::o;46727:39::-;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48088:233::-;2506:13;:11;:13::i;:::-;48203:10:::1;48216:20;:10;41260:14:::0;;41168:114;48216:20:::1;48203:33;;48260:20;;;;;;;;48266:2;48260:20;;;;48270:4;;48260:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;;48260:20:0;;;-1:-1:-1;48260:20:0::1;::::0;;::::1;;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;;;;::::1;::::0;;48276:3;;;;;;48260:20;::::1;48276:3:::0;;;;48260:20;::::1;;::::0;::::1;::::0;;;-1:-1:-1;48260:20:0;;;;-1:-1:-1;;48247:10:0;;;:6:::1;:10;::::0;;;;;;;:33;;;;;;::::1;::::0;:10;;-1:-1:-1;48247:33:0::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;48247:33:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;48291:10:0::1;41379:19:::0;;41397:1;41379:19;;;-1:-1:-1;48291:22:0::1;41290:127:::0;3268:103;2506:13;:11;:13::i;:::-;3333:30:::1;3360:1;3333:18;:30::i;:::-;3268:103::o:0;25789:155::-;25884:52;1278:10;25917:8;25927;25884:18;:52::i;:::-;25789:155;;:::o;48888:209::-;48940:14;48957:19;;;:15;:19;;;;;;;;1278:10;48957:33;;;;;;;;49009:10;49001:43;;;;-1:-1:-1;;;49001:43:0;;18718:2:1;49001:43:0;;;18700:21:1;18757:2;18737:18;;;18730:30;-1:-1:-1;;;18776:18:1;;;18769:50;18836:18;;49001:43:0;18516:344:1;49001:43:0;49055:34;1278:10;49075:1;49078:6;49055:34;;;;;;;;;;;;:5;:34::i;49353:188::-;2506:13;:11;:13::i;:::-;49428:12:::1;49454:7;2693:6:::0;;-1:-1:-1;;;;;2693:6:0;;2620:87;49454:7:::1;-1:-1:-1::0;;;;;49446:21:0::1;49475:6;49446:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49427:59;;;49505:7;49497:36;;;::::0;-1:-1:-1;;;49497:36:0;;19277:2:1;49497:36:0::1;::::0;::::1;19259:21:1::0;19316:2;19296:18;;;19289:30;-1:-1:-1;;;19335:18:1;;;19328:46;19391:18;;49497:36:0::1;19075:340:1::0;45408:150:0;2506:13;:11;:13::i;:::-;-1:-1:-1;;;;;45517:21:0;;;::::1;;::::0;;;:12:::1;:21;::::0;;;;:33;;-1:-1:-1;;45517:33:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45408:150::o;26256:406::-;-1:-1:-1;;;;;26464:20:0;;1278:10;26464:20;;:60;;-1:-1:-1;26488:36:0;26505:4;1278:10;26016:168;:::i;26488:36::-;26442:156;;;;-1:-1:-1;;;26442:156:0;;;;;;;:::i;:::-;26609:45;26627:4;26633:2;26637;26641:6;26649:4;26609:17;:45::i;3526:201::-;2506:13;:11;:13::i;:::-;-1:-1:-1;;;;;3615:22:0;::::1;3607:73;;;::::0;-1:-1:-1;;;3607:73:0;;19622:2:1;3607:73:0::1;::::0;::::1;19604:21:1::0;19661:2;19641:18;;;19634:30;19700:34;19680:18;;;19673:62;-1:-1:-1;;;19751:18:1;;;19744:36;19797:19;;3607:73:0::1;19420:402:1::0;3607:73:0::1;3691:28;3710:8;3691:18;:28::i;40116:198::-:0;40236:16;;;40250:1;40236:16;;;;;;;;;40182;;40211:22;;40236:16;;;;;;;;;;;;-1:-1:-1;40236:16:0;40211:41;;40274:7;40263:5;40269:1;40263:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;40301:5;40116:198;-1:-1:-1;;40116:198:0:o;37139:221::-;;;;;;;:::o;38543:744::-;-1:-1:-1;;;;;38758:13:0;;13862:19;:23;38754:526;;38794:72;;-1:-1:-1;;;38794:72:0;;-1:-1:-1;;;;;38794:38:0;;;;;:72;;38833:8;;38843:4;;38849:2;;38853:6;;38861:4;;38794:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38794:72:0;;;;;;;;-1:-1:-1;;38794:72:0;;;;;;;;;;;;:::i;:::-;;;38790:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;39142:6;39135:14;;-1:-1:-1;;;39135:14:0;;;;;;;;:::i;38790:479::-;;;39191:62;;-1:-1:-1;;;39191:62:0;;21709:2:1;39191: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;;39191:62:0;21507:416:1;38790:479:0;-1:-1:-1;;;;;;38916:55:0;;-1:-1:-1;;;38916:55:0;38912:154;;38996:50;;-1:-1:-1;;;38996:50:0;;;;;;;:::i;2785:132::-;2693:6;;-1:-1:-1;;;;;2693:6:0;1278:10;2849:23;2841:68;;;;-1:-1:-1;;;2841:68:0;;22539:2:1;2841:68:0;;;22521:21:1;;;22558:18;;;22551:30;22617:34;22597:18;;;22590:62;22669:18;;2841:68:0;22337:356:1;30963:88:0;31030:4;:13;31037:6;31030:4;:13;:::i;28973:1146::-;29200:7;:14;29186:3;:10;:28;29178:81;;;;-1:-1:-1;;;29178:81:0;;22900:2:1;29178:81:0;;;22882:21:1;22939:2;22919:18;;;22912:30;22978:34;22958:18;;;22951:62;-1:-1:-1;;;23029:18:1;;;23022:38;23077:19;;29178:81:0;22698:404:1;29178:81:0;-1:-1:-1;;;;;29278:16:0;;29270:66;;;;-1:-1:-1;;;29270:66:0;;;;;;;:::i;:::-;1278:10;29349:16;29466:421;29490:3;:10;29486:1;:14;29466:421;;;29522:10;29535:3;29539:1;29535:6;;;;;;;;:::i;:::-;;;;;;;29522:19;;29556:14;29573:7;29581:1;29573:10;;;;;;;;:::i;:::-;;;;;;;;;;;;29600:19;29622:13;;;;;;;;;;-1:-1:-1;;;;;29622:19:0;;;;;;;;;;;;29573:10;;-1:-1:-1;29664:21:0;;;;29656:76;;;;-1:-1:-1;;;29656:76:0;;;;;;;:::i;:::-;29776:9;:13;;;;;;;;;;;-1:-1:-1;;;;;29776:19:0;;;;;;;;;;29798:20;;;29776:42;;29848:17;;;;;;;:27;;29798:20;;29776:9;29848:27;;29798:20;;29848:27;:::i;:::-;;;;;;;;29507:380;;;29502:3;;;;:::i;:::-;;;29466:421;;;;29934:2;-1:-1:-1;;;;;29904:47:0;29928:4;-1:-1:-1;;;;;29904:47:0;29918:8;-1:-1:-1;;;;;29904:47:0;;29938:3;29943:7;29904:47;;;;;;;:::i;:::-;;;;;;;;30036:75;30072:8;30082:4;30088:2;30092:3;30097:7;30106:4;30036:35;:75::i;3887:191::-;3980:6;;;-1:-1:-1;;;;;3997:17:0;;;-1:-1:-1;;;;;;3997:17:0;;;;;;;4030:40;;3980:6;;;3997:17;3980:6;;4030:40;;3961:16;;4030:40;3950:128;3887:191;:::o;35850:331::-;36005:8;-1:-1:-1;;;;;35996:17:0;:5;-1:-1:-1;;;;;35996:17:0;;35988:71;;;;-1:-1:-1;;;35988:71:0;;24596:2:1;35988:71:0;;;24578:21:1;24635:2;24615:18;;;24608:30;24674:34;24654:18;;;24647:62;-1:-1:-1;;;24725:18:1;;;24718:39;24774:19;;35988:71:0;24394:405:1;35988:71:0;-1:-1:-1;;;;;36070:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;36070:46:0;;;;;;;;;;36132:41;;3008::1;;;36132::0;;2981:18:1;36132:41:0;;;;;;;35850:331;;;:::o;27641:974::-;-1:-1:-1;;;;;27829:16:0;;27821:66;;;;-1:-1:-1;;;27821:66:0;;;;;;;:::i;:::-;1278:10;27900:16;27965:21;27983:2;27965:17;:21::i;:::-;27942:44;;27997:24;28024:25;28042:6;28024:17;:25::i;:::-;27997:52;;28135:19;28157:13;;;;;;;;;;;-1:-1:-1;;;;;28157:19:0;;;;;;;;;;28195:21;;;;28187:76;;;;-1:-1:-1;;;28187:76:0;;;;;;;:::i;:::-;28299:9;:13;;;;;;;;;;;-1:-1:-1;;;;;28299:19:0;;;;;;;;;;28321:20;;;28299:42;;28363:17;;;;;;;:27;;28321:20;;28299:9;28363:27;;28321:20;;28363:27;:::i;:::-;;;;-1:-1:-1;;28408:46:0;;;13992:25:1;;;14048:2;14033:18;;14026:34;;;-1:-1:-1;;;;;28408:46:0;;;;;;;;;;;;;;13965:18:1;28408:46:0;;;;;;;28539:68;28570:8;28580:4;28586:2;28590;28594:6;28602:4;28539:30;:68::i;:::-;27810:805;;;;27641:974;;;;;:::o;39295:813::-;-1:-1:-1;;;;;39535:13:0;;13862:19;:23;39531:570;;39571:79;;-1:-1:-1;;;39571:79:0;;-1:-1:-1;;;;;39571:43:0;;;;;:79;;39615:8;;39625:4;;39631:3;;39636:7;;39645:4;;39571:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39571:79:0;;;;;;;;-1:-1:-1;;39571:79:0;;;;;;;;;;;;:::i;:::-;;;39567:523;;;;:::i;:::-;-1:-1:-1;;;;;;39732:60:0;;-1:-1:-1;;;39732:60:0;39728:159;;39817:50;;-1:-1:-1;;;39817:50:0;;;;;;;:::i;14:118:1:-;100:5;93:13;86:21;79:5;76:32;66:60;;122:1;119;112:12;137:245;204:6;257:2;245:9;236:7;232:23;228:32;225:52;;;273:1;270;263:12;225:52;305:9;299:16;324:28;346:5;324:28;:::i;:::-;371:5;137:245;-1:-1:-1;;;137:245:1:o;939:184::-;1009:6;1062:2;1050:9;1041:7;1037:23;1033:32;1030:52;;;1078:1;1075;1068:12;1030:52;-1:-1:-1;1101:16:1;;939:184;-1:-1:-1;939:184:1:o;1863:173::-;1931:20;;-1:-1:-1;;;;;1980:31:1;;1970:42;;1960:70;;2026:1;2023;2016:12;1960:70;1863:173;;;:::o;2041:254::-;2109:6;2117;2170:2;2158:9;2149:7;2145:23;2141:32;2138:52;;;2186:1;2183;2176:12;2138:52;2209:29;2228:9;2209:29;:::i;:::-;2199:39;2285:2;2270:18;;;;2257:32;;-1:-1:-1;;;2041:254:1:o;2482:131::-;-1:-1:-1;;;;;;2556:32:1;;2546:43;;2536:71;;2603:1;2600;2593:12;2618:245;2676:6;2729:2;2717:9;2708:7;2704:23;2700:32;2697:52;;;2745:1;2742;2735:12;2697:52;2784:9;2771:23;2803:30;2827:5;2803:30;:::i;3060:127::-;3121:10;3116:3;3112:20;3109:1;3102:31;3152:4;3149:1;3142:15;3176:4;3173:1;3166:15;3192:249;3302:2;3283:13;;-1:-1:-1;;3279:27:1;3267:40;;3337:18;3322:34;;3358:22;;;3319:62;3316:88;;;3384:18;;:::i;:::-;3420:2;3413:22;-1:-1:-1;;3192:249:1:o;3446:469::-;3511:5;3545:18;3537:6;3534:30;3531:56;;;3567:18;;:::i;:::-;3616:2;3610:9;3628:69;3685:2;3664:15;;-1:-1:-1;;3660:29:1;3691:4;3656:40;3610:9;3628:69;:::i;:::-;3715:6;3706:15;;3745:6;3737;3730:22;3785:3;3776:6;3771:3;3767:16;3764:25;3761:45;;;3802:1;3799;3792:12;3761:45;3852:6;3847:3;3840:4;3832:6;3828:17;3815:44;3907:1;3900:4;3891:6;3883;3879:19;3875:30;3868:41;;3446:469;;;;;:::o;3920:451::-;3989:6;4042:2;4030:9;4021:7;4017:23;4013:32;4010:52;;;4058:1;4055;4048:12;4010:52;4098:9;4085:23;4131:18;4123:6;4120:30;4117:50;;;4163:1;4160;4153:12;4117:50;4186:22;;4239:4;4231:13;;4227:27;-1:-1:-1;4217:55:1;;4268:1;4265;4258:12;4217:55;4291:74;4357:7;4352:2;4339:16;4334:2;4330;4326:11;4291:74;:::i;:::-;4281:84;3920:451;-1:-1:-1;;;;3920:451:1:o;4376:180::-;4435:6;4488:2;4476:9;4467:7;4463:23;4459:32;4456:52;;;4504:1;4501;4494:12;4456:52;-1:-1:-1;4527:23:1;;4376:180;-1:-1:-1;4376:180:1:o;4561:423::-;4603:3;4641:5;4635:12;4668:6;4663:3;4656:19;4693:1;4703:162;4717:6;4714:1;4711:13;4703:162;;;4779:4;4835:13;;;4831:22;;4825:29;4807:11;;;4803:20;;4796:59;4732:12;4703:162;;;4707:3;4910:1;4903:4;4894:6;4889:3;4885:16;4881:27;4874:38;4973:4;4966:2;4962:7;4957:2;4949:6;4945:15;4941:29;4936:3;4932:39;4928:50;4921:57;;;4561:423;;;;:::o;4989:220::-;5138:2;5127:9;5120:21;5101:4;5158:45;5199:2;5188:9;5184:18;5176:6;5158:45;:::i;5214:322::-;5291:6;5299;5307;5360:2;5348:9;5339:7;5335:23;5331:32;5328:52;;;5376:1;5373;5366:12;5328:52;5399:29;5418:9;5399:29;:::i;:::-;5389:39;5475:2;5460:18;;5447:32;;-1:-1:-1;5526:2:1;5511:18;;;5498:32;;5214:322;-1:-1:-1;;;5214:322:1:o;5541:183::-;5601:4;5634:18;5626:6;5623:30;5620:56;;;5656:18;;:::i;:::-;-1:-1:-1;5701:1:1;5697:14;5713:4;5693:25;;5541:183::o;5729:724::-;5783:5;5836:3;5829:4;5821:6;5817:17;5813:27;5803:55;;5854:1;5851;5844:12;5803:55;5890:6;5877:20;5916:4;5939:43;5979:2;5939:43;:::i;:::-;6011:2;6005:9;6023:31;6051:2;6043:6;6023:31;:::i;:::-;6089:18;;;6181:1;6177:10;;;;6165:23;;6161:32;;;6123:15;;;;-1:-1:-1;6205:15:1;;;6202:35;;;6233:1;6230;6223:12;6202:35;6269:2;6261:6;6257:15;6281:142;6297:6;6292:3;6289:15;6281:142;;;6363:17;;6351:30;;6401:12;;;;6314;;6281:142;;;-1:-1:-1;6441:6:1;5729:724;-1:-1:-1;;;;;;5729:724:1:o;6458:221::-;6500:5;6553:3;6546:4;6538:6;6534:17;6530:27;6520:55;;6571:1;6568;6561:12;6520:55;6593:80;6669:3;6660:6;6647:20;6640:4;6632:6;6628:17;6593:80;:::i;6684:943::-;6838:6;6846;6854;6862;6870;6923:3;6911:9;6902:7;6898:23;6894:33;6891:53;;;6940:1;6937;6930:12;6891:53;6963:29;6982:9;6963:29;:::i;:::-;6953:39;;7011:38;7045:2;7034:9;7030:18;7011:38;:::i;:::-;7001:48;;7100:2;7089:9;7085:18;7072:32;7123:18;7164:2;7156:6;7153:14;7150:34;;;7180:1;7177;7170:12;7150:34;7203:61;7256:7;7247:6;7236:9;7232:22;7203:61;:::i;:::-;7193:71;;7317:2;7306:9;7302:18;7289:32;7273:48;;7346:2;7336:8;7333:16;7330:36;;;7362:1;7359;7352:12;7330:36;7385:63;7440:7;7429:8;7418:9;7414:24;7385:63;:::i;:::-;7375:73;;7501:3;7490:9;7486:19;7473:33;7457:49;;7531:2;7521:8;7518:16;7515:36;;;7547:1;7544;7537:12;7515:36;;7570:51;7613:7;7602:8;7591:9;7587:24;7570:51;:::i;:::-;7560:61;;;6684:943;;;;;;;;:::o;7821:1208::-;7939:6;7947;8000:2;7988:9;7979:7;7975:23;7971:32;7968:52;;;8016:1;8013;8006:12;7968:52;8056:9;8043:23;8085:18;8126:2;8118:6;8115:14;8112:34;;;8142:1;8139;8132:12;8112:34;8180:6;8169:9;8165:22;8155:32;;8225:7;8218:4;8214:2;8210:13;8206:27;8196:55;;8247:1;8244;8237:12;8196:55;8283:2;8270:16;8305:4;8328:43;8368:2;8328:43;:::i;:::-;8400:2;8394:9;8412:31;8440:2;8432:6;8412:31;:::i;:::-;8478:18;;;8566:1;8562:10;;;;8554:19;;8550:28;;;8512:15;;;;-1:-1:-1;8590:19:1;;;8587:39;;;8622:1;8619;8612:12;8587:39;8646:11;;;;8666:148;8682:6;8677:3;8674:15;8666:148;;;8748:23;8767:3;8748:23;:::i;:::-;8736:36;;8699:12;;;;8792;;;;8666:148;;;8833:6;-1:-1:-1;;8877:18:1;;8864:32;;-1:-1:-1;;8908:16:1;;;8905:36;;;8937:1;8934;8927:12;8905:36;;8960:63;9015:7;9004:8;8993:9;8989:24;8960:63;:::i;:::-;8950:73;;;7821:1208;;;;;:::o;9034:435::-;9087:3;9125:5;9119:12;9152:6;9147:3;9140:19;9178:4;9207:2;9202:3;9198:12;9191:19;;9244:2;9237:5;9233:14;9265:1;9275:169;9289:6;9286:1;9283:13;9275:169;;;9350:13;;9338:26;;9384:12;;;;9419:15;;;;9311:1;9304:9;9275:169;;;-1:-1:-1;9460:3:1;;9034:435;-1:-1:-1;;;;;9034:435:1:o;9474:261::-;9653:2;9642:9;9635:21;9616:4;9673:56;9725:2;9714:9;9710:18;9702:6;9673:56;:::i;9740:454::-;9965:6;9954:9;9947:25;10008:2;10003;9992:9;9988:18;9981:30;9928:4;10034:45;10075:2;10064:9;10060:18;10052:6;10034:45;:::i;:::-;10127:9;10119:6;10115:22;10110:2;10099:9;10095:18;10088:50;10155:33;10181:6;10173;10155:33;:::i;:::-;10147:41;9740:454;-1:-1:-1;;;;;;9740:454:1:o;10199:348::-;10251:8;10261:6;10315:3;10308:4;10300:6;10296:17;10292:27;10282:55;;10333:1;10330;10323:12;10282:55;-1:-1:-1;10356:20:1;;10399:18;10388:30;;10385:50;;;10431:1;10428;10421:12;10385:50;10468:4;10460:6;10456:17;10444:29;;10520:3;10513:4;10504:6;10496;10492:19;10488:30;10485:39;10482:59;;;10537:1;10534;10527:12;10482:59;10199:348;;;;;:::o;10552:721::-;10644:6;10652;10660;10668;10721:2;10709:9;10700:7;10696:23;10692:32;10689:52;;;10737:1;10734;10727:12;10689:52;10777:9;10764:23;10806:18;10847:2;10839:6;10836:14;10833:34;;;10863:1;10860;10853:12;10833:34;10902:59;10953:7;10944:6;10933:9;10929:22;10902:59;:::i;:::-;10980:8;;-1:-1:-1;10876:85:1;-1:-1:-1;11068:2:1;11053:18;;11040:32;;-1:-1:-1;11084:16:1;;;11081:36;;;11113:1;11110;11103:12;11081:36;;11152:61;11205:7;11194:8;11183:9;11179:24;11152:61;:::i;:::-;10552:721;;;;-1:-1:-1;11232:8:1;-1:-1:-1;;;;10552:721:1:o;11508:186::-;11567:6;11620:2;11608:9;11599:7;11595:23;11591:32;11588:52;;;11636:1;11633;11626:12;11588:52;11659:29;11678:9;11659:29;:::i;11699:315::-;11764:6;11772;11825:2;11813:9;11804:7;11800:23;11796:32;11793:52;;;11841:1;11838;11831:12;11793:52;11864:29;11883:9;11864:29;:::i;:::-;11854:39;;11943:2;11932:9;11928:18;11915:32;11956:28;11978:5;11956:28;:::i;:::-;12003:5;11993:15;;;11699:315;;;;;:::o;12019:254::-;12087:6;12095;12148:2;12136:9;12127:7;12123:23;12119:32;12116:52;;;12164:1;12161;12154:12;12116:52;12200:9;12187:23;12177:33;;12229:38;12263:2;12252:9;12248:18;12229:38;:::i;:::-;12219:48;;12019:254;;;;;:::o;12278:260::-;12346:6;12354;12407:2;12395:9;12386:7;12382:23;12378:32;12375:52;;;12423:1;12420;12413:12;12375:52;12446:29;12465:9;12446:29;:::i;:::-;12436:39;;12494:38;12528:2;12517:9;12513:18;12494:38;:::i;12543:606::-;12647:6;12655;12663;12671;12679;12732:3;12720:9;12711:7;12707:23;12703:33;12700:53;;;12749:1;12746;12739:12;12700:53;12772:29;12791:9;12772:29;:::i;:::-;12762:39;;12820:38;12854:2;12843:9;12839:18;12820:38;:::i;:::-;12810:48;;12905:2;12894:9;12890:18;12877:32;12867:42;;12956:2;12945:9;12941:18;12928:32;12918:42;;13011:3;13000:9;12996:19;12983:33;13039:18;13031:6;13028:30;13025:50;;;13071:1;13068;13061:12;13025:50;13094:49;13135:7;13126:6;13115:9;13111:22;13094:49;:::i;13556:127::-;13617:10;13612:3;13608:20;13605:1;13598:31;13648:4;13645:1;13638:15;13672:4;13669:1;13662:15;13688:125;13753:9;;;13774:10;;;13771:36;;;13787:18;;:::i;14482:380::-;14561:1;14557:12;;;;14604;;;14625:61;;14679:4;14671:6;14667:17;14657:27;;14625:61;14732:2;14724:6;14721:14;14701:18;14698:38;14695:161;;14778:10;14773:3;14769:20;14766:1;14759:31;14813:4;14810:1;14803:15;14841:4;14838:1;14831:15;14695:161;;14482:380;;;:::o;15215:410::-;15417:2;15399:21;;;15456:2;15436:18;;;15429:30;15495:34;15490:2;15475:18;;15468:62;-1:-1:-1;;;15561:2:1;15546:18;;15539:44;15615:3;15600:19;;15215:410::o;16040:127::-;16101:10;16096:3;16092:20;16089:1;16082:31;16132:4;16129:1;16122:15;16156:4;16153:1;16146:15;16172:135;16211:3;16232:17;;;16229:43;;16252:18;;:::i;:::-;-1:-1:-1;16299:1:1;16288:13;;16172:135::o;16438:545::-;16540:2;16535:3;16532:11;16529:448;;;16576:1;16601:5;16597:2;16590:17;16646:4;16642:2;16632:19;16716:2;16704:10;16700:19;16697:1;16693:27;16687:4;16683:38;16752:4;16740:10;16737:20;16734:47;;;-1:-1:-1;16775:4:1;16734:47;16830:2;16825:3;16821:12;16818:1;16814:20;16808:4;16804:31;16794:41;;16885:82;16903:2;16896:5;16893:13;16885:82;;;16948:17;;;16929:1;16918:13;16885:82;;17159:1352;17285:3;17279:10;17312:18;17304:6;17301:30;17298:56;;;17334:18;;:::i;:::-;17363:97;17453:6;17413:38;17445:4;17439:11;17413:38;:::i;:::-;17407:4;17363:97;:::i;:::-;17515:4;;17579:2;17568:14;;17596:1;17591:663;;;;18298:1;18315:6;18312:89;;;-1:-1:-1;18367:19:1;;;18361:26;18312:89;-1:-1:-1;;17116:1:1;17112:11;;;17108:24;17104:29;17094:40;17140:1;17136:11;;;17091:57;18414:81;;17561:944;;17591:663;16385:1;16378:14;;;16422:4;16409:18;;-1:-1:-1;;17627:20:1;;;17745:236;17759:7;17756:1;17753:14;17745:236;;;17848:19;;;17842:26;17827:42;;17940:27;;;;17908:1;17896:14;;;;17775:19;;17745:236;;;17749:3;18009:6;18000:7;17997:19;17994:201;;;18070:19;;;18064:26;-1:-1:-1;;18153:1:1;18149:14;;;18165:3;18145:24;18141:37;18137:42;18122:58;18107:74;;17994:201;-1:-1:-1;;;;;18241:1:1;18225:14;;;18221:22;18208:36;;-1:-1:-1;17159:1352:1:o;19827:561::-;-1:-1:-1;;;;;20124:15:1;;;20106:34;;20176:15;;20171:2;20156:18;;20149:43;20223:2;20208:18;;20201:34;;;20266:2;20251:18;;20244:34;;;20086:3;20309;20294:19;;20287:32;;;20049:4;;20336:46;;20362:19;;20354:6;20336:46;:::i;:::-;20328:54;19827:561;-1:-1:-1;;;;;;;19827:561: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;23107:401::-;23309:2;23291:21;;;23348:2;23328:18;;;23321:30;23387:34;23382:2;23367:18;;23360:62;-1:-1:-1;;;23453:2:1;23438:18;;23431:35;23498:3;23483:19;;23107:401::o;23513:406::-;23715:2;23697:21;;;23754:2;23734:18;;;23727:30;23793:34;23788:2;23773:18;;23766:62;-1:-1:-1;;;23859:2:1;23844:18;;23837:40;23909:3;23894:19;;23513:406::o;23924:465::-;24181:2;24170:9;24163:21;24144:4;24207:56;24259:2;24248:9;24244:18;24236:6;24207:56;:::i;:::-;24311:9;24303:6;24299:22;24294:2;24283:9;24279:18;24272:50;24339:44;24376:6;24368;24339:44;:::i;:::-;24331:52;23924:465;-1:-1:-1;;;;;23924:465:1:o;24804:827::-;-1:-1:-1;;;;;25201:15:1;;;25183:34;;25253:15;;25248:2;25233:18;;25226:43;25163:3;25300:2;25285:18;;25278:31;;;25126:4;;25332:57;;25369:19;;25361:6;25332:57;:::i;:::-;25437:9;25429:6;25425:22;25420:2;25409:9;25405:18;25398:50;25471:44;25508:6;25500;25471:44;:::i;:::-;25457:58;;25564:9;25556:6;25552:22;25546:3;25535:9;25531:19;25524:51;25592:33;25618:6;25610;25592:33;:::i;:::-;25584:41;24804:827;-1:-1:-1;;;;;;;;24804:827:1:o
Metadata Hash
ipfs://31bcf3285eaa5510b0f63dfe1e2dd0000b5f1bec1dece61d26d4353eede60592