Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0x60a06040 | 15823892 | 629 days ago | IN | Create: OKXBadge | 0 ETH | 0.02555089 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
OKXBadge
Compiler Version
v0.8.12+commit.f00d7308
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-10-26 */ /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library AddressUpgradeable { /** * @dev Returns true if `account` is a contract. * * [////IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * ////IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol) pragma solidity ^0.8.2; ////import "../../utils/AddressUpgradeable.sol"; /** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ``` * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */ abstract contract Initializable { /** * @dev Indicates that the contract has been initialized. * @custom:oz-retyped-from bool */ uint8 private _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool private _initializing; /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint8 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`. */ modifier initializer() { bool isTopLevelCall = !_initializing; require( (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1), "Initializable: contract is already initialized" ); _initialized = 1; if (isTopLevelCall) { _initializing = true; } _; if (isTopLevelCall) { _initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original * initialization step. This is essential to configure modules that are added through upgrades and that require * initialization. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. */ modifier reinitializer(uint8 version) { require(!_initializing && _initialized < version, "Initializable: contract is already initialized"); _initialized = version; _initializing = true; _; _initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { require(_initializing, "Initializable: contract is not initializing"); _; } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. */ function _disableInitializers() internal virtual { require(!_initializing, "Initializable: contract is initializing"); if (_initialized < type(uint8).max) { _initialized = type(uint8).max; emit Initialized(type(uint8).max); } } } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165Upgradeable { /** * @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); } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol) pragma solidity ^0.8.0; ////import "../../utils/introspection/IERC165Upgradeable.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 IERC1155Upgradeable is IERC165Upgradeable { /** * @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; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; ////import "./IERC165Upgradeable.sol"; ////import "../../proxy/utils/Initializable.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 ERC165Upgradeable is Initializable, IERC165Upgradeable { function __ERC165_init() internal onlyInitializing { } function __ERC165_init_unchained() internal onlyInitializing { } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165Upgradeable).interfaceId; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; ////import "../proxy/utils/Initializable.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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol) pragma solidity ^0.8.0; ////import "../IERC1155Upgradeable.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 IERC1155MetadataURIUpgradeable is IERC1155Upgradeable { /** * @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); } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol) pragma solidity ^0.8.0; ////import "../../utils/introspection/IERC165Upgradeable.sol"; /** * @dev _Available since v3.1._ */ interface IERC1155ReceiverUpgradeable is IERC165Upgradeable { /** * @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); } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol) pragma solidity ^0.8.0; ////import "./IERC1155Upgradeable.sol"; ////import "./IERC1155ReceiverUpgradeable.sol"; ////import "./extensions/IERC1155MetadataURIUpgradeable.sol"; ////import "../../utils/AddressUpgradeable.sol"; ////import "../../utils/ContextUpgradeable.sol"; ////import "../../utils/introspection/ERC165Upgradeable.sol"; ////import "../../proxy/utils/Initializable.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 ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable { using AddressUpgradeable 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}. */ function __ERC1155_init(string memory uri_) internal onlyInitializing { __ERC1155_init_unchained(uri_); } function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing { _setURI(uri_); } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) { return interfaceId == type(IERC1155Upgradeable).interfaceId || interfaceId == type(IERC1155MetadataURIUpgradeable).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 nor approved" ); _safeTransferFrom(from, to, id, amount, data); } /** * @dev See {IERC1155-safeBatchTransferFrom}. */ function safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) public virtual override { require( from == _msgSender() || isApprovedForAll(from, _msgSender()), "ERC1155: caller is not token owner nor approved" ); _safeBatchTransferFrom(from, to, ids, amounts, data); } /** * @dev Transfers `amount` tokens of token type `id` from `from` to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - `from` must have a balance of tokens of type `id` of at least `amount`. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _safeTransferFrom( address from, address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, from, to, ids, amounts, data); uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; emit TransferSingle(operator, from, to, id, amount); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}. * * Emits a {TransferBatch} event. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the * acceptance magic value. */ function _safeBatchTransferFrom( address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data ) internal virtual { require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch"); require(to != address(0), "ERC1155: transfer to the zero address"); address operator = _msgSender(); _beforeTokenTransfer(operator, from, to, ids, amounts, data); for (uint256 i = 0; i < ids.length; ++i) { uint256 id = ids[i]; uint256 amount = amounts[i]; uint256 fromBalance = _balances[id][from]; require(fromBalance >= amount, "ERC1155: insufficient balance for transfer"); unchecked { _balances[id][from] = fromBalance - amount; } _balances[id][to] += amount; } emit TransferBatch(operator, from, to, ids, amounts); _afterTokenTransfer(operator, from, to, ids, amounts, data); _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data); } /** * @dev Sets a new URI for all token types, by relying on the token type ID * substitution mechanism * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP]. * * By this mechanism, any occurrence of the `\{id\}` substring in either the * URI or any of the amounts in the JSON file at said URI will be replaced by * clients with the token type ID. * * For example, the `https://token-cdn-domain/\{id\}.json` URI would be * interpreted by clients as * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json` * for token type ID 0x4cce0. * * See {uri}. * * Because these URIs cannot be meaningfully represented by the {URI} event, * this function emits no events. */ function _setURI(string memory newuri) internal virtual { _uri = newuri; } /** * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`. * * Emits a {TransferSingle} event. * * Requirements: * * - `to` cannot be the zero address. * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the * acceptance magic value. */ function _mint( address to, uint256 id, uint256 amount, bytes memory data ) internal virtual { require(to != address(0), "ERC1155: mint to the zero address"); address operator = _msgSender(); uint256[] memory ids = _asSingletonArray(id); uint256[] memory amounts = _asSingletonArray(amount); _beforeTokenTransfer(operator, address(0), to, ids, amounts, data); _balances[id][to] += amount; emit TransferSingle(operator, address(0), to, id, amount); _afterTokenTransfer(operator, address(0), to, ids, amounts, data); _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data); } /** * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}. * * 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 IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) { if (response != IERC1155ReceiverUpgradeable.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 IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns ( bytes4 response ) { if (response != IERC1155ReceiverUpgradeable.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; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[47] private __gap; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library StringsUpgradeable { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (utils/StorageSlot.sol) pragma solidity ^0.8.0; /** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ``` * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract"); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` * * _Available since v4.1 for `address`, `bool`, `bytes32`, and `uint256`._ */ library StorageSlotUpgradeable { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol) pragma solidity ^0.8.0; /** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */ interface IERC1822ProxiableUpgradeable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * ////IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32); } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol) pragma solidity ^0.8.0; /** * @dev This is the interface that {BeaconProxy} expects of its beacon. */ interface IBeaconUpgradeable { /** * @dev Must return an address that can be used as a delegate call target. * * {BeaconProxy} will check that this address is a contract. */ function implementation() external view returns (address); } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/ERC1967/ERC1967Upgrade.sol) pragma solidity ^0.8.2; ////import "../beacon/IBeaconUpgradeable.sol"; ////import "../../interfaces/draft-IERC1822Upgradeable.sol"; ////import "../../utils/AddressUpgradeable.sol"; ////import "../../utils/StorageSlotUpgradeable.sol"; ////import "../utils/Initializable.sol"; /** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. * * _Available since v4.1._ * * @custom:oz-upgrades-unsafe-allow delegatecall */ abstract contract ERC1967UpgradeUpgradeable is Initializable { function __ERC1967Upgrade_init() internal onlyInitializing { } function __ERC1967Upgrade_init_unchained() internal onlyInitializing { } // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1 bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143; /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Returns the current implementation address. */ function _getImplementation() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { require(AddressUpgradeable.isContract(newImplementation), "ERC1967: new implementation is not a contract"); StorageSlotUpgradeable.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Perform implementation upgrade * * Emits an {Upgraded} event. */ function _upgradeTo(address newImplementation) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); } /** * @dev Perform implementation upgrade with additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCall( address newImplementation, bytes memory data, bool forceCall ) internal { _upgradeTo(newImplementation); if (data.length > 0 || forceCall) { _functionDelegateCall(newImplementation, data); } } /** * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call. * * Emits an {Upgraded} event. */ function _upgradeToAndCallUUPS( address newImplementation, bytes memory data, bool forceCall ) internal { // Upgrades from old implementations will perform a rollback test. This test requires the new // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing // this special case will break upgrade paths from old UUPS implementation to new ones. if (StorageSlotUpgradeable.getBooleanSlot(_ROLLBACK_SLOT).value) { _setImplementation(newImplementation); } else { try IERC1822ProxiableUpgradeable(newImplementation).proxiableUUID() returns (bytes32 slot) { require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID"); } catch { revert("ERC1967Upgrade: new implementation is not UUPS"); } _upgradeToAndCall(newImplementation, data, forceCall); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is * validated in the constructor. */ bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Returns the current admin. */ function _getAdmin() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { require(newAdmin != address(0), "ERC1967: new admin is the zero address"); StorageSlotUpgradeable.getAddressSlot(_ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {AdminChanged} event. */ function _changeAdmin(address newAdmin) internal { emit AdminChanged(_getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor. */ bytes32 internal constant _BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Emitted when the beacon is upgraded. */ event BeaconUpgraded(address indexed beacon); /** * @dev Returns the current beacon. */ function _getBeacon() internal view returns (address) { return StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { require(AddressUpgradeable.isContract(newBeacon), "ERC1967: new beacon is not a contract"); require( AddressUpgradeable.isContract(IBeaconUpgradeable(newBeacon).implementation()), "ERC1967: beacon implementation is not a contract" ); StorageSlotUpgradeable.getAddressSlot(_BEACON_SLOT).value = newBeacon; } /** * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that). * * Emits a {BeaconUpgraded} event. */ function _upgradeBeaconToAndCall( address newBeacon, bytes memory data, bool forceCall ) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0 || forceCall) { _functionDelegateCall(IBeaconUpgradeable(newBeacon).implementation(), data); } } /** * @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) private returns (bytes memory) { require(AddressUpgradeable.isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return AddressUpgradeable.verifyCallResult(success, returndata, "Address: low-level delegate call failed"); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155URIStorage.sol) pragma solidity ^0.8.0; ////import "../../../utils/StringsUpgradeable.sol"; ////import "../ERC1155Upgradeable.sol"; ////import "../../../proxy/utils/Initializable.sol"; /** * @dev ERC1155 token with storage based token URI management. * Inspired by the ERC721URIStorage extension * * _Available since v4.6._ */ abstract contract ERC1155URIStorageUpgradeable is Initializable, ERC1155Upgradeable { function __ERC1155URIStorage_init() internal onlyInitializing { __ERC1155URIStorage_init_unchained(); } function __ERC1155URIStorage_init_unchained() internal onlyInitializing { _baseURI = ""; } using StringsUpgradeable for uint256; // Optional base URI string private _baseURI; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC1155MetadataURI-uri}. * * This implementation returns the concatenation of the `_baseURI` * and the token-specific uri if the latter is set * * This enables the following behaviors: * * - if `_tokenURIs[tokenId]` is set, then the result is the concatenation * of `_baseURI` and `_tokenURIs[tokenId]` (keep in mind that `_baseURI` * is empty per default); * * - if `_tokenURIs[tokenId]` is NOT set then we fallback to `super.uri()` * which in most cases will contain `ERC1155._uri`; * * - if `_tokenURIs[tokenId]` is NOT set, and if the parents do not have a * uri value set, then the result is empty. */ function uri(uint256 tokenId) public view virtual override returns (string memory) { string memory tokenURI = _tokenURIs[tokenId]; // If token URI is set, concatenate base URI and tokenURI (via abi.encodePacked). return bytes(tokenURI).length > 0 ? string(abi.encodePacked(_baseURI, tokenURI)) : super.uri(tokenId); } /** * @dev Sets `tokenURI` as the tokenURI of `tokenId`. */ function _setURI(uint256 tokenId, string memory tokenURI) internal virtual { _tokenURIs[tokenId] = tokenURI; emit URI(uri(tokenId), tokenId); } /** * @dev Sets `baseURI` as the `_baseURI` for all tokens */ function _setBaseURI(string memory baseURI) internal virtual { _baseURI = baseURI; } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[48] private __gap; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/UUPSUpgradeable.sol) pragma solidity ^0.8.0; ////import "../../interfaces/draft-IERC1822Upgradeable.sol"; ////import "../ERC1967/ERC1967UpgradeUpgradeable.sol"; ////import "./Initializable.sol"; /** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. * * _Available since v4.1._ */ abstract contract UUPSUpgradeable is Initializable, IERC1822ProxiableUpgradeable, ERC1967UpgradeUpgradeable { function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /// @custom:oz-upgrades-unsafe-allow state-variable-immutable state-variable-assignment address private immutable __self = address(this); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { require(address(this) != __self, "Function must be called through delegatecall"); require(_getImplementation() == __self, "Function must be called through active proxy"); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { require(address(this) == __self, "UUPSUpgradeable: must not be called through delegatecall"); _; } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate that the this implementation remains valid after an upgrade. * * ////IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual override notDelegated returns (bytes32) { return _IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeTo(address newImplementation) external virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, new bytes(0), false); } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) external payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data, true); } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeTo} and {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal override onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[50] private __gap; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: MIT // OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol) pragma solidity ^0.8.0; ////import "../utils/ContextUpgradeable.sol"; ////import "../proxy/utils/Initializable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ function __Ownable_init() internal onlyInitializing { __Ownable_init_unchained(); } function __Ownable_init_unchained() internal onlyInitializing { _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); } /** * @dev This empty reserved space is put in place to allow future versions to add new * variables without shifting down storage in the inheritance chain. * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps */ uint256[49] private __gap; } /** * SourceUnit: /Users/oker/dev_code/okex/Web3-NFT-Event/contracts/OKXBadge.sol */ ////// SPDX-License-Identifier-FLATTEN-SUPPRESS-WARNING: UNLICENSED pragma solidity ^0.8.9; ////import "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; ////import "@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol"; ////import "@openzeppelin/contracts-upgradeable/proxy/utils/UUPSUpgradeable.sol"; ////import "@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/ERC1155URIStorageUpgradeable.sol"; contract OKXBadge is Initializable, UUPSUpgradeable, ERC1155URIStorageUpgradeable, OwnableUpgradeable { string private _name; address public operator; event SetOperator(address newOperator); struct OKXBadgeBatch { address account; // mint: to; burn: from; uint256[] ids; uint256[] amounts; } modifier onlyOperator() { require(msg.sender == operator, "OKXBadge: not the operator address."); _; } function _authorizeUpgrade(address newImplementation) internal override onlyOwner {} function initialize(string memory name_, address newOperator) public initializer { __ERC1155_init(""); __ERC1155URIStorage_init(); __Ownable_init(); __UUPSUpgradeable_init(); _name = name_; operator = newOperator; emit SetOperator(newOperator); } //------------------------------- //------- Owner functions --- //------------------------------- function setOperator(address newOperator) external onlyOwner { operator = newOperator; emit SetOperator(newOperator); } //------------------------------- //------- Operator functions ---- //------------------------------- function setURI(uint256 tokenId, string memory tokenURI) external onlyOperator { _setURI(tokenId, tokenURI); } function batchMint(OKXBadgeBatch[] calldata mints) external onlyOperator { for (uint256 i = 0; i < mints.length; i++) { _mintBatch(mints[i].account, mints[i].ids, mints[i].amounts, ""); } } function batchBurn(OKXBadgeBatch[] calldata burns) external onlyOperator { for (uint256 i = 0; i < burns.length; i++) { _burnBatch(burns[i].account, burns[i].ids, burns[i].amounts); } } //------------------------------- //------- View functions -------- //------------------------------- function getImplementation() external view returns (address) { return _getImplementation(); } function name() public view returns (string memory) { return _name; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"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":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"version","type":"uint8"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newOperator","type":"address"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"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":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct OKXBadge.OKXBadgeBatch[]","name":"burns","type":"tuple[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"internalType":"struct OKXBadge.OKXBadgeBatch[]","name":"mints","type":"tuple[]"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"address","name":"newOperator","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"tokenURI","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"}],"name":"upgradeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60a06040523060805234801561001457600080fd5b50608051612dc461004c600039600081816106f401528181610734015281816108e60152818161092601526109a20152612dc46000f3fe6080604052600436106101345760003560e01c80637ab4339d116100ab578063b3ab15fb1161006f578063b3ab15fb14610357578063bc3ba85614610377578063cccbbbae14610397578063e985e9c5146103b7578063f242432a14610400578063f2fde38b1461042057600080fd5b80637ab4339d146102c3578063862440e2146102e35780638da5cb5b14610303578063a22cb46514610322578063aaf10f421461034257600080fd5b80633659cfe6116100fd5780633659cfe6146102005780634e1273f4146102205780634f1ef2861461024d57806352d1902d14610260578063570ca73514610275578063715018a6146102ae57600080fd5b8062fdd58e1461013957806301ffc9a71461016c57806306fdde031461019c5780630e89341c146101be5780632eb2c2d6146101de575b600080fd5b34801561014557600080fd5b50610159610154366004612137565b610440565b6040519081526020015b60405180910390f35b34801561017857600080fd5b5061018c610187366004612177565b6104d8565b6040519015158152602001610163565b3480156101a857600080fd5b506101b161052a565b60405161016391906121ec565b3480156101ca57600080fd5b506101b16101d93660046121ff565b6105bd565b3480156101ea57600080fd5b506101fe6101f9366004612361565b61069d565b005b34801561020c57600080fd5b506101fe61021b36600461240a565b6106e9565b34801561022c57600080fd5b5061024061023b366004612425565b6107b2565b604051610163919061252a565b6101fe61025b36600461253d565b6108db565b34801561026c57600080fd5b50610159610995565b34801561028157600080fd5b5061016054610296906001600160a01b031681565b6040516001600160a01b039091168152602001610163565b3480156102ba57600080fd5b506101fe610a49565b3480156102cf57600080fd5b506101fe6102de366004612580565b610a5d565b3480156102ef57600080fd5b506101fe6102fe3660046125cd565b610bff565b34801561030f57600080fd5b5061012d546001600160a01b0316610296565b34801561032e57600080fd5b506101fe61033d3660046125fd565b610c34565b34801561034e57600080fd5b50610296610c3f565b34801561036357600080fd5b506101fe61037236600461240a565b610c4e565b34801561038357600080fd5b506101fe610392366004612639565b610cab565b3480156103a357600080fd5b506101fe6103b2366004612639565b610e05565b3480156103c357600080fd5b5061018c6103d23660046126ad565b6001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205460ff1690565b34801561040c57600080fd5b506101fe61041b3660046126d7565b610f51565b34801561042c57600080fd5b506101fe61043b36600461240a565b610f96565b60006001600160a01b0383166104b05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600090815260c9602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061050957506001600160e01b031982166303a24d0760e21b145b8061052457506301ffc9a760e01b6001600160e01b03198316145b92915050565b606061015f805461053a9061273b565b80601f01602080910402602001604051908101604052809291908181526020018280546105669061273b565b80156105b35780601f10610588576101008083540402835291602001916105b3565b820191906000526020600020905b81548152906001019060200180831161059657829003601f168201915b5050505050905090565b600081815260fc60205260408120805460609291906105db9061273b565b80601f01602080910402602001604051908101604052809291908181526020018280546106079061273b565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b5050505050905060008151116106725761066d8361100c565b610696565b60fb81604051602001610686929190612792565b6040516020818303038152906040525b9392505050565b6001600160a01b0385163314806106b957506106b985336103d2565b6106d55760405162461bcd60e51b81526004016104a790612830565b6106e285858585856110a0565b5050505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156107325760405162461bcd60e51b81526004016104a79061287f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661076461123f565b6001600160a01b03161461078a5760405162461bcd60e51b81526004016104a7906128cb565b6107938161125b565b604080516000808252602082019092526107af91839190611263565b50565b606081518351146108175760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016104a7565b600083516001600160401b0381111561083257610832612218565b60405190808252806020026020018201604052801561085b578160200160208202803683370190505b50905060005b84518110156108d3576108a685828151811061087f5761087f612917565b602002602001015185838151811061089957610899612917565b6020026020010151610440565b8282815181106108b8576108b8612917565b60209081029190910101526108cc81612943565b9050610861565b509392505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614156109245760405162461bcd60e51b81526004016104a79061287f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661095661123f565b6001600160a01b03161461097c5760405162461bcd60e51b81526004016104a7906128cb565b6109858261125b565b61099182826001611263565b5050565b6000306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610a355760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016104a7565b50600080516020612d488339815191525b90565b610a516113ce565b610a5b6000611429565b565b600054610100900460ff1615808015610a7d5750600054600160ff909116105b80610a975750303b158015610a97575060005460ff166001145b610afa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a7565b6000805460ff191660011790558015610b1d576000805461ff0019166101001790555b610b356040518060200160405280600081525061147c565b610b3d6114ac565b610b456114db565b610b4d61150a565b8251610b619061015f906020860190612082565b5061016080546001600160a01b0319166001600160a01b0384169081179091556040519081527fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee9060200160405180910390a18015610bfa576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610160546001600160a01b03163314610c2a5760405162461bcd60e51b81526004016104a79061295e565b6109918282611531565b610991338383611595565b6000610c4961123f565b905090565b610c566113ce565b61016080546001600160a01b0319166001600160a01b0383169081179091556040519081527fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee9060200160405180910390a150565b610160546001600160a01b03163314610cd65760405162461bcd60e51b81526004016104a79061295e565b60005b81811015610bfa57610df3838383818110610cf657610cf6612917565b9050602002810190610d0891906129a1565b610d1690602081019061240a565b848484818110610d2857610d28612917565b9050602002810190610d3a91906129a1565b610d489060208101906129c1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250879150869050818110610d8e57610d8e612917565b9050602002810190610da091906129a1565b610dae9060408101906129c1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092018290525060408051602081019091529081529250611676915050565b80610dfd81612943565b915050610cd9565b610160546001600160a01b03163314610e305760405162461bcd60e51b81526004016104a79061295e565b60005b81811015610bfa57610f3f838383818110610e5057610e50612917565b9050602002810190610e6291906129a1565b610e7090602081019061240a565b848484818110610e8257610e82612917565b9050602002810190610e9491906129a1565b610ea29060208101906129c1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250879150869050818110610ee857610ee8612917565b9050602002810190610efa91906129a1565b610f089060408101906129c1565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506117fc92505050565b80610f4981612943565b915050610e33565b6001600160a01b038516331480610f6d5750610f6d85336103d2565b610f895760405162461bcd60e51b81526004016104a790612830565b6106e28585858585611a03565b610f9e6113ce565b6001600160a01b0381166110035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104a7565b6107af81611429565b606060cb805461101b9061273b565b80601f01602080910402602001604051908101604052809291908181526020018280546110479061273b565b80156110945780601f1061106957610100808354040283529160200191611094565b820191906000526020600020905b81548152906001019060200180831161107757829003601f168201915b50505050509050919050565b81518351146110c15760405162461bcd60e51b81526004016104a790612a11565b6001600160a01b0384166110e75760405162461bcd60e51b81526004016104a790612a59565b3360005b84518110156111d157600085828151811061110857611108612917565b60200260200101519050600085838151811061112657611126612917565b602090810291909101810151600084815260c9835260408082206001600160a01b038e1683529093529190912054909150818110156111775760405162461bcd60e51b81526004016104a790612a9e565b600083815260c9602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111b6908490612ae8565b92505081905550505050806111ca90612943565b90506110eb565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611221929190612b00565b60405180910390a4611237818787878787611b31565b505050505050565b600080516020612d48833981519152546001600160a01b031690565b6107af6113ce565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561129657610bfa83611c96565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112f0575060408051601f3d908101601f191682019092526112ed91810190612b25565b60015b6113535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016104a7565b600080516020612d4883398151915281146113c25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016104a7565b50610bfa838383611d32565b61012d546001600160a01b03163314610a5b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a7565b61012d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166114a35760405162461bcd60e51b81526004016104a790612b3e565b6107af81611d57565b600054610100900460ff166114d35760405162461bcd60e51b81526004016104a790612b3e565b610a5b611d87565b600054610100900460ff166115025760405162461bcd60e51b81526004016104a790612b3e565b610a5b611dcc565b600054610100900460ff16610a5b5760405162461bcd60e51b81526004016104a790612b3e565b600082815260fc60209081526040909120825161155092840190612082565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61157c846105bd565b60405161158991906121ec565b60405180910390a25050565b816001600160a01b0316836001600160a01b031614156116095760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016104a7565b6001600160a01b03838116600081815260ca6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166116d65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016104a7565b81518351146116f75760405162461bcd60e51b81526004016104a790612a11565b3360005b84518110156117945783818151811061171657611716612917565b602002602001015160c9600087848151811061173457611734612917565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461177c9190612ae8565b9091555081905061178c81612943565b9150506116fb565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516117e5929190612b00565b60405180910390a46106e281600087878787611b31565b6001600160a01b03831661185e5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016104a7565b805182511461187f5760405162461bcd60e51b81526004016104a790612a11565b604080516020810190915260009081905233905b83518110156119945760008482815181106118b0576118b0612917565b6020026020010151905060008483815181106118ce576118ce612917565b602090810291909101810151600084815260c9835260408082206001600160a01b038c16835290935291909120549091508181101561195b5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016104a7565b600092835260c9602090815260408085206001600160a01b038b168652909152909220910390558061198c81612943565b915050611893565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516119e5929190612b00565b60405180910390a46040805160208101909152600090525b50505050565b6001600160a01b038416611a295760405162461bcd60e51b81526004016104a790612a59565b336000611a3585611dfc565b90506000611a4285611dfc565b9050600086815260c9602090815260408083206001600160a01b038c16845290915290205485811015611a875760405162461bcd60e51b81526004016104a790612a9e565b600087815260c9602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611ac6908490612ae8565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b26848a8a8a8a8a611e47565b505050505050505050565b6001600160a01b0384163b156112375760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611b759089908990889088908890600401612b89565b6020604051808303816000875af1925050508015611bb0575060408051601f3d908101601f19168201909252611bad91810190612be7565b60015b611c5d57611bbc612c04565b806308c379a01415611bf65750611bd1612c1f565b80611bdc5750611bf8565b8060405162461bcd60e51b81526004016104a791906121ec565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016104a7565b6001600160e01b0319811663bc197c8160e01b14611c8d5760405162461bcd60e51b81526004016104a790612ca8565b50505050505050565b6001600160a01b0381163b611d035760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104a7565b600080516020612d4883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611d3b83611f02565b600082511180611d485750805b15610bfa576119fd8383611f42565b600054610100900460ff16611d7e5760405162461bcd60e51b81526004016104a790612b3e565b6107af81612036565b600054610100900460ff16611dae5760405162461bcd60e51b81526004016104a790612b3e565b6040805160208101918290526000908190526107af9160fb91612082565b600054610100900460ff16611df35760405162461bcd60e51b81526004016104a790612b3e565b610a5b33611429565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611e3657611e36612917565b602090810291909101015292915050565b6001600160a01b0384163b156112375760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e8b9089908990889088908890600401612cf0565b6020604051808303816000875af1925050508015611ec6575060408051601f3d908101601f19168201909252611ec391810190612be7565b60015b611ed257611bbc612c04565b6001600160e01b0319811663f23a6e6160e01b14611c8d5760405162461bcd60e51b81526004016104a790612ca8565b611f0b81611c96565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b611faa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104a7565b600080846001600160a01b031684604051611fc59190612d35565b600060405180830381855af49150503d8060008114612000576040519150601f19603f3d011682016040523d82523d6000602084013e612005565b606091505b509150915061202d8282604051806060016040528060278152602001612d6860279139612049565b95945050505050565b80516109919060cb906020840190612082565b60608315612058575081610696565b8251156120685782518084602001fd5b8160405162461bcd60e51b81526004016104a791906121ec565b82805461208e9061273b565b90600052602060002090601f0160209004810192826120b057600085556120f6565b82601f106120c957805160ff19168380011785556120f6565b828001600101855582156120f6579182015b828111156120f65782518255916020019190600101906120db565b50612102929150612106565b5090565b5b808211156121025760008155600101612107565b80356001600160a01b038116811461213257600080fd5b919050565b6000806040838503121561214a57600080fd5b6121538361211b565b946020939093013593505050565b6001600160e01b0319811681146107af57600080fd5b60006020828403121561218957600080fd5b813561069681612161565b60005b838110156121af578181015183820152602001612197565b838111156119fd5750506000910152565b600081518084526121d8816020860160208601612194565b601f01601f19169290920160200192915050565b60208152600061069660208301846121c0565b60006020828403121561221157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561225357612253612218565b6040525050565b60006001600160401b0382111561227357612273612218565b5060051b60200190565b600082601f83011261228e57600080fd5b8135602061229b8261225a565b6040516122a8828261222e565b83815260059390931b85018201928281019150868411156122c857600080fd5b8286015b848110156122e357803583529183019183016122cc565b509695505050505050565b600082601f8301126122ff57600080fd5b81356001600160401b0381111561231857612318612218565b60405161232f601f8301601f19166020018261222e565b81815284602083860101111561234457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561237957600080fd5b6123828661211b565b94506123906020870161211b565b935060408601356001600160401b03808211156123ac57600080fd5b6123b889838a0161227d565b945060608801359150808211156123ce57600080fd5b6123da89838a0161227d565b935060808801359150808211156123f057600080fd5b506123fd888289016122ee565b9150509295509295909350565b60006020828403121561241c57600080fd5b6106968261211b565b6000806040838503121561243857600080fd5b82356001600160401b038082111561244f57600080fd5b818501915085601f83011261246357600080fd5b813560206124708261225a565b60405161247d828261222e565b83815260059390931b850182019282810191508984111561249d57600080fd5b948201945b838610156124c2576124b38661211b565b825294820194908201906124a2565b965050860135925050808211156124d857600080fd5b506124e58582860161227d565b9150509250929050565b600081518084526020808501945080840160005b8381101561251f57815187529582019590820190600101612503565b509495945050505050565b60208152600061069660208301846124ef565b6000806040838503121561255057600080fd5b6125598361211b565b915060208301356001600160401b0381111561257457600080fd5b6124e5858286016122ee565b6000806040838503121561259357600080fd5b82356001600160401b038111156125a957600080fd5b6125b5858286016122ee565b9250506125c46020840161211b565b90509250929050565b600080604083850312156125e057600080fd5b8235915060208301356001600160401b0381111561257457600080fd5b6000806040838503121561261057600080fd5b6126198361211b565b91506020830135801515811461262e57600080fd5b809150509250929050565b6000806020838503121561264c57600080fd5b82356001600160401b038082111561266357600080fd5b818501915085601f83011261267757600080fd5b81358181111561268657600080fd5b8660208260051b850101111561269b57600080fd5b60209290920196919550909350505050565b600080604083850312156126c057600080fd5b6126c98361211b565b91506125c46020840161211b565b600080600080600060a086880312156126ef57600080fd5b6126f88661211b565b94506127066020870161211b565b9350604086013592506060860135915060808601356001600160401b0381111561272f57600080fd5b6123fd888289016122ee565b600181811c9082168061274f57607f821691505b6020821081141561277057634e487b7160e01b600052602260045260246000fd5b50919050565b60008151612788818560208601612194565b9290920192915050565b600080845481600182811c9150808316806127ae57607f831692505b60208084108214156127ce57634e487b7160e01b86526022600452602486fd5b8180156127e257600181146127f357612820565b60ff19861689528489019650612820565b60008b81526020902060005b868110156128185781548b8201529085019083016127ff565b505084890196505b50505050505061202d8185612776565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156129575761295761292d565b5060010190565b60208082526023908201527f4f4b5842616467653a206e6f7420746865206f70657261746f7220616464726560408201526239b99760e91b606082015260800190565b60008235605e198336030181126129b757600080fd5b9190910192915050565b6000808335601e198436030181126129d857600080fd5b8301803591506001600160401b038211156129f257600080fd5b6020019150600581901b3603821315612a0a57600080fd5b9250929050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115612afb57612afb61292d565b500190565b604081526000612b1360408301856124ef565b828103602084015261202d81856124ef565b600060208284031215612b3757600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612bb5908301866124ef565b8281036060840152612bc781866124ef565b90508281036080840152612bdb81856121c0565b98975050505050505050565b600060208284031215612bf957600080fd5b815161069681612161565b600060033d1115610a465760046000803e5060005160e01c90565b600060443d1015612c2d5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612c5c57505050505090565b8285019150815181811115612c745750505050505090565b843d8701016020828501011115612c8e5750505050505090565b612c9d6020828601018761222e565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612d2a908301846121c0565b979650505050505050565b600082516129b781846020870161219456fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122023572d3c991ca1936cc711616f70927c46933e2824fe2b5f8b41f1c1a6e9bb0f64736f6c634300080c0033
Deployed Bytecode
0x6080604052600436106101345760003560e01c80637ab4339d116100ab578063b3ab15fb1161006f578063b3ab15fb14610357578063bc3ba85614610377578063cccbbbae14610397578063e985e9c5146103b7578063f242432a14610400578063f2fde38b1461042057600080fd5b80637ab4339d146102c3578063862440e2146102e35780638da5cb5b14610303578063a22cb46514610322578063aaf10f421461034257600080fd5b80633659cfe6116100fd5780633659cfe6146102005780634e1273f4146102205780634f1ef2861461024d57806352d1902d14610260578063570ca73514610275578063715018a6146102ae57600080fd5b8062fdd58e1461013957806301ffc9a71461016c57806306fdde031461019c5780630e89341c146101be5780632eb2c2d6146101de575b600080fd5b34801561014557600080fd5b50610159610154366004612137565b610440565b6040519081526020015b60405180910390f35b34801561017857600080fd5b5061018c610187366004612177565b6104d8565b6040519015158152602001610163565b3480156101a857600080fd5b506101b161052a565b60405161016391906121ec565b3480156101ca57600080fd5b506101b16101d93660046121ff565b6105bd565b3480156101ea57600080fd5b506101fe6101f9366004612361565b61069d565b005b34801561020c57600080fd5b506101fe61021b36600461240a565b6106e9565b34801561022c57600080fd5b5061024061023b366004612425565b6107b2565b604051610163919061252a565b6101fe61025b36600461253d565b6108db565b34801561026c57600080fd5b50610159610995565b34801561028157600080fd5b5061016054610296906001600160a01b031681565b6040516001600160a01b039091168152602001610163565b3480156102ba57600080fd5b506101fe610a49565b3480156102cf57600080fd5b506101fe6102de366004612580565b610a5d565b3480156102ef57600080fd5b506101fe6102fe3660046125cd565b610bff565b34801561030f57600080fd5b5061012d546001600160a01b0316610296565b34801561032e57600080fd5b506101fe61033d3660046125fd565b610c34565b34801561034e57600080fd5b50610296610c3f565b34801561036357600080fd5b506101fe61037236600461240a565b610c4e565b34801561038357600080fd5b506101fe610392366004612639565b610cab565b3480156103a357600080fd5b506101fe6103b2366004612639565b610e05565b3480156103c357600080fd5b5061018c6103d23660046126ad565b6001600160a01b03918216600090815260ca6020908152604080832093909416825291909152205460ff1690565b34801561040c57600080fd5b506101fe61041b3660046126d7565b610f51565b34801561042c57600080fd5b506101fe61043b36600461240a565b610f96565b60006001600160a01b0383166104b05760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b50600090815260c9602090815260408083206001600160a01b03949094168352929052205490565b60006001600160e01b03198216636cdb3d1360e11b148061050957506001600160e01b031982166303a24d0760e21b145b8061052457506301ffc9a760e01b6001600160e01b03198316145b92915050565b606061015f805461053a9061273b565b80601f01602080910402602001604051908101604052809291908181526020018280546105669061273b565b80156105b35780601f10610588576101008083540402835291602001916105b3565b820191906000526020600020905b81548152906001019060200180831161059657829003601f168201915b5050505050905090565b600081815260fc60205260408120805460609291906105db9061273b565b80601f01602080910402602001604051908101604052809291908181526020018280546106079061273b565b80156106545780601f1061062957610100808354040283529160200191610654565b820191906000526020600020905b81548152906001019060200180831161063757829003601f168201915b5050505050905060008151116106725761066d8361100c565b610696565b60fb81604051602001610686929190612792565b6040516020818303038152906040525b9392505050565b6001600160a01b0385163314806106b957506106b985336103d2565b6106d55760405162461bcd60e51b81526004016104a790612830565b6106e285858585856110a0565b5050505050565b306001600160a01b037f0000000000000000000000001bca060b991712a9ab14de7c2b6efb96540afd9d1614156107325760405162461bcd60e51b81526004016104a79061287f565b7f0000000000000000000000001bca060b991712a9ab14de7c2b6efb96540afd9d6001600160a01b031661076461123f565b6001600160a01b03161461078a5760405162461bcd60e51b81526004016104a7906128cb565b6107938161125b565b604080516000808252602082019092526107af91839190611263565b50565b606081518351146108175760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016104a7565b600083516001600160401b0381111561083257610832612218565b60405190808252806020026020018201604052801561085b578160200160208202803683370190505b50905060005b84518110156108d3576108a685828151811061087f5761087f612917565b602002602001015185838151811061089957610899612917565b6020026020010151610440565b8282815181106108b8576108b8612917565b60209081029190910101526108cc81612943565b9050610861565b509392505050565b306001600160a01b037f0000000000000000000000001bca060b991712a9ab14de7c2b6efb96540afd9d1614156109245760405162461bcd60e51b81526004016104a79061287f565b7f0000000000000000000000001bca060b991712a9ab14de7c2b6efb96540afd9d6001600160a01b031661095661123f565b6001600160a01b03161461097c5760405162461bcd60e51b81526004016104a7906128cb565b6109858261125b565b61099182826001611263565b5050565b6000306001600160a01b037f0000000000000000000000001bca060b991712a9ab14de7c2b6efb96540afd9d1614610a355760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c60448201527f6c6564207468726f7567682064656c656761746563616c6c000000000000000060648201526084016104a7565b50600080516020612d488339815191525b90565b610a516113ce565b610a5b6000611429565b565b600054610100900460ff1615808015610a7d5750600054600160ff909116105b80610a975750303b158015610a97575060005460ff166001145b610afa5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016104a7565b6000805460ff191660011790558015610b1d576000805461ff0019166101001790555b610b356040518060200160405280600081525061147c565b610b3d6114ac565b610b456114db565b610b4d61150a565b8251610b619061015f906020860190612082565b5061016080546001600160a01b0319166001600160a01b0384169081179091556040519081527fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee9060200160405180910390a18015610bfa576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610160546001600160a01b03163314610c2a5760405162461bcd60e51b81526004016104a79061295e565b6109918282611531565b610991338383611595565b6000610c4961123f565b905090565b610c566113ce565b61016080546001600160a01b0319166001600160a01b0383169081179091556040519081527fdbebfba65bd6398fb722063efc10c99f624f9cd8ba657201056af918a676d5ee9060200160405180910390a150565b610160546001600160a01b03163314610cd65760405162461bcd60e51b81526004016104a79061295e565b60005b81811015610bfa57610df3838383818110610cf657610cf6612917565b9050602002810190610d0891906129a1565b610d1690602081019061240a565b848484818110610d2857610d28612917565b9050602002810190610d3a91906129a1565b610d489060208101906129c1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250879150869050818110610d8e57610d8e612917565b9050602002810190610da091906129a1565b610dae9060408101906129c1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092018290525060408051602081019091529081529250611676915050565b80610dfd81612943565b915050610cd9565b610160546001600160a01b03163314610e305760405162461bcd60e51b81526004016104a79061295e565b60005b81811015610bfa57610f3f838383818110610e5057610e50612917565b9050602002810190610e6291906129a1565b610e7090602081019061240a565b848484818110610e8257610e82612917565b9050602002810190610e9491906129a1565b610ea29060208101906129c1565b80806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250889250879150869050818110610ee857610ee8612917565b9050602002810190610efa91906129a1565b610f089060408101906129c1565b808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506117fc92505050565b80610f4981612943565b915050610e33565b6001600160a01b038516331480610f6d5750610f6d85336103d2565b610f895760405162461bcd60e51b81526004016104a790612830565b6106e28585858585611a03565b610f9e6113ce565b6001600160a01b0381166110035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016104a7565b6107af81611429565b606060cb805461101b9061273b565b80601f01602080910402602001604051908101604052809291908181526020018280546110479061273b565b80156110945780601f1061106957610100808354040283529160200191611094565b820191906000526020600020905b81548152906001019060200180831161107757829003601f168201915b50505050509050919050565b81518351146110c15760405162461bcd60e51b81526004016104a790612a11565b6001600160a01b0384166110e75760405162461bcd60e51b81526004016104a790612a59565b3360005b84518110156111d157600085828151811061110857611108612917565b60200260200101519050600085838151811061112657611126612917565b602090810291909101810151600084815260c9835260408082206001600160a01b038e1683529093529190912054909150818110156111775760405162461bcd60e51b81526004016104a790612a9e565b600083815260c9602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906111b6908490612ae8565b92505081905550505050806111ca90612943565b90506110eb565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611221929190612b00565b60405180910390a4611237818787878787611b31565b505050505050565b600080516020612d48833981519152546001600160a01b031690565b6107af6113ce565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff161561129657610bfa83611c96565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156112f0575060408051601f3d908101601f191682019092526112ed91810190612b25565b60015b6113535760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b60648201526084016104a7565b600080516020612d4883398151915281146113c25760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b60648201526084016104a7565b50610bfa838383611d32565b61012d546001600160a01b03163314610a5b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a7565b61012d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600054610100900460ff166114a35760405162461bcd60e51b81526004016104a790612b3e565b6107af81611d57565b600054610100900460ff166114d35760405162461bcd60e51b81526004016104a790612b3e565b610a5b611d87565b600054610100900460ff166115025760405162461bcd60e51b81526004016104a790612b3e565b610a5b611dcc565b600054610100900460ff16610a5b5760405162461bcd60e51b81526004016104a790612b3e565b600082815260fc60209081526040909120825161155092840190612082565b50817f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b61157c846105bd565b60405161158991906121ec565b60405180910390a25050565b816001600160a01b0316836001600160a01b031614156116095760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016104a7565b6001600160a01b03838116600081815260ca6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0384166116d65760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016104a7565b81518351146116f75760405162461bcd60e51b81526004016104a790612a11565b3360005b84518110156117945783818151811061171657611716612917565b602002602001015160c9600087848151811061173457611734612917565b602002602001015181526020019081526020016000206000886001600160a01b03166001600160a01b03168152602001908152602001600020600082825461177c9190612ae8565b9091555081905061178c81612943565b9150506116fb565b50846001600160a01b031660006001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516117e5929190612b00565b60405180910390a46106e281600087878787611b31565b6001600160a01b03831661185e5760405162461bcd60e51b815260206004820152602360248201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260448201526265737360e81b60648201526084016104a7565b805182511461187f5760405162461bcd60e51b81526004016104a790612a11565b604080516020810190915260009081905233905b83518110156119945760008482815181106118b0576118b0612917565b6020026020010151905060008483815181106118ce576118ce612917565b602090810291909101810151600084815260c9835260408082206001600160a01b038c16835290935291909120549091508181101561195b5760405162461bcd60e51b8152602060048201526024808201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604482015263616e636560e01b60648201526084016104a7565b600092835260c9602090815260408085206001600160a01b038b168652909152909220910390558061198c81612943565b915050611893565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516119e5929190612b00565b60405180910390a46040805160208101909152600090525b50505050565b6001600160a01b038416611a295760405162461bcd60e51b81526004016104a790612a59565b336000611a3585611dfc565b90506000611a4285611dfc565b9050600086815260c9602090815260408083206001600160a01b038c16845290915290205485811015611a875760405162461bcd60e51b81526004016104a790612a9e565b600087815260c9602090815260408083206001600160a01b038d8116855292528083208985039055908a16825281208054889290611ac6908490612ae8565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611b26848a8a8a8a8a611e47565b505050505050505050565b6001600160a01b0384163b156112375760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190611b759089908990889088908890600401612b89565b6020604051808303816000875af1925050508015611bb0575060408051601f3d908101601f19168201909252611bad91810190612be7565b60015b611c5d57611bbc612c04565b806308c379a01415611bf65750611bd1612c1f565b80611bdc5750611bf8565b8060405162461bcd60e51b81526004016104a791906121ec565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016104a7565b6001600160e01b0319811663bc197c8160e01b14611c8d5760405162461bcd60e51b81526004016104a790612ca8565b50505050505050565b6001600160a01b0381163b611d035760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b60648201526084016104a7565b600080516020612d4883398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b611d3b83611f02565b600082511180611d485750805b15610bfa576119fd8383611f42565b600054610100900460ff16611d7e5760405162461bcd60e51b81526004016104a790612b3e565b6107af81612036565b600054610100900460ff16611dae5760405162461bcd60e51b81526004016104a790612b3e565b6040805160208101918290526000908190526107af9160fb91612082565b600054610100900460ff16611df35760405162461bcd60e51b81526004016104a790612b3e565b610a5b33611429565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611e3657611e36612917565b602090810291909101015292915050565b6001600160a01b0384163b156112375760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611e8b9089908990889088908890600401612cf0565b6020604051808303816000875af1925050508015611ec6575060408051601f3d908101601f19168201909252611ec391810190612be7565b60015b611ed257611bbc612c04565b6001600160e01b0319811663f23a6e6160e01b14611c8d5760405162461bcd60e51b81526004016104a790612ca8565b611f0b81611c96565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60606001600160a01b0383163b611faa5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b60648201526084016104a7565b600080846001600160a01b031684604051611fc59190612d35565b600060405180830381855af49150503d8060008114612000576040519150601f19603f3d011682016040523d82523d6000602084013e612005565b606091505b509150915061202d8282604051806060016040528060278152602001612d6860279139612049565b95945050505050565b80516109919060cb906020840190612082565b60608315612058575081610696565b8251156120685782518084602001fd5b8160405162461bcd60e51b81526004016104a791906121ec565b82805461208e9061273b565b90600052602060002090601f0160209004810192826120b057600085556120f6565b82601f106120c957805160ff19168380011785556120f6565b828001600101855582156120f6579182015b828111156120f65782518255916020019190600101906120db565b50612102929150612106565b5090565b5b808211156121025760008155600101612107565b80356001600160a01b038116811461213257600080fd5b919050565b6000806040838503121561214a57600080fd5b6121538361211b565b946020939093013593505050565b6001600160e01b0319811681146107af57600080fd5b60006020828403121561218957600080fd5b813561069681612161565b60005b838110156121af578181015183820152602001612197565b838111156119fd5750506000910152565b600081518084526121d8816020860160208601612194565b601f01601f19169290920160200192915050565b60208152600061069660208301846121c0565b60006020828403121561221157600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561225357612253612218565b6040525050565b60006001600160401b0382111561227357612273612218565b5060051b60200190565b600082601f83011261228e57600080fd5b8135602061229b8261225a565b6040516122a8828261222e565b83815260059390931b85018201928281019150868411156122c857600080fd5b8286015b848110156122e357803583529183019183016122cc565b509695505050505050565b600082601f8301126122ff57600080fd5b81356001600160401b0381111561231857612318612218565b60405161232f601f8301601f19166020018261222e565b81815284602083860101111561234457600080fd5b816020850160208301376000918101602001919091529392505050565b600080600080600060a0868803121561237957600080fd5b6123828661211b565b94506123906020870161211b565b935060408601356001600160401b03808211156123ac57600080fd5b6123b889838a0161227d565b945060608801359150808211156123ce57600080fd5b6123da89838a0161227d565b935060808801359150808211156123f057600080fd5b506123fd888289016122ee565b9150509295509295909350565b60006020828403121561241c57600080fd5b6106968261211b565b6000806040838503121561243857600080fd5b82356001600160401b038082111561244f57600080fd5b818501915085601f83011261246357600080fd5b813560206124708261225a565b60405161247d828261222e565b83815260059390931b850182019282810191508984111561249d57600080fd5b948201945b838610156124c2576124b38661211b565b825294820194908201906124a2565b965050860135925050808211156124d857600080fd5b506124e58582860161227d565b9150509250929050565b600081518084526020808501945080840160005b8381101561251f57815187529582019590820190600101612503565b509495945050505050565b60208152600061069660208301846124ef565b6000806040838503121561255057600080fd5b6125598361211b565b915060208301356001600160401b0381111561257457600080fd5b6124e5858286016122ee565b6000806040838503121561259357600080fd5b82356001600160401b038111156125a957600080fd5b6125b5858286016122ee565b9250506125c46020840161211b565b90509250929050565b600080604083850312156125e057600080fd5b8235915060208301356001600160401b0381111561257457600080fd5b6000806040838503121561261057600080fd5b6126198361211b565b91506020830135801515811461262e57600080fd5b809150509250929050565b6000806020838503121561264c57600080fd5b82356001600160401b038082111561266357600080fd5b818501915085601f83011261267757600080fd5b81358181111561268657600080fd5b8660208260051b850101111561269b57600080fd5b60209290920196919550909350505050565b600080604083850312156126c057600080fd5b6126c98361211b565b91506125c46020840161211b565b600080600080600060a086880312156126ef57600080fd5b6126f88661211b565b94506127066020870161211b565b9350604086013592506060860135915060808601356001600160401b0381111561272f57600080fd5b6123fd888289016122ee565b600181811c9082168061274f57607f821691505b6020821081141561277057634e487b7160e01b600052602260045260246000fd5b50919050565b60008151612788818560208601612194565b9290920192915050565b600080845481600182811c9150808316806127ae57607f831692505b60208084108214156127ce57634e487b7160e01b86526022600452602486fd5b8180156127e257600181146127f357612820565b60ff19861689528489019650612820565b60008b81526020902060005b868110156128185781548b8201529085019083016127ff565b505084890196505b50505050505061202d8185612776565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b19195b1959d85d1958d85b1b60a21b606082015260800190565b6020808252602c908201527f46756e6374696f6e206d7573742062652063616c6c6564207468726f7567682060408201526b6163746976652070726f787960a01b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006000198214156129575761295761292d565b5060010190565b60208082526023908201527f4f4b5842616467653a206e6f7420746865206f70657261746f7220616464726560408201526239b99760e91b606082015260800190565b60008235605e198336030181126129b757600080fd5b9190910192915050565b6000808335601e198436030181126129d857600080fd5b8301803591506001600160401b038211156129f257600080fd5b6020019150600581901b3603821315612a0a57600080fd5b9250929050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60008219821115612afb57612afb61292d565b500190565b604081526000612b1360408301856124ef565b828103602084015261202d81856124ef565b600060208284031215612b3757600080fd5b5051919050565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090612bb5908301866124ef565b8281036060840152612bc781866124ef565b90508281036080840152612bdb81856121c0565b98975050505050505050565b600060208284031215612bf957600080fd5b815161069681612161565b600060033d1115610a465760046000803e5060005160e01c90565b600060443d1015612c2d5790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715612c5c57505050505090565b8285019150815181811115612c745750505050505090565b843d8701016020828501011115612c8e5750505050505090565b612c9d6020828601018761222e565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090612d2a908301846121c0565b979650505050505050565b600082516129b781846020870161219456fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a264697066735822122023572d3c991ca1936cc711616f70927c46933e2824fe2b5f8b41f1c1a6e9bb0f64736f6c634300080c0033
Deployed Bytecode Sourcemap
71976:2297:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28759:230;;;;;;;;;;-1:-1:-1;28759:230:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;28759:230:0;;;;;;;;27738:354;;;;;;;;;;-1:-1:-1;27738:354:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;27738:354:0;1019:187:1;74187:83:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;61916:351::-;;;;;;;;;;-1:-1:-1;61916:351:0;;;;;:::i;:::-;;:::i;30703:439::-;;;;;;;;;;-1:-1:-1;30703:439:0;;;;;:::i;:::-;;:::i;:::-;;66550:200;;;;;;;;;;-1:-1:-1;66550:200:0;;;;;:::i;:::-;;:::i;29155:524::-;;;;;;;;;;-1:-1:-1;29155:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;67009:225::-;;;;;;:::i;:::-;;:::i;66228:133::-;;;;;;;;;;;;;:::i;72135:23::-;;;;;;;;;;-1:-1:-1;72135:23:0;;;;-1:-1:-1;;;;;72135:23:0;;;;;;-1:-1:-1;;;;;7835:32:1;;;7817:51;;7805:2;7790:18;72135:23:0;7671:203:1;70314:103:0;;;;;;;;;;;;;:::i;72611:339::-;;;;;;;;;;-1:-1:-1;72611:339:0;;;;;:::i;:::-;;:::i;73338:147::-;;;;;;;;;;-1:-1:-1;73338:147:0;;;;;:::i;:::-;;:::i;69666:87::-;;;;;;;;;;-1:-1:-1;69739:6:0;;-1:-1:-1;;;;;69739:6:0;69666:87;;29752:155;;;;;;;;;;-1:-1:-1;29752:155:0;;;;;:::i;:::-;;:::i;74072:107::-;;;;;;;;;;;;;:::i;73071:142::-;;;;;;;;;;-1:-1:-1;73071:142:0;;;;;:::i;:::-;;:::i;73493:225::-;;;;;;;;;;-1:-1:-1;73493:225:0;;;;;:::i;:::-;;:::i;73726:221::-;;;;;;;;;;-1:-1:-1;73726:221:0;;;;;:::i;:::-;;:::i;29979:168::-;;;;;;;;;;-1:-1:-1;29979:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;30102:27:0;;;30078:4;30102:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;29979:168;30219:407;;;;;;;;;;-1:-1:-1;30219:407:0;;;;;:::i;:::-;;:::i;70572:201::-;;;;;;;;;;-1:-1:-1;70572:201:0;;;;;:::i;:::-;;:::i;28759:230::-;28845:7;-1:-1:-1;;;;;28873:21:0;;28865:76;;;;-1:-1:-1;;;28865:76:0;;10756:2:1;28865:76:0;;;10738:21:1;10795:2;10775:18;;;10768:30;10834:34;10814:18;;;10807:62;-1:-1:-1;;;10885:18:1;;;10878:40;10935:19;;28865:76:0;;;;;;;;;-1:-1:-1;28959:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;28959:22:0;;;;;;;;;;;;28759:230::o;27738:354::-;27862:4;-1:-1:-1;;;;;;27899:52:0;;-1:-1:-1;;;27899:52:0;;:132;;-1:-1:-1;;;;;;;27968:63:0;;-1:-1:-1;;;27968:63:0;27899:132;:185;;;-1:-1:-1;;;;;;;;;;20417:51:0;;;28048:36;27879:205;27738:354;-1:-1:-1;;27738:354:0:o;74187:83::-;74224:13;74257:5;74250:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74187:83;:::o;61916:351::-;62010:22;62035:19;;;:10;:19;;;;;62010:44;;61984:13;;62010:22;62035:19;62010:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62190:1;62171:8;62165:22;:26;:94;;62241:18;62251:7;62241:9;:18::i;:::-;62165:94;;;62218:8;62228;62201:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62165:94;62158:101;61916:351;-1:-1:-1;;;61916:351:0:o;30703:439::-;-1:-1:-1;;;;;30936:20:0;;21877:10;30936:20;;:60;;-1:-1:-1;30960:36:0;30977:4;21877:10;29979:168;:::i;30960:36::-;30914:157;;;;-1:-1:-1;;;30914:157:0;;;;;;;:::i;:::-;31082:52;31105:4;31111:2;31115:3;31120:7;31129:4;31082:22;:52::i;:::-;30703:439;;;;;:::o;66550:200::-;65087:4;-1:-1:-1;;;;;65096:6:0;65079:23;;;65071:80;;;;-1:-1:-1;;;65071:80:0;;;;;;;:::i;:::-;65194:6;-1:-1:-1;;;;;65170:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;65170:30:0;;65162:87;;;;-1:-1:-1;;;65162:87:0;;;;;;;:::i;:::-;66634:36:::1;66652:17;66634;:36::i;:::-;66722:12;::::0;;66732:1:::1;66722:12:::0;;;::::1;::::0;::::1;::::0;;;66681:61:::1;::::0;66703:17;;66722:12;66681:21:::1;:61::i;:::-;66550:200:::0;:::o;29155:524::-;29311:16;29372:3;:10;29353:8;:15;:29;29345:83;;;;-1:-1:-1;;;29345:83:0;;14289:2:1;29345:83:0;;;14271:21:1;14328:2;14308:18;;;14301:30;14367:34;14347:18;;;14340:62;-1:-1:-1;;;14418:18:1;;;14411:39;14467:19;;29345:83:0;14087:405:1;29345:83:0;29441:30;29488:8;:15;-1:-1:-1;;;;;29474:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29474:30:0;;29441:63;;29522:9;29517:122;29541:8;:15;29537:1;:19;29517:122;;;29597:30;29607:8;29616:1;29607:11;;;;;;;;:::i;:::-;;;;;;;29620:3;29624:1;29620:6;;;;;;;;:::i;:::-;;;;;;;29597:9;:30::i;:::-;29578:13;29592:1;29578:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;29558:3;;;:::i;:::-;;;29517:122;;;-1:-1:-1;29658:13:0;29155:524;-1:-1:-1;;;29155:524:0:o;67009:225::-;65087:4;-1:-1:-1;;;;;65096:6:0;65079:23;;;65071:80;;;;-1:-1:-1;;;65071:80:0;;;;;;;:::i;:::-;65194:6;-1:-1:-1;;;;;65170:30:0;:20;:18;:20::i;:::-;-1:-1:-1;;;;;65170:30:0;;65162:87;;;;-1:-1:-1;;;65162:87:0;;;;;;;:::i;:::-;67127:36:::1;67145:17;67127;:36::i;:::-;67174:52;67196:17;67215:4;67221;67174:21;:52::i;:::-;67009:225:::0;;:::o;66228:133::-;66306:7;65532:4;-1:-1:-1;;;;;65541:6:0;65524:23;;65516:92;;;;-1:-1:-1;;;65516:92:0;;15103:2:1;65516:92:0;;;15085:21:1;15142:2;15122:18;;;15115:30;15181:34;15161:18;;;15154:62;15252:26;15232:18;;;15225:54;15296:19;;65516:92:0;14901:420:1;65516:92:0;-1:-1:-1;;;;;;;;;;;;65619:1:0::1;66228:133:::0;:::o;70314:103::-;69552:13;:11;:13::i;:::-;70379:30:::1;70406:1;70379:18;:30::i;:::-;70314:103::o:0;72611:339::-;11039:19;11062:13;;;;;;11061:14;;11109:34;;;;-1:-1:-1;11127:12:0;;11142:1;11127:12;;;;:16;11109:34;11108:108;;;-1:-1:-1;11188:4:0;1654:19;:23;;;11149:66;;-1:-1:-1;11198:12:0;;;;;:17;11149:66;11086:204;;;;-1:-1:-1;;;11086:204:0;;15528:2:1;11086:204:0;;;15510:21:1;15567:2;15547:18;;;15540:30;15606:34;15586:18;;;15579:62;-1:-1:-1;;;15657:18:1;;;15650:44;15711:19;;11086:204:0;15326:410:1;11086:204:0;11301:12;:16;;-1:-1:-1;;11301:16:0;11316:1;11301:16;;;11328:67;;;;11363:13;:20;;-1:-1:-1;;11363:20:0;;;;;11328:67;72726:18:::1;;;;;;;;;;;;::::0;:14:::1;:18::i;:::-;72755:26;:24;:26::i;:::-;72792:16;:14;:16::i;:::-;72819:24;:22;:24::i;:::-;72856:13:::0;;::::1;::::0;:5:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;72880:8:0::1;:22:::0;;-1:-1:-1;;;;;;72880:22:0::1;-1:-1:-1::0;;;;;72880:22:0;::::1;::::0;;::::1;::::0;;;72918:24:::1;::::0;7817:51:1;;;72918:24:0::1;::::0;7805:2:1;7790:18;72918:24:0::1;;;;;;;11421:14:::0;11417:102;;;11468:5;11452:21;;-1:-1:-1;;11452:21:0;;;11493:14;;-1:-1:-1;15893:36:1;;11493:14:0;;15881:2:1;15866:18;11493:14:0;;;;;;;11417:102;11028:498;72611:339;;:::o;73338:147::-;72411:8;;-1:-1:-1;;;;;72411:8:0;72397:10;:22;72389:70;;;;-1:-1:-1;;;72389:70:0;;;;;;;:::i;:::-;73451:26:::1;73459:7;73468:8;73451:7;:26::i;29752:155::-:0;29847:52;21877:10;29880:8;29890;29847:18;:52::i;74072:107::-;74124:7;74151:20;:18;:20::i;:::-;74144:27;;74072:107;:::o;73071:142::-;69552:13;:11;:13::i;:::-;73143:8:::1;:22:::0;;-1:-1:-1;;;;;;73143:22:0::1;-1:-1:-1::0;;;;;73143:22:0;::::1;::::0;;::::1;::::0;;;73181:24:::1;::::0;7817:51:1;;;73181:24:0::1;::::0;7805:2:1;7790:18;73181:24:0::1;;;;;;;73071:142:::0;:::o;73493:225::-;72411:8;;-1:-1:-1;;;;;72411:8:0;72397:10;:22;72389:70;;;;-1:-1:-1;;;72389:70:0;;;;;;;:::i;:::-;73582:9:::1;73577:134;73597:16:::0;;::::1;73577:134;;;73635:64;73646:5;;73652:1;73646:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;73664:5;;73670:1;73664:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:12;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;73635:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;73678:5:0;;-1:-1:-1;73678:5:0;;-1:-1:-1;73684:1:0;;-1:-1:-1;73678:8:0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;73635:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;73635:64:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;-1:-1:-1;73635:10:0::1;::::0;-1:-1:-1;;73635:64:0:i:1;:::-;73615:3:::0;::::1;::::0;::::1;:::i;:::-;;;;73577:134;;73726:221:::0;72411:8;;-1:-1:-1;;;;;72411:8:0;72397:10;:22;72389:70;;;;-1:-1:-1;;;72389:70:0;;;;;;;:::i;:::-;73815:9:::1;73810:130;73830:16:::0;;::::1;73810:130;;;73868:60;73879:5;;73885:1;73879:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;73897:5;;73903:1;73897:8;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:12;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;73868:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;73911:5:0;;-1:-1:-1;73911:5:0;;-1:-1:-1;73917:1:0;;-1:-1:-1;73911:8:0;;::::1;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;:16;::::0;::::1;::::0;::::1;::::0;::::1;:::i;:::-;73868:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;73868:10:0::1;::::0;-1:-1:-1;;;73868:60:0:i:1;:::-;73848:3:::0;::::1;::::0;::::1;:::i;:::-;;;;73810:130;;30219:407:::0;-1:-1:-1;;;;;30427:20:0;;21877:10;30427:20;;:60;;-1:-1:-1;30451:36:0;30468:4;21877:10;29979:168;:::i;30451:36::-;30405:157;;;;-1:-1:-1;;;30405:157:0;;;;;;;:::i;:::-;30573:45;30591:4;30597:2;30601;30605:6;30613:4;30573:17;:45::i;70572:201::-;69552:13;:11;:13::i;:::-;-1:-1:-1;;;;;70661:22:0;::::1;70653:73;;;::::0;-1:-1:-1;;;70653:73:0;;17431:2:1;70653:73:0::1;::::0;::::1;17413:21:1::0;17470:2;17450:18;;;17443:30;17509:34;17489:18;;;17482:62;-1:-1:-1;;;17560:18:1;;;17553:36;17606:19;;70653:73:0::1;17229:402:1::0;70653:73:0::1;70737:28;70756:8;70737:18;:28::i;28503:105::-:0;28563:13;28596:4;28589:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28503:105;;;:::o;32938:1146::-;33165:7;:14;33151:3;:10;:28;33143:81;;;;-1:-1:-1;;;33143:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33243:16:0;;33235:66;;;;-1:-1:-1;;;33235:66:0;;;;;;;:::i;:::-;21877:10;33314:16;33431:421;33455:3;:10;33451:1;:14;33431:421;;;33487:10;33500:3;33504:1;33500:6;;;;;;;;:::i;:::-;;;;;;;33487:19;;33521:14;33538:7;33546:1;33538:10;;;;;;;;:::i;:::-;;;;;;;;;;;;33565:19;33587:13;;;:9;:13;;;;;;-1:-1:-1;;;;;33587:19:0;;;;;;;;;;;;33538:10;;-1:-1:-1;33629:21:0;;;;33621:76;;;;-1:-1:-1;;;33621:76:0;;;;;;;:::i;:::-;33741:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;33741:19:0;;;;;;;;;;33763:20;;;33741:42;;33813:17;;;;;;;:27;;33763:20;;33741:13;33813:27;;33763:20;;33813:27;:::i;:::-;;;;;;;;33472:380;;;33467:3;;;;:::i;:::-;;;33431:421;;;;33899:2;-1:-1:-1;;;;;33869:47:0;33893:4;-1:-1:-1;;;;;33869:47:0;33883:8;-1:-1:-1;;;;;33869:47:0;;33903:3;33908:7;33869:47;;;;;;;:::i;:::-;;;;;;;;34001:75;34037:8;34047:4;34053:2;34057:3;34062:7;34071:4;34001:35;:75::i;:::-;33132:952;32938:1146;;;;;:::o;53606:153::-;-1:-1:-1;;;;;;;;;;;53686:65:0;-1:-1:-1;;;;;53686:65:0;;53606:153::o;72487:116::-;69552:13;:11;:13::i;55024:992::-;52977:66;55478:59;;;55474:535;;;55554:37;55573:17;55554:18;:37::i;55474:535::-;55657:17;-1:-1:-1;;;;;55628:61:0;;:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55628:63:0;;;;;;;;-1:-1:-1;;55628:63:0;;;;;;;;;;;;:::i;:::-;;;55624:306;;55858:56;;-1:-1:-1;;;55858:56:0;;19856:2:1;55858:56:0;;;19838:21:1;19895:2;19875:18;;;19868:30;19934:34;19914:18;;;19907:62;-1:-1:-1;;;19985:18:1;;;19978:44;20039:19;;55858:56:0;19654:410:1;55624:306:0;-1:-1:-1;;;;;;;;;;;55742:28:0;;55734:82;;;;-1:-1:-1;;;55734:82:0;;20271:2:1;55734:82:0;;;20253:21:1;20310:2;20290:18;;;20283:30;20349:34;20329:18;;;20322:62;-1:-1:-1;;;20400:18:1;;;20393:39;20449:19;;55734:82:0;20069:405:1;55734:82:0;55692:140;55944:53;55962:17;55981:4;55987:9;55944:17;:53::i;69831:132::-;69739:6;;-1:-1:-1;;;;;69739:6:0;21877:10;69895:23;69887:68;;;;-1:-1:-1;;;69887:68:0;;20681:2:1;69887:68:0;;;20663:21:1;;;20700:18;;;20693:30;20759:34;20739:18;;;20732:62;20811:18;;69887:68:0;20479:356:1;70933:191:0;71026:6;;;-1:-1:-1;;;;;71043:17:0;;;-1:-1:-1;;;;;;71043:17:0;;;;;;;71076:40;;71026:6;;;71043:17;71026:6;;71076:40;;71007:16;;71076:40;70996:128;70933:191;:::o;27427:119::-;12880:13;;;;;;;12872:69;;;;-1:-1:-1;;;12872:69:0;;;;;;;:::i;:::-;27508:30:::1;27533:4;27508:24;:30::i;60745:117::-:0;12880:13;;;;;;;12872:69;;;;-1:-1:-1;;;12872:69:0;;;;;;;:::i;:::-;60818:36:::1;:34;:36::i;69209:97::-:0;12880:13;;;;;;;12872:69;;;;-1:-1:-1;;;12872:69:0;;;;;;;:::i;:::-;69272:26:::1;:24;:26::i;64224:68::-:0;12880:13;;;;;;;12872:69;;;;-1:-1:-1;;;12872:69:0;;;;;;;:::i;62352:166::-;62438:19;;;;:10;:19;;;;;;;;:30;;;;;;;;:::i;:::-;;62502:7;62484:26;62488:12;62492:7;62488:3;:12::i;:::-;62484:26;;;;;;:::i;:::-;;;;;;;;62352:166;;:::o;39815:331::-;39970:8;-1:-1:-1;;;;;39961:17:0;:5;-1:-1:-1;;;;;39961:17:0;;;39953:71;;;;-1:-1:-1;;;39953:71:0;;21454:2:1;39953:71:0;;;21436:21:1;21493:2;21473:18;;;21466:30;21532:34;21512:18;;;21505:62;-1:-1:-1;;;21583:18:1;;;21576:39;21632:19;;39953:71:0;21252:405:1;39953:71:0;-1:-1:-1;;;;;40035:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;40035:46:0;;;;;;;;;;40097:41;;1159::1;;;40097::0;;1132:18:1;40097:41:0;;;;;;;39815:331;;;:::o;36534:813::-;-1:-1:-1;;;;;36712:16:0;;36704:62;;;;-1:-1:-1;;;36704:62:0;;21864:2:1;36704:62:0;;;21846:21:1;21903:2;21883:18;;;21876:30;21942:34;21922:18;;;21915:62;-1:-1:-1;;;21993:18:1;;;21986:31;22034:19;;36704:62:0;21662:397:1;36704:62:0;36799:7;:14;36785:3;:10;:28;36777:81;;;;-1:-1:-1;;;36777:81:0;;;;;;;:::i;:::-;21877:10;36871:16;36994:103;37018:3;:10;37014:1;:14;36994:103;;;37075:7;37083:1;37075:10;;;;;;;;:::i;:::-;;;;;;;37050:9;:17;37060:3;37064:1;37060:6;;;;;;;;:::i;:::-;;;;;;;37050:17;;;;;;;;;;;:21;37068:2;-1:-1:-1;;;;;37050:21:0;-1:-1:-1;;;;;37050:21:0;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;37030:3:0;;-1:-1:-1;37030:3:0;;;:::i;:::-;;;;36994:103;;;;37150:2;-1:-1:-1;;;;;37114:53:0;37146:1;-1:-1:-1;;;;;37114:53:0;37128:8;-1:-1:-1;;;;;37114:53:0;;37154:3;37159:7;37114:53;;;;;;;:::i;:::-;;;;;;;;37258:81;37294:8;37312:1;37316:2;37320:3;37325:7;37334:4;37258:35;:81::i;38703:969::-;-1:-1:-1;;;;;38855:18:0;;38847:66;;;;-1:-1:-1;;;38847:66:0;;22266:2:1;38847:66:0;;;22248:21:1;22305:2;22285:18;;;22278:30;22344:34;22324:18;;;22317:62;-1:-1:-1;;;22395:18:1;;;22388:33;22438:19;;38847:66:0;22064:399:1;38847:66:0;38946:7;:14;38932:3;:10;:28;38924:81;;;;-1:-1:-1;;;38924:81:0;;;;;;;:::i;:::-;39062:66;;;;;;;;;39018:16;39062:66;;;;21877:10;;39141:373;39165:3;:10;39161:1;:14;39141:373;;;39197:10;39210:3;39214:1;39210:6;;;;;;;;:::i;:::-;;;;;;;39197:19;;39231:14;39248:7;39256:1;39248:10;;;;;;;;:::i;:::-;;;;;;;;;;;;39275:19;39297:13;;;:9;:13;;;;;;-1:-1:-1;;;;;39297:19:0;;;;;;;;;;;;39248:10;;-1:-1:-1;39339:21:0;;;;39331:70;;;;-1:-1:-1;;;39331:70:0;;22670:2:1;39331:70:0;;;22652:21:1;22709:2;22689:18;;;22682:30;22748:34;22728:18;;;22721:62;-1:-1:-1;;;22799:18:1;;;22792:34;22843:19;;39331:70:0;22468:400:1;39331:70:0;39445:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;39445:19:0;;;;;;;;;;39467:20;;39445:42;;39177:3;;;;:::i;:::-;;;;39141:373;;;;39569:1;-1:-1:-1;;;;;39531:55:0;39555:4;-1:-1:-1;;;;;39531:55:0;39545:8;-1:-1:-1;;;;;39531:55:0;;39573:3;39578:7;39531:55;;;;;;;:::i;:::-;;;;;;;;39599:65;;;;;;;;;39643:1;39599:65;;;38836:836;38703:969;;;:::o;31606:974::-;-1:-1:-1;;;;;31794:16:0;;31786:66;;;;-1:-1:-1;;;31786:66:0;;;;;;;:::i;:::-;21877:10;31865:16;31930:21;31948:2;31930:17;:21::i;:::-;31907:44;;31962:24;31989:25;32007:6;31989:17;:25::i;:::-;31962:52;;32100:19;32122:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32122:19:0;;;;;;;;;;32160:21;;;;32152:76;;;;-1:-1:-1;;;32152:76:0;;;;;;;:::i;:::-;32264:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;32264:19:0;;;;;;;;;;32286:20;;;32264:42;;32328:17;;;;;;;:27;;32286:20;;32264:13;32328:27;;32286:20;;32328:27;:::i;:::-;;;;-1:-1:-1;;32373:46:0;;;23047:25:1;;;23103:2;23088:18;;23081:34;;;-1:-1:-1;;;;;32373:46:0;;;;;;;;;;;;;;23020:18:1;32373:46:0;;;;;;;32504:68;32535:8;32545:4;32551:2;32555;32559:6;32567:4;32504:30;:68::i;:::-;31775:805;;;;31606:974;;;;;:::o;43282:835::-;-1:-1:-1;;;;;43522:13:0;;1654:19;:23;43518:592;;43558:90;;-1:-1:-1;;;43558:90:0;;-1:-1:-1;;;;;43558:54:0;;;;;:90;;43613:8;;43623:4;;43629:3;;43634:7;;43643:4;;43558:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43558:90:0;;;;;;;;-1:-1:-1;;43558:90:0;;;;;;;;;;;;:::i;:::-;;;43554:545;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;43972:6;43965:14;;-1:-1:-1;;;43965:14:0;;;;;;;;:::i;43554:545::-;;;44021:62;;-1:-1:-1;;;44021:62:0;;25285:2:1;44021:62:0;;;25267:21:1;25324:2;25304:18;;;25297:30;25363:34;25343:18;;;25336:62;-1:-1:-1;;;25414:18:1;;;25407:50;25474:19;;44021:62:0;25083:416:1;43554:545:0;-1:-1:-1;;;;;;43730:71:0;;-1:-1:-1;;;43730:71:0;43726:170;;43826:50;;-1:-1:-1;;;43826:50:0;;;;;;;:::i;43726:170::-;43649:262;43282:835;;;;;;:::o;53855:284::-;-1:-1:-1;;;;;1654:19:0;;;53929:106;;;;-1:-1:-1;;;53929:106:0;;26115:2:1;53929:106:0;;;26097:21:1;26154:2;26134:18;;;26127:30;26193:34;26173:18;;;26166:62;-1:-1:-1;;;26244:18:1;;;26237:43;26297:19;;53929:106:0;25913:409:1;53929:106:0;-1:-1:-1;;;;;;;;;;;54046:85:0;;-1:-1:-1;;;;;;54046:85:0;-1:-1:-1;;;;;54046:85:0;;;;;;;;;;53855:284::o;54548:297::-;54691:29;54702:17;54691:10;:29::i;:::-;54749:1;54735:4;:11;:15;:28;;;;54754:9;54735:28;54731:107;;;54780:46;54802:17;54821:4;54780:21;:46::i;27554:112::-;12880:13;;;;;;;12872:69;;;;-1:-1:-1;;;12872:69:0;;;;;;;:::i;:::-;27645:13:::1;27653:4;27645:7;:13::i;60870:104::-:0;12880:13;;;;;;;12872:69;;;;-1:-1:-1;;;12872:69:0;;;;;;;:::i;:::-;60953:13:::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;60953:13:0;;;;::::1;::::0;:8:::1;::::0;:13:::1;:::i;69314:113::-:0;12880:13;;;;;;;12872:69;;;;-1:-1:-1;;;12872:69:0;;;;;;;:::i;:::-;69387:32:::1;21877:10:::0;69387:18:::1;:32::i;44125:198::-:0;44245:16;;;44259:1;44245:16;;;;;;;;;44191;;44220:22;;44245:16;;;;;;;;;;;;-1:-1:-1;44245:16:0;44220:41;;44283:7;44272:5;44278:1;44272:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;44310:5;44125:198;-1:-1:-1;;44125:198:0:o;42508:766::-;-1:-1:-1;;;;;42723:13:0;;1654:19;:23;42719:548;;42759:83;;-1:-1:-1;;;42759:83:0;;-1:-1:-1;;;;;42759:49:0;;;;;:83;;42809:8;;42819:4;;42825:2;;42829:6;;42837:4;;42759:83;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42759:83:0;;;;;;;;-1:-1:-1;;42759:83:0;;;;;;;;;;;;:::i;:::-;;;42755:501;;;;:::i;:::-;-1:-1:-1;;;;;;42892:66:0;;-1:-1:-1;;;42892:66:0;42888:165;;42983:50;;-1:-1:-1;;;42983:50:0;;;;;;;:::i;54252:155::-;54319:37;54338:17;54319:18;:37::i;:::-;54372:27;;-1:-1:-1;;;;;54372:27:0;;;;;;;;54252:155;:::o;59285:461::-;59368:12;-1:-1:-1;;;;;1654:19:0;;;59393:88;;;;-1:-1:-1;;;59393:88:0;;27106:2:1;59393:88:0;;;27088:21:1;27145:2;27125:18;;;27118:30;27184:34;27164:18;;;27157:62;-1:-1:-1;;;27235:18:1;;;27228:36;27281:19;;59393:88:0;26904:402:1;59393:88:0;59555:12;59569:23;59596:6;-1:-1:-1;;;;;59596:19:0;59616:4;59596:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59554:67;;;;59639:99;59675:7;59684:10;59639:99;;;;;;;;;;;;;;;;;:35;:99::i;:::-;59632:106;59285:461;-1:-1:-1;;;;;59285:461:0:o;34928:88::-;34995:13;;;;:4;;:13;;;;;:::i;6937:762::-;7087:12;7116:7;7112:580;;;-1:-1:-1;7147:10:0;7140:17;;7112:580;7261:17;;:21;7257:424;;7509:10;7503:17;7570:15;7557:10;7553:2;7549:19;7542:44;7257:424;7652:12;7645:20;;-1:-1:-1;;;7645:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;1211:258::-;1283:1;1293:113;1307:6;1304:1;1301:13;1293:113;;;1383:11;;;1377:18;1364:11;;;1357:39;1329:2;1322:10;1293:113;;;1424:6;1421:1;1418:13;1415:48;;;-1:-1:-1;;1459:1:1;1441:16;;1434:27;1211:258::o;1474:269::-;1527:3;1565:5;1559:12;1592:6;1587:3;1580:19;1608:63;1664:6;1657:4;1652:3;1648:14;1641:4;1634:5;1630:16;1608:63;:::i;:::-;1725:2;1704:15;-1:-1:-1;;1700:29:1;1691:39;;;;1732:4;1687:50;;1474:269;-1:-1:-1;;1474:269:1:o;1748:231::-;1897:2;1886:9;1879:21;1860:4;1917:56;1969:2;1958:9;1954:18;1946:6;1917:56;:::i;1984:180::-;2043:6;2096:2;2084:9;2075:7;2071:23;2067:32;2064:52;;;2112:1;2109;2102:12;2064:52;-1:-1:-1;2135:23:1;;1984:180;-1:-1:-1;1984:180:1:o;2169:127::-;2230:10;2225:3;2221:20;2218:1;2211:31;2261:4;2258:1;2251:15;2285:4;2282:1;2275:15;2301:249;2411:2;2392:13;;-1:-1:-1;;2388:27:1;2376:40;;-1:-1:-1;;;;;2431:34:1;;2467:22;;;2428:62;2425:88;;;2493:18;;:::i;:::-;2529:2;2522:22;-1:-1:-1;;2301:249:1:o;2555:183::-;2615:4;-1:-1:-1;;;;;2640:6:1;2637:30;2634:56;;;2670:18;;:::i;:::-;-1:-1:-1;2715:1:1;2711:14;2727:4;2707:25;;2555:183::o;2743:724::-;2797:5;2850:3;2843:4;2835:6;2831:17;2827:27;2817:55;;2868:1;2865;2858:12;2817:55;2904:6;2891:20;2930:4;2953:43;2993:2;2953:43;:::i;:::-;3025:2;3019:9;3037:31;3065:2;3057:6;3037:31;:::i;:::-;3103:18;;;3195:1;3191:10;;;;3179:23;;3175:32;;;3137:15;;;;-1:-1:-1;3219:15:1;;;3216:35;;;3247:1;3244;3237:12;3216:35;3283:2;3275:6;3271:15;3295:142;3311:6;3306:3;3303:15;3295:142;;;3377:17;;3365:30;;3415:12;;;;3328;;3295:142;;;-1:-1:-1;3455:6:1;2743:724;-1:-1:-1;;;;;;2743:724:1:o;3472:555::-;3514:5;3567:3;3560:4;3552:6;3548:17;3544:27;3534:55;;3585:1;3582;3575:12;3534:55;3621:6;3608:20;-1:-1:-1;;;;;3643:2:1;3640:26;3637:52;;;3669:18;;:::i;:::-;3718:2;3712:9;3730:67;3785:2;3766:13;;-1:-1:-1;;3762:27:1;3791:4;3758:38;3712:9;3730:67;:::i;:::-;3821:2;3813:6;3806:18;3867:3;3860:4;3855:2;3847:6;3843:15;3839:26;3836:35;3833:55;;;3884:1;3881;3874:12;3833:55;3948:2;3941:4;3933:6;3929:17;3922:4;3914:6;3910:17;3897:54;3995:1;3971:15;;;3988:4;3967:26;3960:37;;;;3975:6;3472:555;-1:-1:-1;;;3472:555:1:o;4032:943::-;4186:6;4194;4202;4210;4218;4271:3;4259:9;4250:7;4246:23;4242:33;4239:53;;;4288:1;4285;4278:12;4239:53;4311:29;4330:9;4311:29;:::i;:::-;4301:39;;4359:38;4393:2;4382:9;4378:18;4359:38;:::i;:::-;4349:48;;4448:2;4437:9;4433:18;4420:32;-1:-1:-1;;;;;4512:2:1;4504:6;4501:14;4498:34;;;4528:1;4525;4518:12;4498:34;4551:61;4604:7;4595:6;4584:9;4580:22;4551:61;:::i;:::-;4541:71;;4665:2;4654:9;4650:18;4637:32;4621:48;;4694:2;4684:8;4681:16;4678:36;;;4710:1;4707;4700:12;4678:36;4733:63;4788:7;4777:8;4766:9;4762:24;4733:63;:::i;:::-;4723:73;;4849:3;4838:9;4834:19;4821:33;4805:49;;4879:2;4869:8;4866:16;4863:36;;;4895:1;4892;4885:12;4863:36;;4918:51;4961:7;4950:8;4939:9;4935:24;4918:51;:::i;:::-;4908:61;;;4032:943;;;;;;;;:::o;4980:186::-;5039:6;5092:2;5080:9;5071:7;5067:23;5063:32;5060:52;;;5108:1;5105;5098:12;5060:52;5131:29;5150:9;5131:29;:::i;5171:1208::-;5289:6;5297;5350:2;5338:9;5329:7;5325:23;5321:32;5318:52;;;5366:1;5363;5356:12;5318:52;5406:9;5393:23;-1:-1:-1;;;;;5476:2:1;5468:6;5465:14;5462:34;;;5492:1;5489;5482:12;5462:34;5530:6;5519:9;5515:22;5505:32;;5575:7;5568:4;5564:2;5560:13;5556:27;5546:55;;5597:1;5594;5587:12;5546:55;5633:2;5620:16;5655:4;5678:43;5718:2;5678:43;:::i;:::-;5750:2;5744:9;5762:31;5790:2;5782:6;5762:31;:::i;:::-;5828:18;;;5916:1;5912:10;;;;5904:19;;5900:28;;;5862:15;;;;-1:-1:-1;5940:19:1;;;5937:39;;;5972:1;5969;5962:12;5937:39;5996:11;;;;6016:148;6032:6;6027:3;6024:15;6016:148;;;6098:23;6117:3;6098:23;:::i;:::-;6086:36;;6049:12;;;;6142;;;;6016:148;;;6183:6;-1:-1:-1;;6227:18:1;;6214:32;;-1:-1:-1;;6258:16:1;;;6255:36;;;6287:1;6284;6277:12;6255:36;;6310:63;6365:7;6354:8;6343:9;6339:24;6310:63;:::i;:::-;6300:73;;;5171:1208;;;;;:::o;6384:435::-;6437:3;6475:5;6469:12;6502:6;6497:3;6490:19;6528:4;6557:2;6552:3;6548:12;6541:19;;6594:2;6587:5;6583:14;6615:1;6625:169;6639:6;6636:1;6633:13;6625:169;;;6700:13;;6688:26;;6734:12;;;;6769:15;;;;6661:1;6654:9;6625:169;;;-1:-1:-1;6810:3:1;;6384:435;-1:-1:-1;;;;;6384:435:1:o;6824:261::-;7003:2;6992:9;6985:21;6966:4;7023:56;7075:2;7064:9;7060:18;7052:6;7023:56;:::i;7090:394::-;7167:6;7175;7228:2;7216:9;7207:7;7203:23;7199:32;7196:52;;;7244:1;7241;7234:12;7196:52;7267:29;7286:9;7267:29;:::i;:::-;7257:39;;7347:2;7336:9;7332:18;7319:32;-1:-1:-1;;;;;7366:6:1;7363:30;7360:50;;;7406:1;7403;7396:12;7360:50;7429:49;7470:7;7461:6;7450:9;7446:22;7429:49;:::i;7879:395::-;7957:6;7965;8018:2;8006:9;7997:7;7993:23;7989:32;7986:52;;;8034:1;8031;8024:12;7986:52;8074:9;8061:23;-1:-1:-1;;;;;8099:6:1;8096:30;8093:50;;;8139:1;8136;8129:12;8093:50;8162:49;8203:7;8194:6;8183:9;8179:22;8162:49;:::i;:::-;8152:59;;;8230:38;8264:2;8253:9;8249:18;8230:38;:::i;:::-;8220:48;;7879:395;;;;;:::o;8279:389::-;8357:6;8365;8418:2;8406:9;8397:7;8393:23;8389:32;8386:52;;;8434:1;8431;8424:12;8386:52;8470:9;8457:23;8447:33;;8531:2;8520:9;8516:18;8503:32;-1:-1:-1;;;;;8550:6:1;8547:30;8544:50;;;8590:1;8587;8580:12;8673:347;8738:6;8746;8799:2;8787:9;8778:7;8774:23;8770:32;8767:52;;;8815:1;8812;8805:12;8767:52;8838:29;8857:9;8838:29;:::i;:::-;8828:39;;8917:2;8906:9;8902:18;8889:32;8964:5;8957:13;8950:21;8943:5;8940:32;8930:60;;8986:1;8983;8976:12;8930:60;9009:5;8999:15;;;8673:347;;;;;:::o;9025:648::-;9144:6;9152;9205:2;9193:9;9184:7;9180:23;9176:32;9173:52;;;9221:1;9218;9211:12;9173:52;9261:9;9248:23;-1:-1:-1;;;;;9331:2:1;9323:6;9320:14;9317:34;;;9347:1;9344;9337:12;9317:34;9385:6;9374:9;9370:22;9360:32;;9430:7;9423:4;9419:2;9415:13;9411:27;9401:55;;9452:1;9449;9442:12;9401:55;9492:2;9479:16;9518:2;9510:6;9507:14;9504:34;;;9534:1;9531;9524:12;9504:34;9587:7;9582:2;9572:6;9569:1;9565:14;9561:2;9557:23;9553:32;9550:45;9547:65;;;9608:1;9605;9598:12;9547:65;9639:2;9631:11;;;;;9661:6;;-1:-1:-1;9025:648:1;;-1:-1:-1;;;;9025:648:1:o;9678:260::-;9746:6;9754;9807:2;9795:9;9786:7;9782:23;9778:32;9775:52;;;9823:1;9820;9813:12;9775:52;9846:29;9865:9;9846:29;:::i;:::-;9836:39;;9894:38;9928:2;9917:9;9913:18;9894:38;:::i;9943:606::-;10047:6;10055;10063;10071;10079;10132:3;10120:9;10111:7;10107:23;10103:33;10100:53;;;10149:1;10146;10139:12;10100:53;10172:29;10191:9;10172:29;:::i;:::-;10162:39;;10220:38;10254:2;10243:9;10239:18;10220:38;:::i;:::-;10210:48;;10305:2;10294:9;10290:18;10277:32;10267:42;;10356:2;10345:9;10341:18;10328:32;10318:42;;10411:3;10400:9;10396:19;10383:33;-1:-1:-1;;;;;10431:6:1;10428:30;10425:50;;;10471:1;10468;10461:12;10425:50;10494:49;10535:7;10526:6;10515:9;10511:22;10494:49;:::i;10965:380::-;11044:1;11040:12;;;;11087;;;11108:61;;11162:4;11154:6;11150:17;11140:27;;11108:61;11215:2;11207:6;11204:14;11184:18;11181:38;11178:161;;;11261:10;11256:3;11252:20;11249:1;11242:31;11296:4;11293:1;11286:15;11324:4;11321:1;11314:15;11178:161;;10965:380;;;:::o;11476:185::-;11518:3;11556:5;11550:12;11571:52;11616:6;11611:3;11604:4;11597:5;11593:16;11571:52;:::i;:::-;11639:16;;;;;11476:185;-1:-1:-1;;11476:185:1:o;11666:1174::-;11842:3;11871:1;11904:6;11898:13;11934:3;11956:1;11984:9;11980:2;11976:18;11966:28;;12044:2;12033:9;12029:18;12066;12056:61;;12110:4;12102:6;12098:17;12088:27;;12056:61;12136:2;12184;12176:6;12173:14;12153:18;12150:38;12147:165;;;-1:-1:-1;;;12211:33:1;;12267:4;12264:1;12257:15;12297:4;12218:3;12285:17;12147:165;12328:18;12355:104;;;;12473:1;12468:320;;;;12321:467;;12355:104;-1:-1:-1;;12388:24:1;;12376:37;;12433:16;;;;-1:-1:-1;12355:104:1;;12468:320;11423:1;11416:14;;;11460:4;11447:18;;12563:1;12577:165;12591:6;12588:1;12585:13;12577:165;;;12669:14;;12656:11;;;12649:35;12712:16;;;;12606:10;;12577:165;;;12581:3;;12771:6;12766:3;12762:16;12755:23;;12321:467;;;;;;;12804:30;12830:3;12822:6;12804:30;:::i;12845:411::-;13047:2;13029:21;;;13086:2;13066:18;;;13059:30;13125:34;13120:2;13105:18;;13098:62;-1:-1:-1;;;13191:2:1;13176:18;;13169:45;13246:3;13231:19;;12845:411::o;13261:408::-;13463:2;13445:21;;;13502:2;13482:18;;;13475:30;13541:34;13536:2;13521:18;;13514:62;-1:-1:-1;;;13607:2:1;13592:18;;13585:42;13659:3;13644:19;;13261:408::o;13674:::-;13876:2;13858:21;;;13915:2;13895:18;;;13888:30;13954:34;13949:2;13934:18;;13927:62;-1:-1:-1;;;14020:2:1;14005:18;;13998:42;14072:3;14057:19;;13674:408::o;14497:127::-;14558:10;14553:3;14549:20;14546:1;14539:31;14589:4;14586:1;14579:15;14613:4;14610:1;14603:15;14629:127;14690:10;14685:3;14681:20;14678:1;14671:31;14721:4;14718:1;14711:15;14745:4;14742:1;14735:15;14761:135;14800:3;-1:-1:-1;;14821:17:1;;14818:43;;;14841:18;;:::i;:::-;-1:-1:-1;14888:1:1;14877:13;;14761:135::o;15940:399::-;16142:2;16124:21;;;16181:2;16161:18;;;16154:30;16220:34;16215:2;16200:18;;16193:62;-1:-1:-1;;;16286:2:1;16271:18;;16264:33;16329:3;16314:19;;15940:399::o;16344:330::-;16443:4;16501:11;16488:25;16595:2;16591:7;16580:8;16564:14;16560:29;16556:43;16536:18;16532:68;16522:96;;16614:1;16611;16604:12;16522:96;16635:33;;;;;16344:330;-1:-1:-1;;16344:330:1:o;16679:545::-;16772:4;16778:6;16838:11;16825:25;16932:2;16928:7;16917:8;16901:14;16897:29;16893:43;16873:18;16869:68;16859:96;;16951:1;16948;16941:12;16859:96;16978:33;;17030:20;;;-1:-1:-1;;;;;;17062:30:1;;17059:50;;;17105:1;17102;17095:12;17059:50;17138:4;17126:17;;-1:-1:-1;17189:1:1;17185:14;;;17169;17165:35;17155:46;;17152:66;;;17214:1;17211;17204:12;17152:66;16679:545;;;;;:::o;17636:404::-;17838:2;17820:21;;;17877:2;17857:18;;;17850:30;17916:34;17911:2;17896:18;;17889:62;-1:-1:-1;;;17982:2:1;17967:18;;17960:38;18030:3;18015:19;;17636:404::o;18045:401::-;18247:2;18229:21;;;18286:2;18266:18;;;18259:30;18325:34;18320:2;18305:18;;18298:62;-1:-1:-1;;;18391:2:1;18376:18;;18369:35;18436:3;18421:19;;18045:401::o;18451:406::-;18653:2;18635:21;;;18692:2;18672:18;;;18665:30;18731:34;18726:2;18711:18;;18704:62;-1:-1:-1;;;18797:2:1;18782:18;;18775:40;18847:3;18832:19;;18451:406::o;18862:128::-;18902:3;18933:1;18929:6;18926:1;18923:13;18920:39;;;18939:18;;:::i;:::-;-1:-1:-1;18975:9:1;;18862:128::o;18995:465::-;19252:2;19241:9;19234:21;19215:4;19278:56;19330:2;19319:9;19315:18;19307:6;19278:56;:::i;:::-;19382:9;19374:6;19370:22;19365:2;19354:9;19350:18;19343:50;19410:44;19447:6;19439;19410:44;:::i;19465:184::-;19535:6;19588:2;19576:9;19567:7;19563:23;19559:32;19556:52;;;19604:1;19601;19594:12;19556:52;-1:-1:-1;19627:16:1;;19465:184;-1:-1:-1;19465:184:1:o;20840:407::-;21042:2;21024:21;;;21081:2;21061:18;;;21054:30;21120:34;21115:2;21100:18;;21093:62;-1:-1:-1;;;21186:2:1;21171:18;;21164:41;21237:3;21222:19;;20840:407::o;23126:838::-;-1:-1:-1;;;;;23523:15:1;;;23505:34;;23575:15;;23570:2;23555:18;;23548:43;23485:3;23622:2;23607:18;;23600:31;;;23448:4;;23654:57;;23691:19;;23683:6;23654:57;:::i;:::-;23759:9;23751:6;23747:22;23742:2;23731:9;23727:18;23720:50;23793:44;23830:6;23822;23793:44;:::i;:::-;23779:58;;23886:9;23878:6;23874:22;23868:3;23857:9;23853:19;23846:51;23914:44;23951:6;23943;23914:44;:::i;:::-;23906:52;23126:838;-1:-1:-1;;;;;;;;23126:838:1:o;23969:249::-;24038:6;24091:2;24079:9;24070:7;24066:23;24062:32;24059:52;;;24107:1;24104;24097:12;24059:52;24139:9;24133:16;24158:30;24182:5;24158:30;:::i;24223:179::-;24258:3;24300:1;24282:16;24279:23;24276:120;;;24346:1;24343;24340;24325:23;-1:-1:-1;24383:1:1;24377:8;24372:3;24368:18;24223:179;:::o;24407:671::-;24446:3;24488:4;24470:16;24467:26;24464:39;;;24407:671;:::o;24464:39::-;24530:2;24524:9;-1:-1:-1;;24595:16:1;24591:25;;24588:1;24524:9;24567:50;24646:4;24640:11;24670:16;-1:-1:-1;;;;;24776:2:1;24769:4;24761:6;24757:17;24754:25;24749:2;24741:6;24738:14;24735:45;24732:58;;;24783:5;;;;;24407:671;:::o;24732:58::-;24820:6;24814:4;24810:17;24799:28;;24856:3;24850:10;24883:2;24875:6;24872:14;24869:27;;;24889:5;;;;;;24407:671;:::o;24869:27::-;24973:2;24954:16;24948:4;24944:27;24940:36;24933:4;24924:6;24919:3;24915:16;24911:27;24908:69;24905:82;;;24980:5;;;;;;24407:671;:::o;24905:82::-;24996:57;25047:4;25038:6;25030;25026:19;25022:30;25016:4;24996:57;:::i;:::-;-1:-1:-1;25069:3:1;;24407:671;-1:-1:-1;;;;;24407:671:1:o;25504:404::-;25706:2;25688:21;;;25745:2;25725:18;;;25718:30;25784:34;25779:2;25764:18;;25757:62;-1:-1:-1;;;25850:2:1;25835:18;;25828:38;25898:3;25883:19;;25504:404::o;26327:572::-;-1:-1:-1;;;;;26624:15:1;;;26606:34;;26676:15;;26671:2;26656:18;;26649:43;26723:2;26708:18;;26701:34;;;26766:2;26751:18;;26744:34;;;26586:3;26809;26794:19;;26787:32;;;26549:4;;26836:57;;26873:19;;26865:6;26836:57;:::i;:::-;26828:65;26327:572;-1:-1:-1;;;;;;;26327:572:1:o;27311:274::-;27440:3;27478:6;27472:13;27494:53;27540:6;27535:3;27528:4;27520:6;27516:17;27494:53;:::i
Swarm Source
ipfs://23572d3c991ca1936cc711616f70927c46933e2824fe2b5f8b41f1c1a6e9bb0f
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.